1. 设备树(Device Tree)基础概念解析
在嵌入式Linux开发中,设备树(Device Tree)已经成为外设驱动开发的标准配置方式。我第一次接触设备树是在2014年为一个RK3288平台开发触摸屏驱动时,当时内核刚从board file过渡到DTS方式,整个团队都在适应这种新的硬件描述方式。
设备树本质上是一种描述硬件资源的数据结构,采用节点(node)和属性(property)的树状结构来定义系统中的各种硬件设备。与传统的board file相比,它的优势主要体现在三个方面:
- 硬件描述与内核解耦:过去每个板级配置都需要修改内核源码并重新编译,现在只需修改独立的.dts文件
- 可重用性:相同的SoC可以搭配不同的外设,通过设备树覆盖(dtbo)实现配置复用
- 可读性:文本格式的.dts文件比C代码更直观,支持注释和宏定义
实际开发中发现,设备树文件虽然直观,但语法错误常常导致难以排查的启动问题。建议在修改后使用dtc工具进行语法检查:
dtc -I dts -O dtb -o test.dtb test.dts
2. 设备树核心语法与结构详解
2.1 基础语法规则
设备树源文件(.dts)采用类似C语言的语法结构,但有其特殊规则:
dts复制// 示例:定义一个GPIO控制器节点
gpio0: gpio@ff720000 {
compatible = "rockchip,gpio-bank";
reg = <0xff720000 0x100>;
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
#gpio-cells = <2>;
gpio-controller;
};
关键元素解析:
- 节点命名:采用
label: name@address格式,label可省略 - 属性赋值:使用
property = value;形式,值可以是字符串、数组或phandle - 数据类型:
- 字符串:用双引号包裹(
"text") - 整数:
< >包裹的32位无符号数(<0x12345678>) - 字符串列表:(`"str1", "st
- 字符串:用双引号包裹(
