我想定义一个具有用户模式访问权限的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?正确的语法是什么?
答案 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";
};
};