ddb*_*bug 3 spi linux-device-driver device-tree
我想定义一个具有用户模式访问权限的SPI设备,例如http://linux-sunxi.org/SPIdev中所述
在这些示例之后,我在devicetree中添加了this:
&ecspi1 {
.... other stuff ...
mydev@0 {
compatible = "spidev";
spi-max-frequency = <5000000>;
reg = <2>; /*chipselect*/
};
};
Run Code Online (Sandbox Code Playgroud)
该平台是i.MX6。ecspi1似乎是他们的SPI控制器。然后我确实得到了/dev/spi0.2和/sys/class/spidev/spidev0.2
但是在内核跟踪中有一个警告说:
spidev spi0.2:越野车DT:spidev直接列在DT中
那么还应该如何描述spidev?正确的语法是什么?
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>;
Run Code Online (Sandbox Code Playgroud)
然后(如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" },
{},
}
Run Code Online (Sandbox Code Playgroud)
另一种解决方案,它涉及一种快速正脏变化到正好的设备树,通过建议本文。
只需将“ spidev”兼容字符串替换为已经存在的适当字符串即可:
mydev@0 {
- compatible = "spidev";
+ compatible = "rohm,dh2228fv"; /* actually spidev for my_spi_dev */
spi-max-frequency = <5000000>;
Run Code Online (Sandbox Code Playgroud)
因为“ rohm,dh2228fv”已经在spidev_dt_ids []列表中,所以不需要对driver / spi / spidev.c进行编辑。
为了避免这个问题,只需使用linux,spidev而不是spidev:
&spi0 {
mydev@0 {
compatible = "linux,spidev";
};
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1491 次 |
| 最近记录: |