我想定义一个具有用户模式访问权限的 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 还应该如何描述呢?正确的语法是什么?
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。
linux,spidev
而不是
spidev
:
&spi0 {
mydev@0 {
compatible = "linux,spidev";
};
};
&spi0 {
mydev@0 {
compatible = "linux,spidev";
};
};“Linux,spidev”;没用花了 3 天时间才弄清楚为什么 spidev 不在嵌入式 Linux 内核 6.1 设备上。用“hack”兼容版本替换它就成功了。