Linux,Spidev:为什么它不应该直接在devicetree中?

时间:2018-12-05 14:48:15

标签: linux-device-driver spi device-tree

我想定义一个具有用户模式访问权限的SPI设备,例如http://linux-sunxi.org/SPIdev

中所述

在这些示例之后,我在设备树中添加了:

&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?正确的语法是什么?

2 个答案:

答案 0 :(得分:3)

  

spidev:为什么它不应该直接位于devicetree中?

设备树应描述主板的硬件,但 spidev没有描述/识别任何硬件。

马克·布朗写道:

  

因为spidev是Linux如何控制设备而不是控制设备的详细信息   系统中的硬件描述,我们永远都不应有节点   在DT中被描述为“ spidev”,任何SPI设备都可以是spidev,因此   只是不是有用的描述。

此内核补丁的原理和解决方法是https://patchwork.kernel.org/patch/6113191/


  

那么应该如何描述spidev?正确的语法是什么?

您无需在设备树源中明确使用spidev,而是需要标识您要控制的实际设备,例如

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

然后(如Geert Uytterhoeven解释的那样),通过将设备的兼容值添加到 spidev_dt_ids [] 数组

,在内核源代码中修改drivers/spi/spidev.c
 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" },
     {},
 }

this article建议使用另一种解决方案,其中包括对设备树进行快速n脏更改。
只需将“ 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 进行编辑。

答案 1 :(得分:0)

要避免此问题,只需使用 linux,spidev 而不是 spidev

&spi0 {
    mydev@0 {
       compatible = "linux,spidev";
    };
};