验证平台
-
win10 64 位
-
VMware Workstation Pro 16
-
ubuntu 20.04
-
dtc 工具: 来自
linux-6.3.5
中的scripts/dtc/
安装 dtc 工具
-
其实可以通过安装 dtc 软件包,但不建议这么做,最好通过编译Linux 最新的内核,获取这个 dtc 工具
-
编译Linux 内核生成 dtc 工具的方法
-
下载最新的Linux 内核,解压到 ubuntu 20.04 中,随便找个 board 的 defconfig,如 qemu
arch/arm/configs/vexpress_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
-
使用最新的Linux 内核编译出来的 dtc 工具,这样编译或者反编译 设备树文件,会比较的靠谱,当然研究Linux 设备树,最好提前准备好Linux 的编译环境
-
这里不需要重新编译Linux 内核,只需要单独编译设备树即可
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
反编译 dtb
-
也就是把 dtb 设备树二进制文件,反编译为 一个 dts 设备树源文件,这里使用 dtc 工具
-
反编译的命令如下:
./dtc -I dtb -O dts vexpress-v2p-ca9.dtb -o vexpress-v2p-ca9_0603.dts
-
注意一下参数即可:
-
./dtc
表示 dtc 的执行路径,可以根据实际情况指定,./dtc
表示 dtc 工具在当前路径下 -
-I dtb -O dts
注意这里的I
是Input
的缩写,也就是 输入格式 :dtb
,O
表示Output
输出格式:dts
-
vexpress-v2p-ca9.dtb
:设备树的二进制 dtb 文件,也就是被反编译的 dtb 文件 -
-o vexpress-v2p-ca9_0603.dts
,这里-o
小写的output
,输出的文件,后面的名字可以自己定义,如xxx.dts
-
以上操作即可把 一个 dtb 文件 反编译成 一个 设备树源文件 dts
生成的 dts 对比原有的 dts
-
Linux 的设备树文件,可能是一个 dts 源文件,多个 dtsi 与 .h 头文件组成的,所以反编译后只生成了一个 dts 原文件,内容对比起来,可能需要结合多个 dtsi 文件进行查看
-
如下,我使用Linux 的现有的 dts 生成 dtb,然后再把 dtb 反编译为 dts,对比文件内容,发现有些差异
-
毕竟 这个生成的 dts,是多个 文件的组合成的,但是内容基本一致,比如你可以再把 反编译后的 dts 编译为 dtb,然后验证功能是否正常。
dts 编译 为 dtb
- 如上,如果只有一个 dts 文件,编译为 dtb 的方法很简单,就是使用 dtc 工具,命令如下:
$ ./dtc -I dts -O dtb vexpress-v2p-ca9_0603.dts -o vexpress-v2p-ca9_0603.dtb
-
如果是一个完整的设备树,包括 一个 dts、多个 dtsi 与 .h 文件,就需要使用 gcc 预处理后再 使用 dtc 编译成 dtb,这里可以使用 shell 脚本或者 Makefile 方式实现,相关的文章:
-
Linux 设备树文件手动编译的 Makefile
-
Linux 设备树文件手动编译的 shell 脚本
小结
-
本篇注意讲了一下如何把Linux 生成好的 设备树文件 dtb,反编译为 设备树源文件 dts 文件
-
注意 获取 设备树编译工具 dtc 的方法,最好通过最新的Linux 内核 编译获取