你好,为了支持我自己的设备,我创建了一个自定义的设备树覆盖。我在yocto中集成了它,在内核中添加了一个补丁。
我还想通过简单地更改boot/config.txt中的数据来允许更改设备参数,所以我在设备树覆盖文件中添加了覆盖部分。但问题是,当这个部分出现时,内核并没有加载我的驱动程序。当我从文件中删除这个部分时,一切都很好。一个驱动程序加载了,我可以对它进行操作。这里可能有什么问题?
不工作的设备树覆盖:
/dts-v1/;
/plugin/;
&soc {
hatch2sr {
compatible = "hatch2sr";
pwm-names = "motor1";
pwms = <&pwm 0 1000000>;
openpossensor-gpios = <&gpio 3 1>;
closepossensor-gpios = <&gpio 26 1>;
relay-gpios = <&gpio 25 1>;
};
__overrides__ {
openpos_sensor_pin = <&hatch2sr>,"openpossensor-gpios:4";
openpos_sensor_flags = <&hatch2sr>,"openpossensor-gpios:8";
closepos_sensor_pin = <&hatch2sr>,"closepossensor-gpios:4";
closepos_sensor_flags = <&hatch2sr>,"closepossensor-gpios:8";
relay_pin = <&hatch2sr>,"relay-gpios:4";
relay_flags = <&hatch2sr>,"relay-gpios:8";
};
};
工作设备树:
/dts-v1/;
/plugin/;
&soc {
hatch2sr {
compatible = "hatch2sr";
pwm-names = "motor1";
pwms = <&pwm 0 1000000>;
openpossensor-gpios = <&gpio 3 1>;
closepossensor-gpios = <&gpio 26 1>;
relay-gpios = <&gpio 25 1>;
};
};
/boot/config.txt的最后一行:
dtoverlay=hatch2sr
内核编译和引导时没有任何抱怨。
一个问题是&hatch2sr
无法解决,因为没有该名称的标签。如果Raspberry Pi加载程序无法解析引用,它将不会应用覆盖。这可以通过将标签附加到预期节点来修复,如下所示:
&soc {
hatch2sr: hatch2sr {
另一个问题是Raspberry Pi加载程序在加载覆盖时没有应用在__overrides__
节点中指定的设备树参数。我认为这是因为__overrides__
节点需要放在设备树的根节点中,但它目前在&soc
节点中。如下图所示移动__overrides__
节点可能会解决问题:
/dts-v1/;
/plugin/;
&soc {
hatch2sr: hatch2sr {
compatible = "hatch2sr";
pwm-names = "motor1";
pwms = <&pwm 0 1000000>;
openpossensor-gpios = <&gpio 3 1>;
closepossensor-gpios = <&gpio 26 1>;
relay-gpios = <&gpio 25 1>;
};
};
/ {
__overrides__ {
openpos_sensor_pin = <&hatch2sr>,"openpossensor-gpios:4";
openpos_sensor_flags = <&hatch2sr>,"openpossensor-gpios:8";
closepos_sensor_pin = <&hatch2sr>,"closepossensor-gpios:4";
closepos_sensor_flags = <&hatch2sr>,"closepossensor-gpios:8";
relay_pin = <&hatch2sr>,"relay-gpios:4";
relay_flags = <&hatch2sr>,"relay-gpios:8";
};
};