【问题标题】:Beaglebone dcan0 and dcan1Beaglebone dcan0 和 dcan1
【发布时间】:2020-03-31 15:41:06
【问题描述】:

我有一个用 yocto 为 beaglebone black 创建的 linux 映像。我需要配置 dcan0 和 dcan1,以及一堆 gpios 和几个 uart。为此,我创建了一堆 .dtsi 文件并将它们包含在自定义 .dts 中,并创建了补丁以包含所有更改。一切正常,除了 dcan0 和 dcan1(我已删除 i2c2)检查:

cat /sys/kernel/debug/pinctrl/44e10800.pinmux-pinctrl-single/pinmux-pins

这是我的 dcan0 配置,dcan1 看起来几乎一样,只是使用了不同的引脚:

&am33xx_pinmux {
    dcan0_pins_default: dcan0_pins_default {
        pinctrl-single,pins = <
            AM33XX_IOPAD(0x97c, PIN_INPUT | MUX_MODE2) /* (D17) uart1_rtsn.dcan0_rx */
            AM33XX_IOPAD(0x978, PIN_OUTPUT | MUX_MODE2) /* (D18) uart1_ctsn.dcan0_tx */
        >;
    };
};

&dcan0 {
    status = "okay";
    pinctrl-names = "default";
    pinctrl1-0 = <&dcan0_pins_default>;
};

在此之后,我将 dcan0 和 dca1 的配置添加到 am33xx.dtsi,如下所示:

+   d_can@481cc000 {
+            compatible = "bosch,d_can";
+            ti,hwmods = "d_can0";
+            reg = <0x481cc000 0x2000>;
+            interrupts = <0x34>;
+            status = "disabled";
+            linux,phandle = <0x2c>;
+            phandle = <0x2c>;
+        };
+ 
+        d_can@481d0000 {
+            compatible = "bosch,d_can";
+            ti,hwmods = "d_can1";
+            reg = <0x481d0000 0x2000>;
+            interrupts = <0x37>;
+            status = "disabled";
+            linux,phandle = <0x2d>;
+            phandle = <0x2d>;
+        };

再一次,罐头不存在。有谁知道为什么它不起作用?我以相同的方式配置了我的 UART,它们都在工作。

【问题讨论】:

    标签: embedded-linux yocto beagleboneblack


    【解决方案1】:

    您正试图重载使用 phandle 方法的 &amp;dcan0 中的属性。仅当您为设备树中描述的设备指定了标签时,您才能执行此操作。 在 am33xx.dtsi 中:

    / {
        can@f09237 {
            some-properties;
        };
    };
    

    要对上述设备进行重载或添加属性,您需要在包含 DTSI 的其他 DTS(I) 中执行以下操作: 在 mycustom.dts 中:

    / {
        can@f09237 {
            some-other-properties;
        };
    };
    

    您需要尊重来自/ 的确切路径。因此,如果您有以下情况: 在 am33xx.dtsi 中:

    / {
        bus@9908ab {
            can@f09237 {
                some-properties;
            };
        };
    };
    

    在 mycustom.dtsi 中,您应该有:

    / {
        bus@9908ab {
            can@f09237 {
                some-other-properties;
            };
        };
    };
    

    向设备重载/添加属性的第二种方法是使用phandles。为此,您需要一个标签: 在 am33xx.dtsi 中:

    / {
        can0: can@f09237 {
            some-properties;
        };
    };
    

    在 mycustom.dts 中:

    // Technically not needed but just to show it should be outside of this, the root of the DTS
    / {
    };
    
    &can0 {
        some-other-properties;
    };
    

    如果您的节点没有标签,但父节点有标签,例如以下示例: 在 am33xx.dtsi 中:

    / {
        bus0: bus@9908ab {
            can@f09237 {
                some-properties;
            };
        };
    };
    

    在 mycustom.dtsi 中,您可以执行以下操作(基本上是 phandle 和 path 方法的混合):

    &bus0 {
        can@f09237 {
            some-other-properties;
        };
    };
    

    我个人会使用 phandle 方法,它更易读,更容易找到原始节点的定义位置。

    IIRC(不是 100% 确定那个),您不必在 am33xx.dtsi 中添加 phandle,您可以将其添加到其他地方,但您显然需要尊重上述解决方案之一以重载设备树节点。 例如,对于 am33xx.dtsi 的第一个示例,您可以在 mycustom.dts 中拥有(或在中间的 mycustom.dtsi 中分离标签声明):

    / {
        can0: can@f09237 {
        };
    };
    
    &can0 {
        some-other-properties;
    };
    

    否则,我很惊讶在您的设备树中看到 linux,phandlephandle,这是相当古老的并且不再在 DTS 中使用(尽管它实际上是由 DTC 在编译您的 DTS 时放置的)。另外,我怀疑 linux,phandle 是确定性的,它通常是由 DTC 动态创建的,每次创建 phandle 时只需增加一个数字。

    【讨论】:

    • 所以基本上我应该删除 linux,phandle = ;潘德尔 = ;是吗?
    • 我认为它们在你的情况下没用。您需要做的是使用正确的方法来重载 DeviceTree 节点。你混合了两种方式。您可以在 am33xx.dtsi 中向节点添加标签,或者通过路径重载它。上面解释的两种方法之一。让我添加必须编写代码 sn-ps 的文件的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2014-09-19
    • 2016-11-30
    相关资源
    最近更新 更多