一、总体概念:什么是 Device Tree(设备树)?
在 Linux 内核(尤其是 ARM 平台)中,设备树用于描述硬件,而不是写死在内核源码中。
设备树由多种文件组成,每种文件在构建流程中承担不同的作用:
DTS:设备树源文件(Device Tree Source)
DTSI:设备树源的 include 文件(Device Tree Source Include)
DTB:设备树 blob(二进制编译后的文件)
DTBO:设备树 overlay(覆盖/动态修改树结构的文件)
二、各文件区别
1、DTS(Device Tree Source)------ 主设备树源文件
用途:描述一块具体硬件平台(开发板/产品)的设备信息。
格式:文本格式,可读性强。
内容包括:CPU、内存、GPIO、外设节点、引脚复用、电源、传感器
特点:
DTS 通常为每个产品一份
DTS 会 #include 一个或多个 DTSI。
2、DTSI(Device Tree Source Include)------ 设备树的公共模板文件
用途:类似 C 语言的 .h 头文件,供多个 DTS 复用。
作用:把共性硬件结构抽取出来,减少重复代码。
特点:
DTSI 不会单独编译成 DTB
DTS 通过 #include 使用 DTSI。
3、DTB(Device Tree Blob)------ 设备树二进制文件
用途:由 DTS/DTSI 编译而来,供内核在启动时解析。
格式:二进制,不可直接阅读。
加载位置:大多数平台(ARM/AArch64),由 bootloader(如 U-Boot)传递给 kernel,Kernel 在启动早期解析 dtb 并实现硬件初始化。
4、DTBO(Device Tree Overlay)------ 设备树补丁/覆盖文件
用途:对主 DTB 进行动态增量修改,而不是完全替换它。DTBO文件包含了针对基础设备树的增量修改指令。系统在启动时,先将主 DTB 加载到内存中,然后应用一个或多个DTBO文件,在内存中形成一个"合并后"的设备树,再交给内核
典型应用场景:动态插拔模块(扩展板 HAT)、U-Boot 实现可配置硬件、多种外设/配置可选(如改变显示屏型号)
特点:
**动态性:**无需重新编译内核或主设备树,只需在配置文件中加一行,重启即可生效。
**模块化:**每个外设对应一个Overlay文件,管理清晰。你可以同时启用多个Overlay(用空格分隔)。
**非侵入性:**你不会破坏主设备树文件。如果想禁用某个外设,只需从配置中移除该Overlay即可恢复原状。
**可定制性:**高级用户可以自己编写或修改Overlay文件来支持非官方硬件。
