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?

我可以想象两种可能:

  1. 您正在创建将使用 user-space 驱动程序
  2. 的物联网软件
  3. 您正在试验不同的设备(显然还没有内核 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 驱动程序来添加,后者......我还在努力弄清楚。