一、设备树基本概念
设备树(Device Tree)是Linux内核中用于描述硬件配置的数据结构,采用树形节点组织方式,以.dts源文件和.dtb二进制文件两种形式存在。在ARM嵌入式Linux开发中,设备树取代了传统的板级代码(board file),使得同一内核镜像可以支持多种硬件平台。设备树的核心思想是将硬件描述与内核代码分离:每个硬件平台只需提供对应的设备树文件来描述其外设配置,内核在启动时解析设备树并据此初始化和配置驱动程序。这种机制极大地提高了Linux在嵌入式领域的可移植性和代码复用率,已成为主流ARM SoC(如i.MX、STM32MP、Rockchip、Allwinner等)的标准做法,也是Linux驱动开发者必须掌握的基础知识。
二、节点与属性语法
设备树的基本语法单元是节点(Node),每个节点代表一个硬件设备或总线。节点放在花括号内,根节点用斜杠表示,子节点嵌套在父节点内。每个节点包含若干属性,属性以key等于value的形式定义。compatible属性是最重要的属性之一,用字符串列表描述设备的兼容性信息,内核驱动通过匹配compatible字符串找到对应的驱动程序。例如某I2C设备的compatible为ti,tmp102,内核中的tmp102驱动会与之匹配。reg属性描述设备的寄存器地址和大小范围,格式与父总线的地址编码方式相关。status属性取值okay、disabled或fail,控制设备是否启用。标签(Label)可以给节点起别名,方便在其他位置引用。
三、中断定义与pinctrl配置
中断是嵌入式系统中常见的硬件交互机制。在设备树中定义中断需要三个关键属性:interrupt-parent指向中断控制器的phandle引用;interrupts定义中断号及触发类型(上升沿、下降沿、高电平、低电平触发);interrupt-names为中断命名以便驱动通过名称获取中断资源。对于GPIO作为中断源的场景,可使用gpios属性结合中断属性。pinctrl(Pin Control)子系统负责管理SoC的引脚复用和电气特性配置。在设备树中,通常在pinctrl节点下定义各种引脚配置子节点,然后在设备节点中通过pinctrl-0和pinctrl-names等属性引用。引脚配置包括功能复用、上下拉电阻、驱动强度和速率等参数。
四、设备树覆盖与实战示例
设备树覆盖(Device Tree Overlay)是在运行时动态修改设备树的机制,广泛应用于树莓派和BeagleBone等开发板的扩展板识别。Overlay以.dtbo文件形式存在,通过configfs接口加载到内核,在不重启系统的情况下添加或修改硬件配置。一个完整的实战示例:在基于i.MX6ULL的开发板上配置一个I2C接口的OLED显示屏。首先在根节点下添加i2c总线节点描述,包括时钟频率和pinctrl配置;然后在i2c节点内添加ssd1306设备子节点,指定compatible、i2c地址以及分辨率属性。编译设备树使用dtc工具,命令为dtc -I dts -O dtb -o output.dtb input.dts。调试时可通过proc/device-tree目录查看当前生效的设备树内容,也可使用dtc工具将dtb反向编译为dts进行分析验证。
|