设备树Device Tree)是嵌入式系统中描述硬件拓扑和资源分配的数据结构,常用于告诉 Linux kernel 这块板子有哪些设备、地址、中断、时钟、电源和引脚配置。

核心问题

PC 设备可以通过 PCI、ACPI 等机制发现大量硬件,但许多嵌入式板卡没有统一的硬件自描述能力。同一颗 SoC 上的外设控制器也可能因为板级设计不同而连接到不同芯片、不同 GPIO 和不同电源域。

设备树解决的是“内核如何在不为每块板子硬编码 C 代码的情况下理解板级硬件”的问题。

核心机制

设备树通常由 .dts.dtsi.dtb 组成:

  • DTS:Device Tree Source,人类可读的设备树源码。
  • DTSI:可被多个 DTS include 的公共片段,常用于 SoC 级定义。
  • DTB:Device Tree Blob,编译后的二进制设备树,由 Bootloader 传给内核。

设备树用树状节点描述硬件。例如一个 I2C 总线节点下挂触摸芯片、PMIC 或传感器节点;每个节点通过 compatiblereginterruptsclocksgpiospinctrl 等属性告诉驱动如何匹配和初始化设备。

工程用途

设备树是 设备 BSP 中最常修改、也最容易出错的部分之一:

  • 板级 bring-up:打开串口、网口、存储、显示、摄像头和电源芯片。
  • 驱动匹配:通过 compatible 字符串让内核选择正确驱动。
  • 资源描述:配置 MMIO 地址、中断号、DMA、时钟、reset 和 regulator。
  • 引脚复用:定义 pinmux、上下拉、电平和驱动强度。
  • 硬件版本管理:不同 board revision 使用不同 DTS 或 overlay。

边界与常见坑

  • 设备树不是驱动:它描述硬件,真正控制设备的是内核驱动。
  • 设备树不是硬件发现:它是对硬件的声明,写错了内核也会按错误描述尝试初始化。
  • compatible 不是随便写的名字:它必须和驱动绑定文档及驱动匹配表一致。
  • GPIO 极性和 pinmux 很容易错:电平反了、复用没切、上下拉不对,都会表现为设备不可用。
  • SoC 级 DTSI 和板级 DTS 要分清:前者描述芯片内部能力,后者描述板子实际连接。
  • 改完 DTS 不等于系统用了新 DTB:还要确认镜像打包、boot 分区、bootloader 加载路径和启动日志。

相关术语