设备树Device Tree在嵌入式Linux中的硬件描述¶
难度:🔴 高级 | 领域:Linux硬件抽象 | 阅读时间:约 14 分钟
日常类比¶
新公寓不靠把插座焊进墙体结构,而靠平面图标清位置。设备树(Device Tree)是内核的平面图:硬件地址、中断、时钟从内核 C 板文件里拆出,换板多半换 .dtb,不必为每个变体重编整棵板级代码树[1][2]。
摘要¶
DTS(源)→ DTC 编译 → DTB → Bootloader 传给内核。驱动靠 compatible 匹配;reg/interrupts/clocks/status 描述资源。Overlay 支持 HAT/多版本;IoT 上常用 status 关掉无用外设省电。语法细节以 Devicetree Specification 与内核绑定文档为准[1][4]。
1. 从板文件到 DT¶
旧板文件硬编码 I2C 地址与 GPIO 中断,变体爆炸、违背“内核少含板级常数”。DT 把描述外置;PowerPC 先行,ARM 随后成为主流[2][3]。
2. 语法与匹配¶
| 属性 | 作用 |
|---|---|
| compatible | 与驱动 of_device_id 匹配 |
| reg | 地址/长度或 I2C/SPI 地址 |
| interrupts | 中断号与触发类型 |
| clocks / *-supply | 时钟与电源引用 |
| status | okay / disabled |
| #address-cells / #size-cells | 子节点 reg 格式 |
顶层常见:cpus、memory、chosen(bootargs/stdout)、soc、板级节点。compatible 拼写差一个字符即绑定失败[1][4]。
3. 编译、加载与 Overlay¶
Overlay(.dtbo)在基础树上打补丁,适合扩展板与硬件版本分支;需 bootloader/内核支持应用流程[5]。
| 机制 | 用途 |
|---|---|
| pinctrl | 引脚复用,防外设抢脚 |
| gpio-leds 等 | 板级简单设备 |
| status=disabled | 关 USB/GPU 等降功耗 |
4. 调试¶
/proc/device-tree、dtc -I fs 反编译、dmesg 看 probe/deferred;/sys/bus/.../driver 确认绑定。常见坑:未 status = "okay"、reg 与手册不符、中断父节点错误、pinctrl 冲突[4][6]。
5. 局限、挑战与可改进方向¶
1. 以为改 DTS 等于改驱动逻辑¶
局限:错误绑定或资源拿不到时驱动仍失败。
改进:同时核对绑定文档与 dmesg;用 schema/校验工具[1][7]。
2. Overlay 滥用导致状态难复现¶
局限:运行时补丁栈使现场 DT 不可追溯。 改进:版本化 dtbo;出厂固定组合;记录生效树哈希[5]。
3. 关掉节点不等于时钟门控完成¶
局限:status 禁用后仍可能有残留功耗路径。 改进:结合时钟/电源域与实测电流[8]。
4. 多 SoC 拷贝样例 DTS¶
局限:地址与中断错位难查。
改进:从厂商 SoC .dtsi 继承,只覆写板级差异[2][4]。
6. 实践要点¶
- 记住三映射:compatible→驱动,reg→地址,interrupts→中断。
- 板级文件显式启用需要的外设。
- 量产前冻结 DT 与 Overlay 集合并做绑定回归。
参考文献¶
[1] devicetree.org, Devicetree Specification.
[2] kernel.org, Device Tree usage / ARM DT migration notes.
[3] Free Electrons / Bootlin, Device Tree for Dummies / training materials.
[4] Linux kernel device tree binding documents.
[5] Raspberry Pi / BeagleBone overlay documentation; Linaro overlay notes.
[6] U-Boot FDT load and booti/bootm device tree passing.
[7] dt-schema / dtbs_check validation tooling.
[8] SoC power domain and clock gating documentation (vendor TRMs).
[9] pinctrl subsystem device tree bindings.
[10] /proc/device-tree and runtime DT debugging guides.
[11] IoT multi-revision hardware via DT overlays — deployment notes.