设备树:dtc 反编译与编译
更新时间:2026-09-21。硬件工具。适用于嵌入式 Linux(裸机不使用设备树)。
一句话回答
dtc 是设备树编译器:用 dtc -I dtb -O dts 把板子上的二进制 .dtb 反编译成可读 .dts,看硬件实际被怎么描述;改完用 dtc -I dts -O dtb 编译回 dtb。运行中的系统还能直接在 /proc/device-tree(或 /sys/firmware/devicetree)查看生效的设备树。
一、安装
bash
sudo apt install device-tree-compiler
dtc --version二、反编译:从板子的 dtb 看内容
bash
# 板子上的 dtb 通常在 boot 分区(如 /boot/*.dtb)
dtc -I dtb -O dts -o board.dts board.dtb
# 或直接:
fdtdump board.dtb | less这是排查「某外设为什么没起来」的第一步——先确认内核实际拿到的节点和属性。
三、编译:改完转回 dtb
bash
dtc -I dts -O dtb -o new.dtb board.dts-I 指定输入格式、-O 输出格式;dts/dtb/fs(/proc 那种文件系统布局)。
四、查看运行时设备树
bash
ls /proc/device-tree
find /proc/device-tree -name 'status' | xargs grep -l "okay"
# 某些架构路径是:
ls /sys/firmware/devicetree/base五、Overlay
bash
dtc -I dts -O dtb -o my-overlay.dtbo my-overlay.dtso
# 加载方式取决于发行版(configfs 或 /boot/overlays 配置)常见坑
- 直接改反编译产物再编回去丢信息:反编译结果可能丢失 phandle 标号/注释,能调试但不适合作为长期维护源,维护应在源码 dts/dtsi 上改。
- 编译警告忽视:
reg/ranges与#address-cells/#size-cells不匹配的警告往往就是地址错的根因。 - include 路径找不到:dts 里
/include/或.dtsi依赖内核源码树,编译时要给-i或在内核构建里编。 - 改了 dts 但没更新启动加载的 dtb:bootloader 加载的位置要确认,改对文件、放对路径。
- status 还是 disabled:节点存在不等于启用,看
status="okay"。 - 裸机误用:设备树是给有 bootloader/OS(Linux)传递硬件信息用的,纯裸机固件通常用不到。
总结
dtc 在 dts 源和 dtb 二进制之间转换:-I dtb -O dts 反编译查看板子真实设备树、-I dts -O dtb 编译,运行时再看 /proc/device-tree;排查外设先确认实际节点、status 和地址单元,长期修改应在源码 dts/dtsi 而非反编译产物上进行。