编译 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
参考资料
- arch/arm64/boot/dts/*
- https://www.devicetree.org/specifications/