首先,为什么需要将 SPI 设备节点暴露给用户空间?
我可以想象两种可能性:
- 您正在创建将使用用户空间驱动程序的物联网软件
- 您正在试验不同的设备(显然还没有内核空间驱动程序)
任何状况之下:
根据 Mark Brown(内核中 SPI 子系统的维护者):
spidev 不应该直接出现在 ACPI 或 DT 中,因为我们关于控制硬件的最佳方式的想法可能会改变。
有关详细信息,请参阅完整讨论。
尽管如此,Mark 在 ACPI 中应用了对特殊 SPI 节点的支持,以公开您可以使用的spidev
由于市面上现有板卡的固件几乎无法更改,因此您需要在 OS 中升级 ACPI 表。一些工程师目前正在研究一种机制,如何让这些东西对人们更容易。现在你可以尝试最新的 vanilla 内核,比如说 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,vanilla Linux 内核缺少一个补丁来将 ACPI 句柄传播到平台驱动程序。