4. 基本编译命令与参数:dtc -I dts -O dtb -o output.dtb input.dts 等常用参数详解

dtc(Device Tree Compiler)是设备树源文件(.dts)与二进制设备树(.dtb)之间转换的核心工具。掌握其基本命令与参数,是调试设备树编译报错的第一步。本节将系统讲解最常用的编译命令格式及关键参数的作用。

4.1 标准编译命令格式

dtc 的基本调用语法如下:

dtc [选项] [输入文件]

最常用的编译命令是将 .dts 源文件编译为 .dtb 二进制文件:

dtc -I dts -O dtb -o output.dtb input.dts

其中:

  • -I dts:指定输入格式为设备树源文件(.dts)。
  • -O dtb:指定输出格式为设备树二进制文件(.dtb)。
  • -o output.dtb:指定输出文件名。
  • input.dts:输入源文件。
💡 提示:如果省略 -o 参数,dtc 默认将输出写入标准输出(stdout),这在管道操作中非常有用。

4.2 核心参数详解

下表列出了 dtc 最常用的参数及其功能说明:

参数 完整形式 功能说明 典型值/示例
-I --in-format 指定输入文件格式 dts(源文件)、dtb(二进制)、fs(文件系统)
-O --out-format 指定输出文件格式 dtb(二进制)、dts(源文件)、asm(汇编)
-o --out 指定输出文件名 output.dtb、output.dts
-@ --symbols 生成符号节点(用于设备树叠加层) 无参数,直接使用 -@
-H --phandle 指定 phandle 生成策略 epapr(默认)、linux、both
-W --warning 启用特定警告 reg_format、unit_address_vs_reg
-E --error 将特定警告升级为错误 reg_format、graphics
-v --version 显示 dtc 版本信息 无参数
-h --help 显示帮助信息 无参数

4.3 常用编译场景

场景一:将 .dts 编译为 .dtb

这是最基础的用法,用于生成内核可识别的二进制设备树:

dtc -I dts -O dtb -o myboard.dtb myboard.dts

场景二:反编译 .dtb 为 .dts

用于调试或查看已编译的设备树内容:

dtc -I dtb -O dts -o myboard.dts myboard.dtb

场景三:生成设备树叠加层(DTO)

使用 -@ 参数生成包含符号节点的 .dtbo 文件:

dtc -I dts -O dtb -@ -o overlay.dtbo overlay.dts

场景四:启用严格检查模式

将常见警告升级为错误,提前发现潜在问题:

dtc -I dts -O dtb -o output.dtb input.dts -W reg_format -W unit_address_vs_reg -E reg_format
⚠️ 注意:在调试阶段,建议始终使用 -W 和 -E 参数启用严格检查。许多隐蔽的节点错误(如 reg 属性格式错误、单元地址不匹配)在默认编译下仅产生警告,容易被忽略,但在实际硬件初始化时会导致设备无法正常工作。

4.4 编译流程与数据流向

下图展示了 dtc 在不同输入输出格式下的数据流向与核心处理步骤:

dtc 编译流程与数据流向 输入文件 .dts / .dtb / .dtsi 格式解析器 -I dts / -I dtb 内部表示 Flattened Device Tree 输出生成器 -O dtb / -O dts 输出文件 .dtb / .dts / .dtbo 关键参数作用 • -I:指定输入解析器 • -O:指定输出生成器 调试辅助参数 • -W:启用警告 • -E:升级为错误

4.5 常见编译错误与参数调优

在实际调试中,dtc 的报错信息往往直接指向参数使用不当或源文件语法问题。以下是最常见的三类错误及对应的参数调整策略:

  1. 格式不匹配错误:当 -I 指定的格式与实际文件内容不符时,dtc 会立即报错退出。例如,将 .dtb 文件误用 -I dts 解析。
  2. 语法/语义警告:默认情况下,dtc 对许多非致命问题仅输出警告。使用 -W 可启用更多检查,使用 -E 可将特定警告升级为错误,强制修复。
  3. 符号节点缺失:在编译设备树叠加层时,若未使用 -@ 参数,生成的 .dtbo 文件将缺少符号节点,导致运行时加载失败。
🔧 调试建议:在项目初期,建议在 Makefile 或编译脚本中固定使用以下参数组合,以最大化编译检查的严格性:
dtc -I dts -O dtb -@ -W reg_format -W unit_address_vs_reg -E reg_format -o $(OUTPUT).dtb $(INPUT).dts

4.6 参数组合速查表

以下表格总结了不同调试目标下的推荐参数组合:

调试目标 推荐参数组合 说明
基础编译 -I dts -O dtb -o output.dtb input.dts 最简编译,适用于快速验证
反编译查看 -I dtb -O dts -o output.dts input.dtb 将二进制还原为可读源文件
严格检查编译 -I dts -O dtb -W reg_format -W unit_address_vs_reg -E reg_format -o output.dtb input.dts 启用额外警告,并将 reg_format 升级为错误
叠加层编译 -I dts -O dtb -@ -o overlay.dtbo overlay.dts 生成带符号节点的设备树叠加层
全量检查编译 -I dts -O dtb -@ -W all -E all -o output.dtb input.dts 启用所有警告并全部升级为错误(最严格)
💡 进阶技巧:使用 dtc -h 可以查看当前版本支持的所有 -W 和 -E 选项。不同版本的 dtc 可能支持不同的检查项,建议在开发环境中统一 dtc 版本,避免因版本差异导致编译行为不一致。