【问题标题】:Modifying the device tree for the Beaglebone Black修改 Beaglebone Black 的设备树
【发布时间】:2016-07-05 14:15:46
【问题描述】:

我使用 Yocto 为 Beaglebone Black 创建了一个小型 linux 映像。我想我几乎所有的东西都按我想要的方式工作,除了我需要访问 UART 2 和 4。当我使用标准 Debian 映像时,我使用设备树覆盖和 capemgr 来做到这一点。但是,我发现用 Yocto 构建的内核没有 capemgr。

我的选择似乎是:

  1. 获取内核以使用 capemgr 构建,或者
  2. 对设备树文件进行必要的更改。

选项 2 似乎更容易。

UART 的设备树叠加层为 herehere。我已经尝试以几种方式包含这些内容。

  1. 我反编译了我一直使用的设备树 blob 并尝试 从那里包含这些文件。
  2. 我下载了the full set of dts files 并尝试包含 UART 设备树覆盖在 am335x-boneblack.dts 中。

这两种方法都会产生类似这样的错误:

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)。

有人知道我可能做错了什么吗?我正在尝试做的事情是否可能?

【问题讨论】:

  • 您可能希望在 .dts 文件的end 中包含您的“覆盖”文件,即在声明其他所有内容之后。普通的.dtsi文件不使用fragment@0 { target = <&x>; __overlay__ { ... } },所以要删掉。
  • 在 Yocto 上编译 DTB:bitbake -f -c deploy your_kernel_recipe,例如bitbake -f -c deploy linux-imx

标签: linux linux-kernel embedded beagleboneblack device-tree


【解决方案1】:

所以我通过获取我的设备树 blob、反编译、合并设备树覆盖文件中的部分并重新编译来完成这项工作。我意识到我需要 uart 1 和 2 而不是 2 和 4,所以这与我原来的问题略有不同。

反编译设备树 blob:

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

我以现有的 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 */
    >;
};

然后,需要启用串行部分并告知要使用哪些引脚。我修改了现有的 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 部分将状态设置为“已禁用”。

【讨论】:

    猜你喜欢
    • 2013-08-25
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多