Intel Atom 主板上的 spidev Linux 驱动程序
spidev Linux driver on Intel Atom board
我正在 Linux 下在控创基于 Atom 的 SMARC-sXBTi 板上启动 SPI。
Kontron 提供了 Yocto BSP,但它不包含 SPI 驱动程序。
我用 SPI 支持重建了 Linux。我可以在 lspci 和 sysfs 中看到 SPI 控制器,SPI PCI 设备绑定到 pca2xx_spi_pci 驱动程序。
据我所知,这是一个不公开用户模式的平台驱动程序 API,我需要 spidev 才能通过 /dev/spidev 工作,但是当我 modeprobe spidev
我不看不到任何事情发生:没有文件添加到 /dev,dmesg 中没有任何内容。
我需要配置spidev吗? BSP 不包括设备树。 spidev 如何找到它的 PCI SPI 控制器并与其通信?
Do I need to configure spidev? The BSP does not include device tree. How can spidev find and talk to its PCI SPI controller?
在设备树不工作的时候,我使用了以下代码(基于 beagle 板的示例,您应该相应地修复您的板):
arch/arm/mach-omap2/board-omap3beagle.c:
static struct spi_board_info my_spi_board_info[] = {
...
{
.modalias = "spidev",
.max_speed_hz = 3000000, //48 Mbps
.bus_num = 3,
.chip_select = 1,
.mode = 0,
},
...
};
static void __init omap3_beagle_init(void)
{
...
spi_register_board_info(my_spi_board_info,
ARRAY_SIZE(my_spi_board_info));
...
}
如你所见,我指定 "bus_num" omap CPU 有几个 SPI,我还指定了 chipselect 和速度,之后我调用 spi_register_board_info
,并在重建内核和重新启动类似 /dev/spidev3.1
的内容出现。
首先为什么需要SPI设备节点暴露给用户space?
我可以想象两种可能:
- 您正在创建将使用 user-space 驱动程序
的物联网软件
- 您正在试验不同的设备(显然还没有内核 space 驱动程序)
无论如何:
根据 Mark Brown(内核中 SPI 子系统的维护者)的说法:
spidev should never appear directly in ACPI or DT since our ideas about the best way to control the hardware may change.
有关详细信息,请参阅完整 discussion。
尽管如此,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
)
})
}
}
}
由于您没有指出确切的规格,您可能需要做一些额外的工作。对于较旧的 Atoms,香草 Linux 内核缺少 propagate ACPI handle to the platform driver.
的补丁
我发现 Valley Island (Baytrail) BSP 为 Kontron SMARC 提供了比 Kontron BSP 更好的硬件支持。它带有访问 Atom 外围设备所需的 spidev 和其他驱动程序。
与问题没有直接关系(只是为了通知那些在 SXBTI SMARC 平台上开发的人):需要一些不属于此 BSP 的东西:以太网和 eMMC 闪存。前者可以通过在内核中启用 Intel IGB 驱动程序来添加,后者......我还在努力弄清楚。
我正在 Linux 下在控创基于 Atom 的 SMARC-sXBTi 板上启动 SPI。
Kontron 提供了 Yocto BSP,但它不包含 SPI 驱动程序。
我用 SPI 支持重建了 Linux。我可以在 lspci 和 sysfs 中看到 SPI 控制器,SPI PCI 设备绑定到 pca2xx_spi_pci 驱动程序。
据我所知,这是一个不公开用户模式的平台驱动程序 API,我需要 spidev 才能通过 /dev/spidev 工作,但是当我 modeprobe spidev
我不看不到任何事情发生:没有文件添加到 /dev,dmesg 中没有任何内容。
我需要配置spidev吗? BSP 不包括设备树。 spidev 如何找到它的 PCI SPI 控制器并与其通信?
Do I need to configure spidev? The BSP does not include device tree. How can spidev find and talk to its PCI SPI controller?
在设备树不工作的时候,我使用了以下代码(基于 beagle 板的示例,您应该相应地修复您的板):
arch/arm/mach-omap2/board-omap3beagle.c:
static struct spi_board_info my_spi_board_info[] = {
...
{
.modalias = "spidev",
.max_speed_hz = 3000000, //48 Mbps
.bus_num = 3,
.chip_select = 1,
.mode = 0,
},
...
};
static void __init omap3_beagle_init(void)
{
...
spi_register_board_info(my_spi_board_info,
ARRAY_SIZE(my_spi_board_info));
...
}
如你所见,我指定 "bus_num" omap CPU 有几个 SPI,我还指定了 chipselect 和速度,之后我调用 spi_register_board_info
,并在重建内核和重新启动类似 /dev/spidev3.1
的内容出现。
首先为什么需要SPI设备节点暴露给用户space?
我可以想象两种可能:
- 您正在创建将使用 user-space 驱动程序 的物联网软件
- 您正在试验不同的设备(显然还没有内核 space 驱动程序)
无论如何:
根据 Mark Brown(内核中 SPI 子系统的维护者)的说法:
spidev should never appear directly in ACPI or DT since our ideas about the best way to control the hardware may change.
有关详细信息,请参阅完整 discussion。
尽管如此,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
)
})
}
}
}
由于您没有指出确切的规格,您可能需要做一些额外的工作。对于较旧的 Atoms,香草 Linux 内核缺少 propagate ACPI handle to the platform driver.
的补丁我发现 Valley Island (Baytrail) BSP 为 Kontron SMARC 提供了比 Kontron BSP 更好的硬件支持。它带有访问 Atom 外围设备所需的 spidev 和其他驱动程序。
与问题没有直接关系(只是为了通知那些在 SXBTI SMARC 平台上开发的人):需要一些不属于此 BSP 的东西:以太网和 eMMC 闪存。前者可以通过在内核中启用 Intel IGB 驱动程序来添加,后者......我还在努力弄清楚。