设备树的语法构成是其核心设计的基础,用于以结构化的方式描述硬件信息。以下是设备树语法的详细构成及关键要素,按模块化分类呈现:
一、设备树文件的基本结构
设备树文件(.dts
)以树状结构组织,包含根节点、子节点和属性,语法规则严格遵循以下形式:
/ { // 根节点
[属性列表]
子节点1 {
[属性列表]
子子节点 {
[属性列表]
}
}
子节点2 {
[属性列表]
}
};
二、语法要素详解
1. 节点(Node)
- 定义:描述硬件设备或总线,格式为
标签: 节点名@地址 { ... }
。- 标签:可选,用于引用节点(如
i2c0: i2c@fe002000
)。 - 节点名:硬件类型(如
i2c
、memory
)。 - 地址:可选,设备在总线上的地址(如
0xfe002000
)。
- 标签:可选,用于引用节点(如
- 示例:
i2c0: i2c@fe002000 { // 标签i2c0指向节点i2c@fe002000 compatible = "fsl,imx28-i2c"; };
2. 属性(Property)
- 定义:键值对,格式为
属性名 = 属性值;
。 - 常见属性类型:
- 字符串:
compatible = "vendor,model";
- 整数(32位):
reg = <0xfe002000 0x1000>;
- 整数数组:
interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;
- 二进制数据:
local-mac-address = [00 01 02 03 04 05];
- 空值:
status = "disabled";
- 字符串:
3. 属性值语法
- 整数表示:
- 十进制:
123
- 十六进制:
0xfe002000
- 符号化常量:
GIC_SPI
(需在头文件中定义)
- 十进制:
- 数组格式:用尖括号
< >
包裹,元素用空格分隔:reg = <0xfe002000 0x1000>; // 起始地址+长度
- 字符串格式:用双引号包裹,可包含转义字符(如
\"
):model = "My Custom Board";
4. 特殊节点
/
(根节点):描述系统级信息,如:/ { compatible = "vendor,my-board"; model = "My Custom Board"; };
aliases
节点:为常用节点提供别名:aliases { ethernet0 = ð0; // eth0是节点标签 };
chosen
节点:传递启动参数(如bootargs
):chosen { bootargs = "console=ttyS0,115200"; };
5. 引用(Phandle & Referencing)
- Phandle:为节点分配唯一标识符(由编译器自动生成),用于跨节点引用。
- 引用语法:
&标签
,如:i2c0: i2c@fe002000 { status = "okay"; }; temp_sensor: temp@48 { compatible = "vendor,temp-sensor"; i2c-bus = &i2c0; // 引用i2c0节点 };
6. 注释
- 单行注释:
// 注释内容
- 多行注释:
/* 注释内容 */
三、设备树语法规则总结
- 缩进与层级:
- 子节点需缩进(通常2/4空格),层级关系清晰。
- 示例:
/ { cpu0: cpu@0 { device_type = "cpu"; }; };
- 分号与逗号:
- 属性声明以分号结尾(
;
)。 - 数组元素用空格分隔(非逗号)。
- 属性声明以分号结尾(
- 标签与引用:
- 标签用于引用节点,避免重复定义。
- 引用需用
&
符号(如&i2c0
)。
- 头文件与宏:
- 可通过
#include
引入公共定义(如寄存器地址)。 - 示例:
#include "my-board-defs.dtsi"
- 可通过
四、语法示例:完整设备树片段
/ {
compatible = "vendor,my-board";
model = "My Custom Board";
memory {
device_type = "memory";
reg = <0x80000000 0x20000000>; // 512MB内存
};
i2c0: i2c@fe002000 {
compatible = "fsl,imx28-i2c";
reg = <0xfe002000 0x1000>;
interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;
status = "okay";
temp_sensor: temp@48 {
compatible = "vendor,temp-sensor";
reg = <0x48>;
};
};
};
五、关键点总结
- 树状结构:通过节点嵌套描述硬件拓扑。
- 属性驱动:所有硬件配置通过属性定义。
- 引用机制:通过标签和
&
符号实现节点复用。 - 标准化格式:严格遵循键值对、数组、字符串等语法规则。
设备树的语法设计旨在平衡灵活性与可读性,使硬件描述既可被编译器解析,又易于人工维护。掌握这些语法规则是开发嵌入式Linux设备驱动的基础。