编译 devicetree source 文件

dts, dtb

device tree (dts) 是一种树形结构的、用来描述 SoC 设备的组成的文件。有 dts 格式的文本源文件,用 Device Tree Compiler (dtc),可以把 dts 编译生成 dtb 二进制文件。

比如,arch/arm/boot/dts/imx6q-nitrogen6x.dts 文件,从文件名可以看到,是描述 Nitrogen6X 这种型号的开发板。里面还引用到了其他 dtsi 文件,这是 dts 编写时的一种代码复用。编译后会生成 imx6q-nitrogen6x.dtb。

/dts-v1/;
#include "imx6q.dtsi"
#include "imx6qdl-nitrogen6x.dtsi"

/ {
        model = "Boundary Devices i.MX6 Quad Nitrogen6x Board";
        compatible = "boundary,imx6q-nitrogen6x", "fsl,imx6q";
};

&sata {
        status = "okay";
};

编译

(1) in-tree

找到 linux/arch/arm/boot/dts 或者其他目录里对应的 Makefile,添加 dts 文件后,即可编译。

(2) out-of-tree

a.dtb: a.dts
    dtc -O dtb -o $@ $<

如果不放在 linux 源码目录里,对于一些简单的 dts,这样的 Makefile 已经够用了。编译生成的 dtb,跟内核放在一起使用即可。

对于用到 dt-bindings 或者其他一些 C 语言头文件的情况,这样的配置就不够用了,因为编译器找不到符号。对于这种情况,可以先让 cpp 编译器进行符号替换,再用 dtc 编译。比如:

a.dtb: a.dts.tmp
    dtc -O dtb -o $@ $<

a.dts.tmp: a.dts
    cpp -nostdinc -I <PATH> -undef -x assembler-with-cpp $< -o $@

fdtdump

Ubuntu 环境里,dtc 编译器在 device-tree-compiler 包里。用 dpkg 工具,可以看到这个包里还有其他一些工具:

/usr/bin/convert-dtsv0
/usr/bin/dtc
/usr/bin/dtdiff
/usr/bin/fdtdump
/usr/bin/fdtget
/usr/bin/fdtoverlay
/usr/bin/fdtput

如果想看一下 dtb 对应的 dts 信息,可以用里面 fdtdump 工具来 “ 反编译 ”,比如:

fdtdump a.dtb

参考资料

Read More: