Linux, spidev: почему это не должно быть прямо в devicetree? - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу определить устройство SPI с доступом в режиме пользователя, как описано, например, в http://linux -sunxi.org / SPIdev

Следуя этим примерам, я добавил в devicetree этот:

&ecspi1 {
     .... other stuff ...
    mydev@0 {
       compatible = "spidev";
       spi-max-frequency = <5000000>;
       reg = <2>; /*chipselect*/
    };
};

Платформа i.MX6.ecspi1 кажется их контроллером SPI.Тогда я действительно получаю /dev/spi0.2 и /sys/class/spidev/spidev0.2

Но в трассировке ядра есть ПРЕДУПРЕЖДЕНИЕ, говорящее это:

spidev spi0.2: глючит DT: spidev перечислен непосредственно в DT

Так как еще следует описать spidev?Какой правильный синтаксис?

1 Ответ

0 голосов
/ 05 декабря 2018

spidev: почему это не должно быть непосредственно в devicetree?

Дерево устройств должно описывать аппаратное обеспечение платы, но spidev не описывает / идентифицирует какое-либо оборудование.

Марк Браун писал:

Поскольку spidev - это деталь того, как Linux управляет устройством, а не описание аппаратного обеспечения в системе, у нас никогда не должно быть узла, описанного как «spidev» вDT, любое SPI-устройство может быть spidev, так что это просто бесполезное описание.

Обоснование и обходной путь для этого патча ядра - https://patchwork.kernel.org/patch/6113191/


Так как еще следует описать спидев?Каков правильный синтаксис?

Вместо явного использования spidev в вашем источнике дерева устройств, вместо этого вам нужно идентифицировать фактическое устройство, которым вы управляете, например,

     mydev@0 {
-       compatible = "spidev";
+       compatible = "my_spi_device"; 
        spi-max-frequency = <5000000>;

Затем (как объясняет Geert Uytterhoeven) измените drivers / spi / spidev.c в исходном коде ядра, добавив совместимое значение для вашего устройства в spidev_dt_ids [] array

 static const struct of_device_id spidev_dt_ids[] = {
     { .compatible = "rohm,dh2228fv" },
     { .compatible = "lineartechnology,ltc2488" },
     { .compatible = "ge,achc" },
     { .compatible = "semtech,sx1301" },
+    { .compatible = "my_spi_device" },
     {},
 }

Альтернативное решение, которое включает быстрое и простое изменение только дерева устройств, предлагается этой статьей .
Просто замените строку, совместимую с "spidev", на правильную строку, которая уже существует:

     mydev@0 {
-       compatible = "spidev";
+       compatible = "rohm,dh2228fv";  /* actually spidev for my_spi_dev */
        spi-max-frequency = <5000000>;

Поскольку "rohm, dh2228fv" уже есть в списке spidev_dt_ids [] , редактирование в drivers / spi / spidev.c необходимо.

...