Linux、spidev:为什么它不应该直接位于设备树中?

问题描述 投票:0回答:3

我想定义一个具有用户模式访问权限的 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 还应该如何描述呢?正确的语法是什么?

linux-device-driver spi device-tree
3个回答
16
投票

spidev:为什么它不应该直接在设备树中?

设备树应该描述主板的硬件,但是

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 所解释的),修改内核源代码中的 drivers/spi/spidev.c,将设备的兼容值添加到 spidev_dt_ids[] 数组

 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


5
投票
要避免此问题,只需使用

linux,spidev

 而不是 
spidev
:

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

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

“Linux,spidev”;没用花了 3 天时间才弄清楚为什么 spidev 不在嵌入式 Linux 内核 6.1 设备上。用“hack”兼容版本替换它就成功了。

© www.soinside.com 2019 - 2024. All rights reserved.