我已经使用Yocto为Beaglebone Black创建了一个小的linux镜像。我想我可以按照自己的意愿进行大多数工作,除了需要访问UART 2和UART4。在使用标准Debian镜像时,我使用设备树覆盖和capemgr进行了此操作。但是,我发现用Yocto构建的内核没有capemgr。

我的选择似乎是:

  • 获取使用capemgr或
  • 构建的内核
  • 通过必要的更改来修改设备树文件。

  • 选项2似乎容易得多。

    UART的设备树覆盖为herehere。我已经尝试过以几种方式包括这些内容。
  • 我反编译了我一直在使用的设备树blob,并试图
    从那里包括这些文件。
  • 我下载了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)。

    有人对我可能做错了什么有任何想法吗?我正在尝试做的事情甚至有可能吗?

    最佳答案

    因此,我通过获取设备树blob,对其进行反编译,并合并了设备树覆盖文件中的各个部分,然后重新进行编译,从而完成了这项工作。我意识到我需要uarts 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部分中将状态设置为“disabled”来禁用hdmi。

    关于linux - 修改Beaglebone Black的设备树,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36090929/

    10-13 07:11