まず、SPI デバイス ノードをユーザー空間に公開する必要があるのはなぜですか?
2つの可能性を想像できました:
- ユーザー空間ドライバーを使用する IoT ソフトウェアを作成している
- さまざまなデバイスを試しています(明らかにカーネルスペースドライバーはまだありません)
いかなる場合でも:
Mark Brown (カーネルの SPI サブシステムのメンテナー) によると:
ハードウェアを制御する最善の方法に関する私たちの考えは変わる可能性があるため、spidev は ACPI または DT に直接表示されるべきではありません。
詳細については、完全なディスカッションを参照してください。
それにもかかわらず、マークは ACPI の特別な SPI ノードのサポートを適用して、使用できるspidevを公開しました
市販されている既存のボードではファームウェアを変更することはほとんどないため、OS の ACPI テーブルをアップグレードする必要があります。一部のエンジニアは現在、この作業を人々にとってより簡単にするためのメカニズムに取り組んでいます。今のところ、最新のバニラ カーネルを試してみてください。この記事では v4.8-rc3 としましょう。抜粋して SPI デバイスを有効にします (これは単なる例です。使用しているハードウェアに合わせて調整する必要があります)。
/*
* Intel Joule
*
* This adds an SPI test device to the SPI host controller available on
* Intel Joule breakout #1 header:
*
* pin name pin number
* -----------------------------
* SPI_1_MISO_LS 2
* SPI_1_MOSI_LS 4
* SPI_1_FS2_LS 8
* SPI_1_CLK_LS 10
*
* In Linux you need to set CONFIG_SPI_SPIDEV=y (or m) to be able to use
* this device.
*/
DefinitionBlock ("spidev.aml", "SSDT", 5, "INTEL", "SPIDEV", 1)
{
External (_SB_.PCI0.SPI2, DeviceObj)
Scope (\_SB.PCI0.SPI2)
{
Device (TP0) {
Name (_HID, "SPT0001")
Name (_DDN, "SPI test device connected to CS2")
Name (_CRS, ResourceTemplate () {
SpiSerialBus (
2, // Chip select
PolarityLow, // Chip select is active low
FourWireMode, // Full duplex
8, // Bits per word is 8 (byte)
ControllerInitiated, // Don't care
1000000, // 1 MHz
ClockPolarityLow, // SPI mode 0
ClockPhaseFirst, // SPI mode 0
"\\_SB.PCI0.SPI2", // SPI host controller
0 // Must be 0
)
})
}
}
}
正確な仕様を示していないため、追加の作業が必要になる場合があります。古い Atom の場合、バニラ Linux カーネルには、ACPI ハンドルをプラットフォーム ドライバーに伝達するためのパッチが 1 つ欠けています。