0

我正在努力在 Linux 下在 Kontron 基于 Atom 的 SMARC-sXBTi 板上启动 SPI。

控创提供了 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 控制器并与之对话?

4

3 回答 3

2

首先,为什么需要将 SPI 设备节点暴露给用户空间?

我可以想象两种可能性:

  1. 您正在创建将使用用户空间驱动程序的物联网软件
  2. 您正在试验不同的设备(显然还没有内核空间驱动程序)

任何状况之下:

  • 根据 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 句柄传播到平台驱动程序

于 2016-08-24T11:17:08.000 回答
0

我需要配置spidev吗?BSP 不包括设备树。spidev 如何找到它的 PCI SPI 控制器并与之对话?

在设备树不工作的时候,我使用了以下代码(基于 beagle 板的示例,您应该相应地修复您的板):

拱/臂/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,我还指定了芯片选择和速度,然后我调用了spi_register_board_info,在重建内核并重新启动后/dev/spidev3.1出现类似的东西。

于 2016-08-24T09:59:37.017 回答
0

我发现Valley Island (Baytrail) BSP为控创 SMARC 提供了比控创 BSP 更好的硬件支持。它带有 spidev 和访问 Atom 外围设备所需的其他驱动程序。

与问题没有直接关系(只是为了通知那些在 SXBTI SMARC 平台上开发的人):需要一些不属于此 BSP 的东西:以太网和 eMMC 闪存。前者可以通过在内核中启用 Intel IGB 驱动程序来添加,后者......我仍在努力解决。

于 2017-01-10T13:23:53.200 回答