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(时钟管理)

clocksclock-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。

这样组织的设备树属性清晰、符合官方规范,并且易于理解。希望这篇文章能帮助你更好地掌握设备树属性的使用!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐