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。下图展示了完整的文件关系与编译流程:

设备树文件关系与编译流程 soc.dtsi 公共SoC定义 board-common.dtsi 单板公共定义 myboard.dts 顶层源文件 #include 引用 DTC 编译器 dtc -I dts -O dtb myboard.dtb 二进制设备树 Linux 内核 启动时解析DTB 调试路径 dtc -I dtb -O dts myboard.dtb 反编译检查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 节点与属性的层次结构

设备树的树形结构通过节点嵌套体现硬件拓扑。下图展示了一个典型嵌入式系统的设备树层次:

设备树节点层次结构示例 / (根节点) cpus memory@80000000 soc chosen uart0@1c20000 i2c0@1c30000 gpio@1c40000 spi0@1c50000 cpu@0 cpu@1 调试提示 使用 dtc -I dtb -O dts 反编译DTB后,可通过节点路径快速定位硬件配置问题

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