4. USB控制器设备树绑定
USB控制器(USB Controller)是SoC内部负责实现USB协议栈的硬件模块,其设备树节点(Device Tree Node)描述了控制器的寄存器基址、中断号、时钟、复位、PHY接口以及DMA能力等关键资源。本章将系统讲解通用USB控制器节点的绑定规范,并逐一给出EHCI、OHCI、xHCI以及DWC3控制器的完整设备树示例。
4.1 通用USB控制器节点绑定规范
所有USB控制器节点共享一组核心属性,这些属性在Documentation/devicetree/bindings/usb/generic.txt中有明确定义。下表列出了通用USB控制器节点的标准属性及其说明:
| 属性名 | 类型 | 是否必需 | 说明 |
|---|---|---|---|
| compatible | string | 必需 | 控制器兼容字符串,如"usb-ehci"、"snps,dwc3" |
| reg | u32/u64 数组 | 必需 | 寄存器基址和长度,通常为1组地址 |
| interrupts | u32 数组 | 必需 | 控制器中断号,支持SPI或PPI类型 |
| phys | phandle 数组 | 推荐 | 指向USB PHY节点的引用列表 |
| phy-names | string 数组 | 推荐 | 与phys对应的PHY名称,如"usb2-phy"、"usb3-phy" |
| dr_mode | string | 可选 | 控制器工作模式:host、peripheral、otg |
| maximum-speed | string | 可选 | 限制最高速度:high-speed、super-speed等 |
| clocks | phandle 数组 | 可选 | 控制器时钟源,通常包含AHB时钟和UTMI时钟 |
| resets | phandle 数组 | 可选 | 控制器复位信号 |
4.2 EHCI/OHCI控制器设备树节点示例
EHCI(Enhanced Host Controller Interface)和OHCI(Open Host Controller Interface)是USB 2.0时代最经典的主机控制器对。在大多数SoC中,EHCI负责高速(480 Mbps)传输,OHCI负责全速/低速(12/1.5 Mbps)传输,两者共享同一个USB PHY。
以下是一个典型的EHCI+OHCI组合设备树节点示例:
/* EHCI控制器节点 */
usb_ehci: usb@ee080000 {
compatible = "generic-ehci", "usb-ehci";
reg = <0x0 0xee080000 0x0 0x100>;
interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
phys = <&usb_phy0>;
phy-names = "usb";
clocks = <&clkc CLK_USB_EHCI>;
resets = <&rstc RST_USB_EHCI>;
status = "okay";
};
/* OHCI控制器节点 */
usb_ohci: usb@ee090000 {
compatible = "generic-ohci", "usb-ohci";
reg = <0x0 0xee090000 0x0 0x100>;
interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
phys = <&usb_phy0>;
phy-names = "usb";
clocks = <&clkc CLK_USB_OHCI>;
resets = <&rstc RST_USB_OHCI>;
status = "okay";
};
下图展示了EHCI/OHCI控制器与PHY、系统总线之间的硬件连接关系:
4.3 xHCI控制器设备树节点示例
xHCI(eXtensible Host Controller Interface)是USB 3.0时代的主机控制器标准,向下兼容USB 2.0和USB 1.x。xHCI控制器通常需要同时连接USB2 PHY和USB3 PHY,或者使用一个支持双模式的SuperSpeed PHY。
以下是一个典型的xHCI控制器设备树节点:
/* xHCI控制器节点 */
usb_xhci: usb@f0930000 {
compatible = "xlnx,zybo-z7-xhci", "generic-xhci", "usb-xhci";
reg = <0x0 0xf0930000 0x0 0x10000>;
interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
phys = <&usb2_phy>, <&usb3_phy>;
phy-names = "usb2-phy", "usb3-phy";
clocks = <&clkc CLK_USB_XHCI>;
resets = <&rstc RST_USB_XHCI>;
maximum-speed = "super-speed";
dr_mode = "host";
status = "okay";
};
xHCI控制器的中断处理比EHCI/OHCI更复杂,因为它需要处理所有端口的事件。下表对比了三种主机控制器的关键差异:
| 特性 | EHCI | OHCI | xHCI |
|---|---|---|---|
| 最高速度 | 480 Mbps (USB 2.0) | 12 Mbps (USB 1.1) | 5/10/20 Gbps (USB 3.x) |
| PHY接口类型 | UTMI+ / ULPI | UTMI+ / ULPI | UTMI+ + PIPE3 |
| 端口数量 | 通常1-2个 | 通常1-2个 | 最多16个 |
| 中断模型 | 单中断,轮询端口 | 单中断,轮询端口 | MSI-X / 多中断,事件环 |
| 兼容性 | 仅USB 2.0高速 | 仅USB 1.x全速/低速 | 全兼容USB 3.0/2.0/1.x |
| 设备树compatible | "generic-ehci" | "generic-ohci" | "generic-xhci" |
4.4 DWC3控制器设备树节点示例
DWC3(DesignWare Core USB 3.0)是Synopsys公司推出的双角色(Dual-Role)USB控制器IP核,广泛用于移动SoC和嵌入式平台。DWC3支持Host、Peripheral和OTG三种模式,其设备树节点结构比xHCI更复杂,通常包含一个glue层节点和一个核心节点。
以下是一个典型的DWC3控制器设备树节点(以TI AM65x平台为例):
/* DWC3 glue层节点 */
dwc3_glue: dwc3@f9000000 {
compatible = "ti,am654-dwc3", "syscon";
reg = <0x0 0xf9000000 0x0 0x1000>;
#address-cells = <2>;
#size-cells = <2>;
ranges;
clocks = <&clkc CLK_USB_DWC3>;
clock-names = "ref";
resets = <&rstc RST_USB_DWC3>;
/* DWC3核心节点 */
usb_dwc3: usb@f9100000 {
compatible = "snps,dwc3";
reg = <0x0 0xf9100000 0x0 0x10000>;
interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
phys = <&usb2_phy>, <&usb3_phy>;
phy-names = "usb2-phy", "usb3-phy";
dr_mode = "otg";
maximum-speed = "super-speed";
snps,dis_u2_susphy_quirk;
snps,dis_u3_susphy_quirk;
snps,usb3_lpm_capable;
status = "okay";
};
};
- snps,dis_u2_susphy_quirk:禁用USB2 PHY的挂起功能,解决某些PHY在挂起后无法恢复的问题。
- snps,dis_u3_susphy_quirk:禁用USB3 PHY的挂起功能,类似上述问题。
- snps,usb3_lpm_capable:启用USB3链路电源管理(LPM),降低空闲功耗。
- dr_mode = "otg":使能双角色模式,通过ID引脚动态切换Host/Peripheral。
下图展示了DWC3控制器的内部架构及其与PHY、系统总线的连接关系:
4.5 多控制器协同与PHY共享策略
在实际嵌入式系统中,经常出现多个USB控制器共享同一个PHY的场景,例如EHCI+OHCI组合、或者DWC3同时连接USB2和USB3 PHY。以下是几种常见的PHY共享策略:
- 完全共享:EHCI和OHCI共享同一个USB2 PHY,通过UTMI+接口分时复用。PHY驱动需要实现引用计数,确保两个控制器不会同时操作PHY寄存器。
- 独立PHY:DWC3同时连接USB2 PHY和USB3 PHY,两个PHY独立工作,互不干扰。设备树中通过“phys”属性顺序绑定。
- PHY切换:某些SoC支持通过GPIO或寄存器切换PHY的归属,例如将同一个PHY从EHCI切换到DWC3。设备树中需要添加“phy-handle”和“phy-switch”属性。
下表总结了不同USB控制器组合的PHY绑定策略:
| 控制器组合 | PHY数量 | PHY类型 | 设备树绑定方式 |
|---|---|---|---|
| EHCI + OHCI | 1个 | USB2 PHY (UTMI+) | 两个节点共用同一个phandle |
| xHCI (USB 3.0) | 2个 | USB2 PHY + USB3 PHY | phys = <&usb2_phy>, <&usb3_phy> |
| DWC3 (双角色) | 2个 | USB2 PHY + USB3 PHY | phys = <&usb2_phy>, <&usb3_phy> |
| DWC3 (仅USB 2.0) | 1个 | USB2 PHY (UTMI+) | phys = <&usb2_phy> |
| 多路复用PHY | 1个 | 可切换PHY | 添加phy-handle和切换属性 |