spidev Linux драйвер на плате Intel Atom

Я работаю над созданием SPI на плате SMARC-sXBTi от Kontron на базе Atom под Linux.

Kontron предоставил Yocto BSP, но он не включает драйвер SPI.

Я перестроил Linux с поддержкой SPI. Я вижу контроллер SPI в lspci, а в sysfs устройство PCI SPI связано с драйвером pca2xx_spi_pci.

Как я понимаю, это драйвер платформы, который не предоставляет API пользовательского режима, и мне нужен spidev для работы через / dev / spidev, но когда я modeprobe spidev Я ничего не вижу: ни один файл не добавлен в / dev, ничего нет в dmesg.

Нужно ли настраивать спидев? BSP не включает в себя дерево устройств. Как spidev может найти и поговорить со своим контроллером PCI SPI?

3 ответа

Решение

Я обнаружил, что BSP Valley Island (Baytrail) обеспечивает намного лучшую аппаратную поддержку Kontron SMARC, чем Kontron BSP. Он поставляется с spidev и другими драйверами, необходимыми для доступа к периферийным устройствам Atom.

Не имеет прямого отношения к вопросу (просто для информирования тех, кто разрабатывает на платформе SXBTI SMARC): есть несколько вещей, которые не являются частью этого BSP: Ethernet и флэш-память eMMC. Первое можно добавить, включив драйвер Intel IGB в ядре, второе... Я все еще пытаюсь это выяснить.

Прежде всего, зачем вам нужен узел устройства SPI, чтобы быть доступным для пользователя?

Я мог представить две возможности:

  1. Вы создаете программное обеспечение IoT, которое будет использовать драйвер пользовательского пространства
  2. Вы экспериментируете с разными устройствами (у которых, видимо, еще нет драйверов пространства ядра)

В любом случае:

  • по словам Марка Брауна (сопровождающий подсистему SPI в ядре):

    spidev никогда не должен появляться непосредственно в ACPI или DT, поскольку наши представления о наилучшем способе управления оборудованием могут измениться.

    Смотрите подробности в полном обсуждении.

  • Тем не менее, Марк применил поддержку специального узла SPI в ACPI, чтобы показать spidev, который вы можете использовать

  • Поскольку прошивка вряд ли будет изменена для существующих плат на рынке, вам необходимо обновить таблицы 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
                )
            })
        }
    }
}

Поскольку вы не указали точные спецификации, вам может потребоваться дополнительная работа. Для более старых Atoms в ядре Linux Vanilla отсутствует один патч для передачи дескриптора ACPI в драйвер платформы.

Нужно ли настраивать спидев? BSP не включает в себя дерево устройств. Как spidev может найти и поговорить со своим контроллером PCI SPI?

Во времена, когда дерево устройств не работало, я использовал следующий код (пример, основанный на плате beagle, вы должны соответственно исправить для своей платы):

арка / рука / маш-omap2/ платы 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 появляются.

Другие вопросы по тегам