修改Beaglebone Black的设备树

Dav*_*ave 6 linux embedded linux-kernel device-tree beagleboneblack

我使用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
Run Code Online (Sandbox Code Playgroud)

但是,我注意到在尝试编译am335x-boneblack.dts时我得到了类似的错误,即使没有修改它,所以我可能甚至没有做到这一点.(使用命令dtc -I dts -O dtb -o result.dtb am335x-boneblack.dts)

显然我不知道我在做什么.我怀疑设备树覆盖必须以某种方式进行修改,以便在我尝试使用它们的方式中使用.或者也许我没有做包含权限(只需在文件顶部添加#include).

有没有人有任何想法我可能做错了什么?我正在努力做甚么可能吗?

Dav*_*ave 6

因此,我通过获取设备树 blob、对其进行反编译、合并设备树覆盖文件中的部分并重新编译来实现此目的。我意识到我需要 uart 1 和 2 而不是 2 和 4,所以这与我原来的问题略有不同。

反编译设备树 blob:

dtc -I dtb -O dts -o am335x-boneblack.dts am335x-boneblack.dtb
Run Code Online (Sandbox Code Playgroud)

我使用现有的 uart0 作为示例来向我展示要工作的正确部分。

我在 uart0 部分下的 pinmux 部分中添加了 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 */
    >;
};
Run Code Online (Sandbox Code Playgroud)

然后,需要启用串行部分并告知要使用哪些引脚。我修改了现有的 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>;
}
Run Code Online (Sandbox Code Playgroud)

重新编译设备树:

dtc -I dts -O dtb -o am335x-boneblack.dtb am335x-boneblack.dts
Run Code Online (Sandbox Code Playgroud)

简而言之,尽管我几乎不知道设备树是如何工作的,但我还是设法让它工作。

我还需要禁用 hdmi,这是通过在 hdmi 部分中将状态设置为“已禁用”来实现的。