3. 设备树基础:语法、节点、属性、reg、interrupts 等基本概念

设备树(Device Tree,DT)是嵌入式 Linux 系统中用于描述硬件拓扑结构的一种数据结构。在 USB Gadget 适配中,设备树是连接 SoC 内部 USB 控制器与外部物理接口(如 DWC3、ChipIdea)的关键桥梁。本章将系统讲解设备树的语法、节点、属性以及 reg、interrupts 等核心概念,为后续编写 USB Gadget 设备树节点打下基础。

学习目标:掌握设备树的基本语法规则;理解节点、属性、reg、interrupts 的含义与用法;能够读懂并修改 USB 控制器相关的设备树片段。

3.1 设备树概述

设备树是一种树形结构,每个硬件设备对应一个节点(node),节点包含若干属性(property)来描述设备的配置信息。内核通过解析设备树来发现硬件资源,避免在代码中硬编码地址、中断号等参数。

设备树结构示意图 / (根节点) soc chosen memory usb@xxx i2c@xxx uart@xxx dwc3@xxx phy@xxx 节点层级关系 根节点 / 包含 soc、chosen 等 soc 节点包含 usb、i2c 等外设 usb 节点包含 dwc3、phy 等子节点

3.2 设备树语法基础

设备树源文件(.dts)采用树形结构,使用大括号表示层级,分号结束语句。基本语法规则如下:

  • 节点定义:node-name@unit-address { ... };
  • 属性赋值:property-name = <value>;
  • 字符串属性:compatible = "vendor,device";
  • 数值数组:reg = <0x12340000 0x1000>;
  • 布尔属性:status = "okay"; 或 status = "disabled";
  • 包含文件:#include "soc.dtsi"
示例:一个简单的 USB 控制器节点
/ {
    soc {
        usb@fe800000 {
            compatible = "snps,dwc3";
            reg = <0xfe800000 0x10000>;
            interrupts = <0 39 4>;
            dr_mode = "peripheral";
            status = "okay";
        };
    };
};

3.3 节点(Node)

节点是设备树的基本组成单元,每个节点代表一个硬件设备或总线。节点名称通常由 名称 和 单元地址 两部分组成,中间用 @ 分隔。

节点类型 命名规则 示例 说明
根节点 / / { }; 设备树的顶层节点,所有设备均挂载其下
CPU 节点 cpu@<id> cpu@0 { }; 描述 CPU 核心,包含时钟、缓存等信息
内存节点 memory@<addr> memory@40000000 { }; 描述系统内存的起始地址和大小
外设节点 <name>@<base> usb@fe800000 { }; 描述 USB、I2C、UART 等外设控制器
子节点 嵌套在父节点内 dwc3@fe800000 { }; 父节点下的具体设备实例

3.4 属性(Property)

属性用于描述节点的特征,包括硬件地址、中断号、兼容性、状态等。常见属性分类如下:

属性名 类型 含义 USB Gadget 典型值
compatible 字符串 设备兼容性标识,用于驱动匹配 "snps,dwc3"
reg 数值数组 寄存器地址和长度 <0xfe800000 0x10000>
interrupts 数值数组 中断号、触发类型 <0 39 4>
dr_mode 字符串 USB 工作模式 "peripheral"
status 字符串 设备启用状态 "okay" 或 "disabled"
clocks phandle 数组 时钟源引用 <&clkc 28>

3.5 reg 属性详解

reg 属性用于描述设备在系统总线上的地址空间,格式为 <地址 长度>。对于 USB 控制器,通常包含以下信息:

  • 基地址:控制器寄存器的起始物理地址。
  • 地址长度:寄存器映射的内存大小(通常为 4KB 或 64KB)。
  • 多段地址:某些设备有多个地址段,如 reg = <0xfe800000 0x10000 0xfe900000 0x1000>;
注意:在 USB Gadget 适配中,reg 的地址必须与 SoC 数据手册中的 USB 控制器基地址一致,否则内核将无法正确访问硬件寄存器。
reg 属性地址映射示意图 系统总线地址空间 USB 控制器寄存器 0xfe800000 - 0xfe80ffff I2C 控制器 0xfe810000 - ... UART 0xfe820000 - ... reg = <0xfe800000 0x10000> 表示基地址 0xfe800000,映射长度 0x10000(64KB)

3.6 interrupts 属性详解

interrupts 属性描述设备使用的中断资源,格式通常为 <中断控制器 中断号 触发类型>。在 ARM 系统中,常见格式如下:

字段 含义 典型值 说明
中断控制器 GIC 类型 0 或 GIC_SPI 0 表示 SPI(共享外设中断),1 表示 PPI(私有外设中断)
中断号 硬件中断编号 39 相对于 GIC 的中断号,需参考 SoC 手册
触发类型 中断触发方式 4 1=上升沿,2=下降沿,4=高电平,8=低电平
示例:interrupts = <0 39 4>; 表示 SPI 中断,中断号 39,高电平触发。

3.7 其他常用属性

在 USB Gadget 设备树中,以下属性也经常出现:

  • compatible:驱动匹配的关键字符串,如 "snps,dwc3" 对应 DWC3 驱动。
  • dr_mode:指定 USB 控制器的工作模式,可选 "host"、"peripheral"、"otg"。
  • maximum-speed:限制 USB 最高速率,如 "high-speed"、"super-speed"。
  • phys:引用 PHY 节点,如 <&usb2_phy>。
  • snps,dis_u2_susphy_quirk:布尔属性,禁用 USB2 挂起 PHY quirks。

3.8 设备树包含与覆盖

实际项目中,设备树通常分为 .dtsi(包含文件)和 .dts(板级文件)。.dtsi 定义 SoC 通用部分,.dts 覆盖或添加板级特定配置。

// soc.dtsi — SoC 通用定义
soc {
    usb@fe800000: usb@fe800000 {
        compatible = "snps,dwc3";
        reg = <0xfe800000 0x10000>;
        interrupts = <0 39 4>;
        status = "disabled";   // 默认关闭
    };
};

// board.dts — 板级文件
#include "soc.dtsi"

&usb@fe800000 {
    status = "okay";           // 板级启用
    dr_mode = "peripheral";
    maximum-speed = "super-speed";
};
最佳实践:将 SoC 通用配置放在 .dtsi 中,板级差异通过 &节点引用 覆盖,避免重复定义。

3.9 本章小结