2. 设备树文件结构:DTS、DTSI、DTB、DTC的概念与关系
设备树(Device Tree)是嵌入式Linux系统中用于描述硬件拓扑结构的关键机制。理解其文件体系是调试设备树的基础。本节将系统梳理设备树的四种核心文件类型——DTS、DTSI、DTB、DTC——的概念、关系及源文件语法概览。
2.1 核心概念与文件类型
设备树文件体系包含三种文本格式和一种二进制格式,以及一个编译工具。下表总结了它们的核心特征:
| 文件类型 | 全称 | 格式 | 作用 | 扩展名 |
|---|---|---|---|---|
| DTS | Device Tree Source | 文本(.dts) | 顶层设备树源文件,描述单板硬件 | .dts |
| DTSI | Device Tree Source Include | 文本(.dtsi) | 公共设备树包含文件,可被多个DTS引用 | .dtsi |
| DTB | Device Tree Blob | 二进制(.dtb) | 编译后的设备树,由Bootloader传递给内核 | .dtb |
| DTC | Device Tree Compiler | 工具 | 将DTS/DTSI编译为DTB,或反编译DTB为DTS | — |
调试要点: 内核启动时读取的是DTB二进制文件,而非DTS文本。当设备树出现问题时,首先应确认DTB是否正确生成,再反编译检查其内容。
2.2 文件关系与编译流程
DTS与DTSI通过#include机制组合,经DTC编译生成DTB。下图展示了完整的文件关系与编译流程:
编译命令示例:
# 编译DTS为DTB
dtc -I dts -O dtb -o myboard.dtb myboard.dts
# 反编译DTB为DTS(调试常用)
dtc -I dtb -O dts -o myboard_decompiled.dts myboard.dtb
2.3 设备树源文件语法概览
设备树源文件采用树形结构描述硬件,核心语法元素包括:节点(node)、属性(property)、值(value)和标签(label)。以下是一个典型的设备树片段:
/dts-v1/;
#include "soc.dtsi"
/ {
model = "MyBoard v1.0";
compatible = "vendor,myboard", "vendor,myboard-v1";
chosen {
bootargs = "console=ttyS0,115200 root=/dev/mmcblk0p2";
};
memory@80000000 {
device_type = "memory";
reg = <0x80000000 0x40000000>; /* 1GB RAM */
};
&uart0 {
status = "okay";
clock-frequency = <24000000>;
};
};
2.4 语法要素详解
| 语法要素 | 示例 | 说明 |
|---|---|---|
| 根节点 | / { }; |
设备树的顶层容器,所有设备节点位于其下 |
| 节点名称 | memory@80000000 |
节点名+@+地址(可选),用于标识设备 |
| 属性 | compatible = "vendor,device"; |
字符串属性,用于驱动匹配 |
| reg属性 | reg = <0x80000000 0x40000000>; |
地址和长度对,描述设备地址空间 |
| 标签引用 | &uart0 { }; |
通过标签引用并覆盖已有节点 |
| 包含指令 | #include "soc.dtsi" |
引入公共定义文件,支持C预处理器 |
2.5 节点与属性的层次结构
设备树的树形结构通过节点嵌套体现硬件拓扑。下图展示了一个典型嵌入式系统的设备树层次:
2.6 常用属性与调试价值
在设备树调试过程中,以下属性具有关键作用:
- compatible:驱动匹配的核心依据,调试时需确认值与驱动中的匹配表一致。
- reg:描述设备地址空间,错误配置会导致设备无法访问。
- status:控制设备启用状态,
"okay"表示启用,"disabled"表示禁用。 - interrupts:中断号与触发类型,配置错误会导致中断无法响应。
- clocks:时钟源与频率,影响设备工作速率。
常见调试陷阱: DTSI文件中的节点定义可能被DTS文件中的同名节点覆盖。调试时务必确认最终生效的是哪个定义,可通过反编译DTB验证。
2.7 DTC编译选项与调试技巧
DTC工具提供了多种编译选项,在调试过程中非常实用:
| 选项 | 功能 | 调试用途 |
|---|---|---|
-I dts -O dtb |
编译DTS为DTB | 标准编译流程 |
-I dtb -O dts |
反编译DTB为DTS | 检查实际生效的设备树内容 |
-@ |
生成符号节点 | 支持设备树覆盖(overlay) |
-H |
生成人类可读的格式 | 便于阅读反编译结果 |
-W no-unit_address_vs_reg |
忽略特定警告 | 屏蔽非关键警告,聚焦真正错误 |
调试命令速查:
# 检查DTB是否包含预期节点
dtc -I dtb -O dts myboard.dtb | grep -A5 "uart0"
# 查看设备树大小(过大可能导致启动问题)
ls -l myboard.dtb
# 验证设备树语法
dtc -I dts -O dtb -o /dev/null myboard.dts