除了本篇文档,对于每个BSP我们都有BSP Manual,如 i.MX6UL PD19 BSP Reference Manual,也可以参考阅读其中的Device Tree (DT)

设备树基础

首先,按照 yocto 查询方法中的dts查询 的方法找到对应的dts文件,或者在 BSP版本、设备树、config文件对照表 / BSP version, device tree, config file cross reference table 中查找。

一般文件位于

CPU位宽路径
32位arch/arm/boot/dts
64位arch/arm64/boot/dts/

然后根据文件的包含关系(以imx6为例):

可以看出各个文件是按照板级的方式关联在一起的,设备树的优先级规则是按照顺序来决定的,如 imx6dl-phytec-mira-rdk-nand.dts 的开头。

imx6dl-phytec-mira-rdk-nand.dts
/dts-v1/;
#include "imx6dl.dtsi"
#include "imx6qdl-phytec-phycore-som.dtsi"
#include "imx6qdl-phytec-mira.dtsi"
#include "imx6qdl-phytec-mira-peb-eval-01.dtsi"
#include "imx6qdl-phytec-peb-wlbt-01.dtsi"


如果在 imx6qdl-phytec-peb-wlbt-01.dtsi 文件中,修改了 imx6dl.dtsi 中的一个配置,则该配置由  imx6qdl-phytec-peb-wlbt-01.dtsi 中的配置为准。

同样的道理,该文件的后面也是对其他文件中的一些配置进行一些修改。如仅仅是使能:

imx6dl-phytec-mira-rdk-nand.dts
&ethphy {
        max-speed = <100>;
};

&fec {
        status = "okay";
};

&gpmi {
        status = "okay";
};

因此,一般是不需要修改核心板和SOC的配置文件 imx6qdl-phytec-phycore-som.dtsi 和 imx6dl.dtsi 这些。如果要定制自己的dts文件,请参考 imx6qdl-phytec-mira.dtsi 文件和 imx6dl-phytec-mira-rdk-nand.dts 当作模版来修改。关于设备树也可以参考一下nxp的文档 Introduction to Device Trees

将dtb文件反编译为dts

在kernel中提供了一些工具来调试dts文件,如dtc,dtc可以自由的将dtb文件和dts文件之间转换,该程序位于kernel的 /scripts/dtc/dtc。它会在你编译dtb后自动编译,也可以 make dtc来编译。

由于dtc可以将dtb转换为dts,而这个dts文件是单一的,也就是说,此时你可以看到一个将多个dtsi文件整合后的dts文件,从此你可以检查各个配置是否正确,尤其是通过多个文件配置的选项。

imx6dl-phytec-mira-rdk-nand.dts
 % make imx6q-phytec-mira-rdk-nand.dtb
 % cp arch/arm/boot/dts/imx6q-phytec-mira-rdk-nand.dtb .
 % ./scripts/dtc/dtc -I dtb -O dts -o imx6q-phytec-mira-rdk-nand.dts imx6q-phytec-mira-rdk-nand.dtb

你也可以将两个dtb文件转换为dts文件后,比较他们的区别(手工或者diff),同时,从4.6 kernel版本开始,你还可以用dtx_diff(dtdiff)。在老的kernel上也可以自己寻找dtdiff。

Barebox对设备树的修改

需要注意的是,有部分设备树的配置(如显示部分),还会通过barebox来配置,如在 barebox使用教程 / Introducing barebox 中的 “修改phytec扩展模块的配置”。

它的原理,是在barebox中有如下一系列指令

http://www.barebox.org/doc/latest/commands/misc/of_fixup_status.html

其中of_fixup_status用于使能一些外设,of_display_timings用于设定显示的timing。代码位于(以imx6为例)

https://git.phytec.de/meta-phytec/tree/recipes-bsp/barebox/barebox_2016.11.0-phy7.bb?h=2.1.3-phy5

env_add(d, "expansions/imx6qdl-mira-enable-lvds",
"""of_fixup_status /soc/aips-bus@02000000/ldb@020e0008/
of_fixup_status /soc/aips-bus@02000000/ldb@020e0008/lvds-channel@0
of_fixup_status /soc/aips-bus@02000000/pwm@02080000
of_fixup_status /soc/aips-bus@02100000/i2c@021a0000/stmpe@44
of_fixup_status /backlight

可以看到这个script通过of_fixup_status使能了一些显示相关的设备。

这个功能主要是为了开发板支持不同的硬件来使用的,如果不需要这个功能,则只需要按照 barebox使用教程 / Introducing barebox 中的方法将他们都注释掉不执行即可。

此时就会完全按照kernel的设备树来工作。

在linux中的 /sys/firmware/devicetree/base 中可以查到各个接口的路径,然后通过本节介绍的指令,就可以在barebox中进行开关。

在kernel的源码中,各个外设的设备树配置文档

在 imx6qdl-phytec-mira.dtsi 中,各种外设的配置方法请参考linux kernel的文档,这些文档位于 Documentation/devicetree/bindings/ 中。以下列出部分:

  • No labels