修改 Beaglebone Black 的设备树

7
我使用Yocto为Beaglebone Black创建了一个小型Linux镜像。除了需要访问UART 2和4之外,我认为我已经完成了大部分想要的工作。在使用标准Debian映像时,我通过设备树叠加和capemgr实现了这一点。但是,我发现使用Yocto构建的内核没有capemgr。
我的选择似乎是:
1. 使内核构建具有capemgr功能,或 2. 修改设备树文件以进行必要的更改。
选项2似乎更容易。
UART的设备树叠加在此处此处。我尝试了几种方法来包含它们。
  1. 我反编译了之前使用的设备树 blob 并尝试从中包含这些文件。
  2. 我下载了完整的 dts 文件集,并尝试在 am335x-boneblack.dts 中包含 UART 设备树叠加层。

这两种方法都会产生类似于以下的错误:

Error: am335x-boneblack.dts:1.1-2 syntax error
FATAL ERROR: Unable to parse input tree

然而,我注意到在尝试编译am335x-boneblack.dts时,即使没有修改它,我也会遇到类似的错误,所以我可能甚至都做错了。(使用命令dtc -I dts -O dtb -o result.dtb am335x-boneblack.dts) 显然,我不知道自己在做什么。我怀疑设备树叠加必须以某种方式进行修改才能按照我尝试使用它们的方式使用。或者可能我没有正确地包含(只是将#include添加到文件顶部)。有人有任何想法吗?我可能做错了什么?我正在尝试做的事情甚至可能吗?

2
你可能想在**.dts文件的末尾包含你的“叠加”文件,也就是在所有其他声明之后。普通的.dtsi**文件不使用fragment@0 { target = <&x>; __overlay__ { ... } },因此这些必须被编辑掉。 - sawdust
在Yocto上编译DTB:bitbake -f -c deploy your_kernel_recipe,例如bitbake -f -c deploy linux-imx - LPs
1个回答

5

我通过以下步骤解决了这个问题:首先,将设备树二进制文件反编译,然后将设备树覆盖层文件的相关部分合并进去,最后重新编译。由于需要使用UARTS 1和2而非2和4,因此与我的原始问题略有不同。

解编设备树二进制文件的步骤如下:

dtc -I dtb -O dts -o am335x-boneblack.dts am335x-boneblack.dtb

我以现有的uart0作为例子,向我展示了工作的正确部分。

我在pinmux部分的uart0部分下添加了一个用于uart1和uart2的部分。现在它看起来像这样:

pinmux_uart0_pins {
    pinctrl-single,pins = <0x170 0x30 0x174 0x0>;
    linux,phandle = <0x27>;
    phandle = <0x27>;
};

bb_uart1_pins: pinmux_bb_uart1_pins {
    pinctrl-single,pins = <
        0x184 0x20 /* P9.24 uart1_txd.uart1_txd  OUTPUT  */
        0x180 0x20 /* P9.26 uart1_rxd.uart1_rxd  INPUT  */
    >;
};

bb_uart2_pins: pinmux_bb_uart2_pins {
    pinctrl-single,pins = <
        0x150 0x21  /okay* spi0_sclk.uart2_rxd | MODE1 */
        0x154 0x01  /* spi0_d0.uart2_txd | MODE1 */
    >;
};

接下来,需要启用串行部分并告知使用哪些引脚。我修改了现有的UART部分,现在它看起来像这样:

serial@44e09000 {
    compatible = "ti,omap3-uart";
    ti,hwmods = "uart1";
    clock-frequency = <0x2dc6c00>;
    reg = <0x44e09000 0x2000>;
    interrupts = <0x48>;
    status = "okay";
    dmas = <0x26 0x1a 0x26 0x1b>;
    dma-names = "tx", "rx";
    pinctrl-names = "default";
    pinctrl-0 = <0x27>;
};

serial@48022000 {
    compatible = "ti,omap3-uart";
    ti,hwmods = "uart2";
    clock-frequency = <0x2dc6c00>;
    reg = <0x48022000 0x2000>;
    interrupts = <0x49>;
    status = "okay";
    dmas = <0x26 0x1c 0x26 0x1d>;
    dma-names = "tx", "rx";
    pinctrl-names = "default";
    pinctrl-0 = <&bb_uart1_pins>;
};

serial@48024000 {
    compatible = "ti,omap3-uart";
    ti,hwmods = "uart3";
    clock-frequency = <0x2dc6c00>;
    reg = <0x48024000 0x2000>;
    interrupts = <0x4a>;
    status = "okay";
    dmas = <0x26 0x1e 0x26 0x1f>;
    dma-names = "tx", "rx";
    pinctrl-names = "default";
    pinctrl-0 = <&bb_uart2_pins>;
}

重新编译设备树的方法如下:
dtc -I dts -O dtb -o am335x-boneblack.dtb am335x-boneblack.dts

简而言之,尽管我几乎不知道设备树的工作原理,但我成功了。
我还需要禁用HDMI,这是通过在HDMI部分设置状态等于“禁用”来实现的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接