在设备树中使用 __overrides__ 可防止加载驱动程序

问题描述

您好,我创建了一个自定义设备树覆盖层以支持我自己的设备。我通过向内核添加补丁将其集成到 yocto 中。

我还想通过简单地更改 boot/config.txt 中的数据来允许更改设备参数,因此我在设备树覆盖文件添加overrides 部分。但问题是当这个部分出现时,我的驱动程序没有被内核加载。当我从文件删除此部分时,一切正常。驱动程序已加载,我可以对其进行操作。这里可能有什么问题?

不工作的设备树覆盖:

/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";
    };
};