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, чтобы быть доступным для пользователя?
Я мог представить две возможности:
- Вы создаете программное обеспечение IoT, которое будет использовать драйвер пользовательского пространства
- Вы экспериментируете с разными устройствами (у которых, видимо, еще нет драйверов пространства ядра)
В любом случае:
по словам Марка Брауна (сопровождающий подсистему 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
появляются.