首页 > 解决方案 > 在设备树中使用 __overrides__ 可防止加载驱动程序

问题描述

您好,我创建了一个自定义设备树覆盖以支持我自己的设备。我通过向内核添加补丁将它集成到 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

内核编译和引导没有任何抱怨。

标签: linux-kernellinux-device-driverembedded-linuxyoctodevice-tree

解决方案


一个问题是&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";
    };
};

推荐阅读