修改 Beaglebone Black 的设备树
Modifying the device tree for the Beaglebone Black
我使用 Yocto 为 Beaglebone Black 创建了一个小 linux 图像。我想我几乎所有的东西都按我想要的方式工作,除了我需要访问 UART 2 和 4。当我使用标准的 Debian 映像时,我使用设备树覆盖和 capemgr 来做到这一点。但是,我发现用Yocto构建的内核没有capemgr。
我的选择似乎是:
- 获取要使用 capemgr 构建的内核,或者
- 修改设备树文件进行必要的更改。
选项 2 似乎更容易。
UART 的设备树覆盖 here and here。我已经开始尝试以几种方式将它们包括在内。
- 我反编译了我一直在使用的设备树 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。
我使用 Yocto 为 Beaglebone Black 创建了一个小 linux 图像。我想我几乎所有的东西都按我想要的方式工作,除了我需要访问 UART 2 和 4。当我使用标准的 Debian 映像时,我使用设备树覆盖和 capemgr 来做到这一点。但是,我发现用Yocto构建的内核没有capemgr。
我的选择似乎是:
- 获取要使用 capemgr 构建的内核,或者
- 修改设备树文件进行必要的更改。
选项 2 似乎更容易。
UART 的设备树覆盖 here and here。我已经开始尝试以几种方式将它们包括在内。
- 我反编译了我一直在使用的设备树 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。