4. USB控制器设备树绑定:通用USB控制器节点、EHCI/OHCI/xHCI/DWC3控制器设备树节点示例

USB控制器(USB Controller)是SoC内部负责实现USB协议栈的硬件模块,其设备树节点(Device Tree Node)描述了控制器的寄存器基址、中断号、时钟、复位、PHY接口以及DMA能力等关键资源。本章将系统讲解通用USB控制器节点的绑定规范,并逐一给出EHCI、OHCI、xHCI以及DWC3控制器的完整设备树示例。

核心概念:设备树中的USB控制器节点必须遵循“compatible”属性匹配驱动,同时通过“phys”和“phy-names”属性关联USB PHY节点。错误的PHY绑定会导致控制器无法检测到设备插入或枚举失败。

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 数组 可选 控制器复位信号
关键点:“phys”属性是USB控制器与PHY硬件之间的桥梁。如果控制器支持多个PHY(例如DWC3同时连接USB2 PHY和USB3 PHY),则“phys”属性必须按顺序列出所有PHY引用,“phy-names”必须一一对应。

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节点引用,且PHY的初始化顺序必须由PHY驱动保证。如果PHY在EHCI初始化时未完成复位,EHCI将无法检测到端口状态变化。建议在PHY节点中设置“#phy-cells = <0>”以简化绑定。

下图展示了EHCI/OHCI控制器与PHY、系统总线之间的硬件连接关系:

EHCI/OHCI控制器与PHY硬件连接架构 系统总线(AXI/AHB) EHCI 主机控制器 OHCI 主机控制器 USB PHY(UTMI+) USB Type-A 连接器 说明:EHCI和OHCI共享同一个PHY,通过UTMI+接口分时复用 EHCI负责高速传输,OHCI负责全速/低速传输,两者通过中断协调工作

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的“phys”属性中,第一个PHY通常是USB2 PHY(UTMI+接口),第二个PHY是USB3 PHY(PIPE3接口)。如果只连接USB2 PHY,则xHCI只能工作在USB 2.0模式。部分SoC允许将“maximum-speed”设置为“high-speed”以强制降级。

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";
    };
};
DWC3特有属性说明:
  • 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、系统总线的连接关系:

DWC3控制器内部架构与PHY连接 系统总线 DWC3 Glue层 时钟/复位/电源管理 DWC3 Core USB 3.0 协议引擎 USB2 PHY (UTMI+) USB3 PHY (PIPE3) USB Type-C 连接器 说明:DWC3 Glue层负责时钟门控和复位管理,Core层实现USB协议,PHY层处理模拟信号 USB2 PHY和USB3 PHY独立工作,通过DWC3内部的MUX选择数据路径

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”属性。
实战建议:在编写设备树时,务必检查SoC参考手册中PHY与控制器的连接关系。如果PHY支持多控制器共享,需要在PHY节点中设置“#phy-cells = <0>”并实现“phy_ops->init()”和“phy_ops->exit()”的引用计数逻辑。错误的PHY共享配置会导致控制器初始化时PHY状态冲突,表现为USB设备无法识别或系统挂起。

下表总结了不同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和切换属性