3. 设备树基础:语法、节点、属性、reg、interrupts 等基本概念
设备树(Device Tree,DT)是嵌入式 Linux 系统中用于描述硬件拓扑结构的一种数据结构。在 USB Gadget 适配中,设备树是连接 SoC 内部 USB 控制器与外部物理接口(如 DWC3、ChipIdea)的关键桥梁。本章将系统讲解设备树的语法、节点、属性以及 reg、interrupts 等核心概念,为后续编写 USB Gadget 设备树节点打下基础。
学习目标:掌握设备树的基本语法规则;理解节点、属性、
reg、interrupts 的含义与用法;能够读懂并修改 USB 控制器相关的设备树片段。
3.1 设备树概述
设备树是一种树形结构,每个硬件设备对应一个节点(node),节点包含若干属性(property)来描述设备的配置信息。内核通过解析设备树来发现硬件资源,避免在代码中硬编码地址、中断号等参数。
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 控制器基地址一致,否则内核将无法正确访问硬件寄存器。
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 中,板级差异通过 &节点引用 覆盖,避免重复定义。