Linux, spidev: 为什么它不应该直接在设备树中?
Linux, spidev: why it shouldn't be directly in devicetree?
我想定义一个具有用户模式访问权限的 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: why it shouldn't be directly in devicetree?
设备树应该描述开发板的硬件,但是
spidev
没有 describe/identify 任何硬件。
马克·布朗写道:
Since spidev is a detail of how Linux controls a device rather than a
description of the hardware in the system we should never have a node
described as "spidev" in DT, any SPI device could be a spidev so this
is just not a useful description.
此内核补丁的基本原理和解决方法是 https://patchwork.kernel.org/patch/6113191/
So how else the spidev should be described? What is the right syntax?
您无需在设备树源代码中明确使用 spidev,而是需要识别您正在控制的实际设备,例如
mydev@0 {
- compatible = "spidev";
+ compatible = "my_spi_device";
spi-max-frequency = <5000000>;
然后(正如 Geert Uytterhoeven 解释的那样),通过将设备的兼容值添加到 spidev_dt_ids[][=40= 来修改内核源代码中的 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 提出了另一种解决方案,其中涉及对设备树进行快速的脏更改。
只需将 "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";
};
};
我想定义一个具有用户模式访问权限的 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: why it shouldn't be directly in devicetree?
设备树应该描述开发板的硬件,但是
spidev
没有 describe/identify 任何硬件。
马克·布朗写道:
Since spidev is a detail of how Linux controls a device rather than a description of the hardware in the system we should never have a node described as "spidev" in DT, any SPI device could be a spidev so this is just not a useful description.
此内核补丁的基本原理和解决方法是 https://patchwork.kernel.org/patch/6113191/
So how else the spidev should be described? What is the right syntax?
您无需在设备树源代码中明确使用 spidev,而是需要识别您正在控制的实际设备,例如
mydev@0 {
- compatible = "spidev";
+ compatible = "my_spi_device";
spi-max-frequency = <5000000>;
然后(正如 Geert Uytterhoeven 解释的那样),通过将设备的兼容值添加到 spidev_dt_ids[][=40= 来修改内核源代码中的 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 提出了另一种解决方案,其中涉及对设备树进行快速的脏更改。
只需将 "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";
};
};