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 在不同输入输出格式下的数据流向与核心处理步骤:
4.5 常见编译错误与参数调优
在实际调试中,dtc 的报错信息往往直接指向参数使用不当或源文件语法问题。以下是最常见的三类错误及对应的参数调整策略:
- 格式不匹配错误:当
-I指定的格式与实际文件内容不符时,dtc会立即报错退出。例如,将.dtb文件误用-I dts解析。 - 语法/语义警告:默认情况下,
dtc对许多非致命问题仅输出警告。使用-W可启用更多检查,使用-E可将特定警告升级为错误,强制修复。 - 符号节点缺失:在编译设备树叠加层时,若未使用
-@参数,生成的.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 版本,避免因版本差异导致编译行为不一致。