1. 设备树是什么?为什么嵌入式Linux需要它?
记得我刚开始接触嵌入式Linux开发时,每次更换硬件平台都要重新编译内核,改了一行GPIO配置就要折腾半天。直到设备树的出现,才真正解决了这个痛点。
设备树(Device Tree)本质上就是一块描述硬件信息的数据结构,它用树形结构来描述一个硬件平台上的各种设备。你可以把它想象成一份硬件的“身份证”和“连接说明书”,告诉内核这个板子上有什么设备、地址在哪、如何访问。
为什么需要设备树?以前的内核采用“硬编码”方式,把硬件信息直接写在内核源码里。换个硬件平台就要重新编译内核,非常麻烦。设备树将硬件描述和内核代码分离,同一个内核镜像可以支持多种硬件平台,大大提升了灵活性和可维护性。
在实际项目中,我遇到过这样的情况:同一个芯片,客户A要用GPIOA_1控制LED,客户B要用GPIOB_3。没有设备树时,我需要维护两个不同版本的内核。有了设备树后,只需要提供两个不同的.dts文件,内核完全不用改动。
2. 设备树基础知识:从DTS到DTB的完整流程
2.1 设备树文件家族
设备树涉及几种重要文件格式,刚开始容易混淆,我来帮你理清楚:
- DTS:设备树源文件,人类可读的文本格式,扩展名为.dts
- DTSI:设备树包含文件,类似C语言的头文件,扩展名为.dtsi
- DTB:设备树二进制文件,由DTS编译生成,给内核使用
- DTC:设备树编译器,负责将DTS编译为DTB
我通常这样组织项目中的设备树文件:
board/
├── base.dtsi # 芯片通用配置
├── platform-common.dtsi # 平台通用外设
├── product-a.dts # 产品A特定配置
└── product-b.dts # 产品B特定配置
2.2 设备树编译实战
编译设备树其实很简单,但有些细节需要注意。首先安装编译工具:
sudo apt-get install device-tree-compiler
编译单个DTS文件:
dtc -I dts -O dtb -o output.dtb input.dts
在实际项目中,我更喜欢用Makefile来管理编译过程:
DTB_FILES = product-a.dtb product-b.dtb
all: $(DTB_FILES)
%.dtb: %.dts
dtc -I dts -O dtb -o $@ $<
clean:
rm -f *.dtb
有时候需要查看DTB文件内容,可以使用反编译命令:
dtc -I dtb -O dts -o decompiled.dts output.dtb
提示:反编译出来的DTS文件可能和原始格式略有不同,但功能上是等价的。
3. 设备树语法详解:从节点到属性的完整指南
3.1 设备树的基本结构
每个设备树文件都以版本声明开头:
/dts-v1/;
然后是根节点和内存保留区域(如果有的话):
/memreserve/ 0x80000000 0x100000; // 保留从


2045

被折叠的 条评论
为什么被折叠?



