1. 引言
在嵌入式 Linux 设备开发中,设备树(Device Tree, DT) 是用来描述硬件的关键数据结构。它允许操作系统无需修改内核代码即可适配不同的硬件平台。
设备树采用 层次化结构 组织硬件信息,每个节点(Node) 代表一个设备,每个属性(Property) 记录设备的详细信息。本篇文章将准确、清晰、符合官方定义地介绍设备树中的属性,并提供易于理解的示例。
2. 什么是设备树属性(Property)?
在 Device Tree Specification(设备树规范) 中,属性(Properties) 是 键值对(key-value pair),用于存储与设备相关的信息。每个设备树节点都可以包含多个属性。
官方定义:
“A property is a name-value pair associated with a node.”
(属性是与节点关联的键值对。)
属性的基本格式
<属性名> = <属性值>;
示例:
model = "NXP i.MX8MM Board";
status = "okay";
reg = <0x30200000 0x10000>;
解析:
model
是一个字符串属性,用于描述设备名称。status
是一个设备状态属性,okay
表示启用,disabled
表示禁用。reg
是一个数组属性,存储设备的寄存器地址(0x30200000
)和大小(0x10000
)。
3. 设备树的标准属性(Standard Properties)
标准属性由 Device Tree Specification 定义,适用于所有设备。
3.1 compatible
(驱动匹配)
compatible
属性用于设备与驱动的匹配。
uart4: serial@30200000 {compatible = "fsl,imx8mm-uart", "ns16550";reg = <0x30200000 0x10000>;status = "okay";
};
解释:
compatible = "fsl,imx8mm-uart"
告诉内核,这个设备是 NXP i.MX8MM 的 UART 设备。ns16550
是通用 UART 设备的兼容名称。
3.2 reg
(寄存器地址)
reg
定义设备的寄存器映射。
reg = <0x30200000 0x10000>;
解释:
0x30200000
是设备的起始地址。0x10000
是设备占用的地址范围(64 KB)。
3.3 interrupts
(中断配置)
interrupts
指定设备的中断号。
interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
解释:
GIC_SPI
代表使用全局中断控制器。65
是中断号。IRQ_TYPE_LEVEL_HIGH
说明此中断为高电平触发。
3.4 clocks
(时钟管理)
clocks
和 clock-names
设定设备的时钟源。
clocks = <&clk IMX8MM_CLK_UART4>;
clock-names = "uart";
解释:
clocks
指向外部时钟IMX8MM_CLK_UART4
。clock-names
赋予该时钟一个名称uart
。
3.5 gpios
(GPIO 配置)
设备树中可以使用 gpios
连接外部 GPIO 设备,如 LED。
led0: led {gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>;
};
解析:
- LED 连接到 GPIO1 的第 10 号引脚。
GPIO_ACTIVE_HIGH
说明高电平点亮 LED。
4. 设备树的非标准属性(Vendor-Specific Properties)
厂商(Vendor)可以定义自己的属性,必须使用唯一的前缀(如 fsl,
、qcom,
、ti,
)。
示例:
fsl,channel-fifo-len = <64>;
qcom,pmic-voltage = <3300000>;
ti,am335x-gpio-rising-edge;
解析:
fsl,channel-fifo-len
→ NXP 自定义 FIFO 长度。qcom,pmic-voltage
→ Qualcomm PMIC 供电电压(单位 µV)。ti,am335x-gpio-rising-edge
→ TI 定义的 GPIO 触发模式(布尔值,仅存在即为 true)。
5. 布尔类型属性(Boolean Properties)
布尔值属性没有值,仅存在即为 true。
cache-coherent;
解释:
cache-coherent
存在,表示设备支持缓存一致性。- 如果该属性缺失,则默认为 false。
6. 设备树属性总结
类别 | 示例 | 说明 |
---|---|---|
标准属性 | compatible , reg , status | 适用于所有设备 |
电源管理 | power-supply , voltage-min-microvolt | 适用于电源管理 |
时钟管理 | clocks , clock-names | 适用于需要时钟的设备 |
GPIO 配置 | gpios , gpio-controller | 适用于 GPIO 设备 |
厂商属性 | fsl,channel-fifo-len | 适用于特定厂商 |
布尔值属性 | cache-coherent | 仅存在即为 true |
7. 结论
- 标准属性 适用于所有设备,由设备树规范定义。
- 非标准属性 需使用 厂商前缀,避免冲突。
- 布尔类型属性 没有值,仅存在即为 true。
这样组织的设备树属性清晰、符合官方规范,并且易于理解。希望这篇文章能帮助你更好地掌握设备树属性的使用!