spidev:为什么不能直接放在设备树中?
设备树应该描述板子的硬件,但是spidev
并没有描述或标识任何硬件。
Mark Brown写道:
由于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" },
{},
}
这篇文章提出了一种替代方案,它只涉及对设备树的快速变更。建议参考此文章。只需将“spidev”兼容字符串替换为已存在的正确字符串即可:
mydev@0 {
- compatible = "spidev";
+ compatible = "rohm,dh2228fv";
spi-max-frequency = <5000000>;
由于“rohm,dh2228fv”已经在spidev_dt_ids[]列表中,因此不需要编辑drivers/spi/spidev.c。
compatible
字符串来表示这样的端口,而不是不得不“借用”可能会在将来消失的 “rohm,dh2228fv” 字符串。 - Ian Abbott"linux,spidev"
(而不仅仅是"spidev"
)。 - Compholio