跳到主要内容

Rockchip RK3588 USB 开发指南

:::info 文档信息

文档标识:RK-SM-YF-450 · 发布版本:V1.0.0 · 发布日期:2022-01-18 · 页数:40 · 语言:中文

原始文档:Rockchip_RK3588_Developer_Guide_USB_CN.pdf

:::

章节大纲​

  • Rockchip RK3588 USB 开发指南(P1)
    • RK3588 USB 控制器和 PHY 简介(P4)
    • RK3588 USB 支持的接口类型(P6)
      • Type-C 接口类型(P7)
        • Type-C USB 3.1/DP 全功能接口(P7)
        • Type-C to Type-A USB 3.1/DP 接口(P9)
        • Type-C to Type-A USB 2.0/DP 接口(P9)
        • Type-C USB 2.0 only 接口(P10)
      • Type-A 接口类型(P10)
        • Type-A USB 3.1 接口(P10)
        • Type-A USB 2.0 接口(P11)
      • Micro 接口类型(P11)
        • Micro USB 3.1 接口(P11)
        • Micro USB 2.0 接口(P12)
    • RK3588 USB Config Map(P12)
    • RK3588 USB 硬件电路设计(P13)
      • USB 控制器供电及功耗管理(P14)
      • USB PHY 供电及功耗管理(P15)
        • USB 2.0 PHY 供电及功耗管理(P15)
        • USB 3.1 PHY 供电及功耗管理(P17)
          • USB 3.1/DP Combo PHY(P17)
          • USB 3.1/SATA/PCIe Combo PHY(P19)
      • USB 硬件电路设计(P20)
        • TYPEC0_USB20_VBUSDET 电路设计(P20)
        • Maskrom USB 电路设计(P20)
        • Type-C USB 3.1/DP 全功能硬件电路(P21)
        • Type-C to Type-A USB 3.1/DP 硬件电路(P23)
        • Type-C to Type-A USB 2.0/DP 硬件电路(P24)
        • Type-A USB 3.1 硬件电路(P25)
        • Type-A USB 2.0 硬件电路(P26)
    • RK3588 USB DTS 配置(P27)
      • USB 芯片级 DTSI 配置(P27)
      • Type-C USB 3.1/DP 全功能 DTS 配置(P30)
      • Type-C to Type-A USB 3.1/DP DTS 配置(P32)
      • Type-C to Type-A USB 2.0/DP DTS 配置(P33)
      • Type-C USB 2.0 only DTS 配置(P34)
      • Type-A USB 3.1 DTS 配置(P37)
      • Type-A USB 2.0 DTS 配置(P38)
      • Micro USB DTS 配置(P39)
    • RK3588 USB OTG mode 切换命令(P39)
    • Type-C 控制器芯片支持列表(P40)
    • 参考文献(P40)

在线预览​

若预览无法显示,请直接下载 PDF 后用本地阅读器打开。


1. RK3588 USB 控制器和 PHY 简介​

RK3588 支持 5 个独立的 USB 控制器,包括:2 个 USB 2.0 HOST 控制器,2 个 USB 3.1 OTG 控制器,1个 USB 3.1 HOST 控制器。RK3588S 相比 RK3588 少了 1 个 USB 3.1 OTG 控制器。USB 控制器的具体类型如下表 1 所示,如果要了解更详细的 USB 控制器特性,请参考 RK3588 datasheet。

表 1 RK3588 USB 控制器列表

芯片/控制 器USB 2.0 HOST (EHCI&OHCI)USB 3.1 OTG (DWC3&xHCI)USB 3.1 Host(xHCI)
RK3588221
RK3588S211

RK3588 支持 7 个独立的 USB PHY,包括:4 个 USB 2.0 PHY,2 个 USB 3.1/DP Combo PHY,1 个 USB 3.1/SATA/PCIe Combo PHY。RK3588S 相比 RK3588 少了 1 个 USB 2.0 PHY 和 1 个 USB 3.1/DP Combo PHY。

表 2 RK3588 USB PHY 支持列表

芯片/PHYUSB 2.0 PHYUSB3.1/DP ComboPHYUSB 3.1/SATA/PCIe ComboPHY
RK35884 [1 × port]21
RK3588S3 [1 × port]11

Note:

  1. 表格中,数字 N 表示支持 N 个独立的 USB 控制器和 USB PHY;2. 表格中,[1 × ports] 表示一个 PHY 只支持 1 个 USB port;3. 表格中,“EHCI&OHCI” 表示该 USB 控制器集成了 EHCI 控制器和 OHCI 控制器。“DWC3&xHCI”表示该 USB 控制器集成了 DWC3 控制器和 xHCI 控制器;4. USB 3.1 Gen1 物理层传输速率为 5Gbps,USB 2.0 物理层传输速率为 480Mbps; 5. USB 3.1/DP Combo PHY 支持 4 x lanes,可以同时支持 USB 3.1 + DP 2 x lanes;6. USB 3.1/SATA/PCIe Combo PHY 在同一时刻,只能支持一种工作模式,也即 USB3.1 与 SATA/PCIe接口是互斥的;

表 3 RK3588 USB 控制器和 PHY 的连接关系

USB 接口名称(原理 图)USB 控制器USB PHY
TYPEC0OTG0 (DWC3&xHCI)USB3.1/DP ComboPHY0 + USB2.0 PHY0
TYPEC1OTG1 (DWC3&xHCI)USB3.1/DP ComboPHY1 + USB2.0 PHY1
USB20 HOST0 _USB2.0 HOST0 (EHCI&OHCI)USB2.0 PHY2
USB20 HOST1 _USB2.0 HOST1 (EHCI&OHCI)USB2.0 PHY3
USB30 2 _USB3.1 HOST2 (xHCI)USB3.1/SATA/PCIe ComboPHY2

RK3588 USB 控制器和芯片端 USB 传输数据的 pin 脚的对应关系如下表 4 所示。

表 4 RK3588 USB 控制器和 USB pin 脚的对应关系

USB控制器/Pin脚RK3588 USB data pin
USB 2.0 HOST0USB20 HOST0 DP/USB20 HOST0 DM _ _ _ _
USB 2.0 HOST1USB20 HOST1 DP/USB20 HOST1 DM _ _ _ _
USB 3.1 OTG0TYPEC0 USB20 OTG DP/TYPEC0 USB20 OTG DM, _ _ _ _ _ _ TYPEC0 SSRX1P/TYPEC0 SSRX1N, TYPEC0 SSTX1P/TYPEC0 SSTX1N, _ _ _ _ TYPEC0 SSRX2P/TYPEC0 SSRX2N, TYPEC0 SSTX2P/TYPEC0 SSTX2N _ _ _ _
USB 3.1 OTG1TYPEC1 USB20 OTG DP/TYPEC1 USB20 OTG DM, _ _ _ _ _ _ TYPEC1 SSRX1P/TYPEC1 SSRX1N, TYPEC1 SSTX1P/TYPEC1 SSTX1N _ _ _ _ TYPEC1 SSRX2P/TYPEC1 SSRX2N, TYPEC1 SSTX2P/TYPEC1 SSTX2N _ _ _ _
USB 3.1 HOST2USB30 2 SSTXP/USB30 2 SSTXN _ _ _ _ USB30 2 SSRXP/USB30 2 SSRXN _ _ _ _

RK3588 USB 控制器和 PHY 的内部连接关系,以及对应的常见 USB 物理接口如下图 1 所示。图 1 RK3588 USB 控制器和 PHY 的连接示意图

由图 1 可以看出:

需要注意的是,RK3588 USB 支持的接口类型并不局限于图 1 所描述的 Type-C/A USB 接口类型,而是可以支持所有常见的 USB 接口,包括 Type-C USB 2.0/3.1,Type-A USB 2.0/3.1,Micro USB 2.0/3.1 等,具体信息请参考RK3588 USB 支持的接口类型。为了适配不同的 USB 电路设计和接口类型,Linux-5.10 内核 USB 驱动已经做了软件兼容,开发者只需要根据产品的 USB 硬件电路,对 Linux USB DTS 进行正确配置,即可使能对应的 USB 接口功能。详细的 USB DTS 配置方法,请参考RK3588USB DTS 配置。

2. RK3588 USB 支持的接口类型​

RK3588 USB 可以支持如下图 2 常见的 USB 接口类型,产品设计时,可以根据实际的应用场景需求,灵活设计 USB 硬件电路,同时,只要对 Linux USB DTS 进行适配即可。图 2 USB 接口类型

2.1 Type-C 接口类型​

2.1.1 Type-C USB 3.1/DP 全功能接口​

RK3588 Type-C0/1 可以支持全功能的 Type-C 接口功能[1],如下图 3 所示,具体的硬件电路设计,请参考Type-C USB 3.1/DP 全功能硬件电路。主要支持的功能如下:

支持 Type-C PD (需要配合外置Type-C 控制器芯片)支持 USB 3.1 Gen1 5Gbps 数据传输支持 DP Alternate Mode

图 3 Type-C USB 3.1/DP 接口图 4 Type-C 接口引脚定义

表 5 Type-C 接口描述

Pin名称描述Pin名称描述
A1GND接地B12GND接地
A2SSTXp1SuperSpeed 差分信号 TX1+B11SSRXp1SuperSpeed 差分信号 RX1+
A3SSTXn1SuperSpeed 差分信号 TX1-B10SSRXn1SuperSpeed差分信号 RX1-
A4VBUSUSB 总线电源B9VBUSUSB 总线电源
A5CC1Configuration channelB8SBU2Sideband use (SBU)
A6Dp1USB 2.0 差分信号 D1+B7Dn2USB 2.0 差分信号 D2-
A7Dn1USB 2.0 差分信号 D1-B6Dp2USB 2.0 差分信号 D2+
A8SBU1Sideband use (SBU)B5CC2Configuration channel
A9VBUSUSB 总线电源B4VBUSUSB 总线电源
A10SSRXn2SuperSpeed 差分信号 RX2-B3SSTXn2SuperSpeed差分信号 TX2-
A11SSRXp2SuperSpeed 差分信号 RX2+B2SSTXp2SuperSpeed差分信号 TX2+
A12GND接地B1GND接地

表 6 RK3588 Type-C0 与 Type-C 接口的连接关系

RK3588 Type-C0 PinType-C 接口 Pin关系描述
TYPEC0 SSRX1P/DP0 TX0P _ _ TYPEC0 SSRX1N/DP0 TX0N _ _B10/B11连接到 RK3588 USBDP PHY 的 lane0,可 用于 USB 3.1 Rx 或者 DP Tx
TYPEC0 SSTX1P/DP0 TX1P _ _ TYPEC0 SSTX1N/DP0 TX1N _ _A2/A3连接到 RK3588 USBDP PHY 的 lane1,可 用于 USB 3.1 Tx 或者 DP Tx
TYPEC0 SSRX2P/DP0 TX2P _ _ TYPEC0 SSRX2N/DP0 TX2N _ _A10/A11连接到 RK3588 USBDP PHY 的 lane2,可 用于 USB 3.1 Rx 或者 DP Tx
TYPEC0 SSTX2P/DP0 TX3P _ _ TYPEC0 SSTX2N/DP0 TX3N _ _B2/B3连接到 RK3588 USBDP PHY 的 lane3,可 用于 USB 3.1 Tx 或者 DP Tx
TYPEC0 OTG DP/DM _ _A6/A7, B6/B7连接到 RK3588 TYPEC0 OTG DP/DM, _ _ 其中,A6 和 B6并联,A7 和 B7 并联。
TYPEC0 SBU1/TYPEC0 SBU2 _ _A8/B8连接到 RK3588 USBDP PHY 的 AUX,只 用于 DP Alternate Mode
TYPEC0 SBU1 DC/TYPEC0 SBU2 DC _ _ _ _A8/B8连接到 RK3588 GPIO,用于软件控制 DP AUX 传输时的上拉。对 GPIO 默认的上下 拉方式没要求
TYPEC0 CC1/TYPEC0 CC2 _ _A5/B5连接到外置 Type-C 控制器芯片 (HUSB311/FUSB302),未连接到 R3588 SoC

2.1.2 Type-C to Type-A USB 3.1/DP 接口​

RK3588 Type-C0/1 可以拆分为独立的 Type-A USB 3.1 接口和 DP 接口使用。

具体的硬件电路设计,请参考Type-C to Type-A USB 3.1/DP 硬件电路。

以 RK3588 EVB2 的 Type-C to Type-A USB 3.1/DP 接口设计为例:

Type-C0:Type-A USB 3.1 (使用 USBDP PHY0 的 lane0/1) + DP 1.4 (使用 USBDP PHY0 的 lane2/3);

Type-C1:Type-A USB 3.1 (使用 USBDP PHY1 的 lane0/1) + DP to VGA (使用 USBDP PHY1 的 lane2/3);

Note:

理论上,硬件可以分配 Type-A USB 3.1 使用 lane2/3,DP 使用 lane0/1,同时,软件只要修改 Linux usbdp_phy 节点的属性 rockchip,dp-lane-mux 进行适配。

2.1.3 Type-C to Type-A USB 2.0/DP 接口​

RK3588 Type-C0/1 可以拆分为独立的 Type-A USB 2.0 接口和 DP(4 x Lane)接口使用。

具体的硬件电路设计,请参考Type-C to Type-A USB 2.0/DP 硬件电路。

以 RK3588 NVR DEMO board 的 Type-C1 to Type-A USB 2.0/DP 接口设计为例:Type-C1:Type-A USB 2.0 (未使用 USBDP PHY) + DP 4 x lane to HDMI2.0 (使用 USBDP PHY1 的lane0/1/2/3)

2.1.4 Type-C USB 2.0 only 接口​

RK3588 Type-C0/1 可以简化为 Type-C USB 2.0 only 接口。如下图 5 所示:

支持 Type-C PD (需要配合外置Type-C 控制器芯片)支持 USB 2.0 480Mbps 数据传输不支持 DP Alternate Mode

这种设计方式,主要目的是为了简化硬件电路设计,但会降低 USB 最大传输速率。同时,为了适配这种接口设计,需要对 Linux USB DTS 进行较大的修改,请参考Type-C USB 2.0 only DTS 配置。

图 5 Type-C USB 2.0 only 接口

2.2 Type-A 接口类型​

2.2.1 Type-A USB 3.1 接口​

RK3588 最多可以支持 3 个 Type-A USB 3.1 接口,包括:

Type-C0 to Type-A USB 3.1 Type-C1 to Type-A USB 3.1 USB3_HOST2 + USB 2.0 HOST0/1

具体的硬件电路设计,请参考Type-A USB 3.1 硬件电路。图 6 Type-A USB 3.1 接口

2.2.2 Type-A USB 2.0 接口​

RK3588 最多可以支持 4 个 Type-A USB 2.0 接口,包括:

Type-C0 to Type-A USB 2.0 Type-C1 to Type-A USB 2.0 USB 2.0 HOST0 USB 2.0 HOST1

具体的硬件电路设计,请参考Type-A USB 2.0 硬件电路。

图 7 Type-A USB 2.0 接口

2.3 Micro 接口类型​

2.3.1 Micro USB 3.1 接口​

RK3588 Type-C0/1 可以支持 Micro USB 3.1 的接口设计。但考虑到 Micro USB 3.1 接口占用的 PCB 面积较大,目前产品上使用较少。

Micro USB 3.1 与 Type-A USB 3.1的引脚区别,主要是增加了 OTG ID 脚,用于硬件自动检测 ID 电平和切换 OTG Device/HOST mode。OTG ID 脚需要连接到 RK3588 USB20_OTG_ID pin 脚,在芯片内部已经默认上拉 ID 到高电平 1.8V,外部电路不需要上拉。图 8 Micro USB 3.1 接口

2.3.2 Micro USB 2.0 接口​

RK3588 Type-C0 可以支持 Micro USB 2.0 的接口设计。这种设计方式,主要目的是为了简化硬件电路设计,但会降低 USB 最大传输速率。

Micro USB 2.0 与 Type-A USB 2.0 的引脚区别,主要是增加了 OTG ID 脚,用于硬件自动检测 ID 电平和切换 OTG Device/HOST mode。OTG ID 脚需要连接到 RK3588 USB20_OTG_ID pin 脚,在芯片内部已经默认上拉 ID 到高电平 1.8V,外部电路不需要上拉。

图 9 Micro USB 2.0 接口

3. RK3588 USB Config Map​

RK3588 的 5 个独立的 USB 控制器和 7 个独立的 USB PHY,可以支持如下图 10 所列出的配置方式。

Type-C0/1 可以支持 4 中配置:

Config0: Type-C0 with DP function

Config1: USB 2.0 OTG + DP 4 x Lane (Swap off)

Config2: USB 2.0 OTG + DP 4 x Lane (Swap on)

Config3: USB 3.1 OTG + DP 2 x Lane (Swap on)

Config4: USB 3.1 OTG + DP 2 x Lane (Swap off)

USB 2.0 HOST0/1 和 USB3_HOST2 支持的配置:

Config0: USB 2.0 HOST0 + USB 2.0 HOST1 (USB3_HOST2 not used) Config1: USB 2.0 HOST0 + USB 2.0 HOST1 Combo with USB3_HOST2

Config2: USB 2.0 HOST0 Combo with USB3_HOST2 + USB 2.0 HOST1

图 10 RK3588 USB Config Map

如果要了解更详细的 USB 配置表,请参考 SDK EVB 参考原理图的 USB Controller Configure Table。

需要注意的是,DP 控制器和 USBDP PHY 的 4 条 lane 支持任意映射,如下图 11 所示,只要修改 USBDP PHY 的 DTS 进行适配即可。如果开发者不清楚如何进行软件适配,建议参考图 10 列出的常规配置进行硬件电路设计。

图 11 RK3588 DP Lane Map

4. RK3588 USB 硬件电路设计​

本章节主要说明 RK3588 USB 在实际应用中,可以支持的各种硬件电路设计方案。如下图 12 是 RK3588 USB 接口框图,由图中可以看出,RK3588 可以支持的接口如下:

USB20 HOST0 USB20 HOST1 USB30/DP1.4 MULTI0 USB30/DP1.4 MULTI1 USB30/PCIE2.0/SATA30 MULTI2 RK3588S 少了 USB30/DP1.4 MULTI1 这组接口。

图 12 RK3588 USB 接口框图

4.1 USB 控制器供电及功耗管理​

RK3588 USB 控制器的供电电源是 VDD_LOGIC。同时,芯片内部有设计 USB 控制器专用的 power domain,各个 USB 控制器对应的 Power Domain 如下表 7 所示。

表 7 USB 控制器和 PD 的对应关系

USB 控制器Power Domain
USB 2.0 HOST0/1PD USB _
USB 3.1 OTG0/1PD USB _
USB 3.1 HOST2PD PHP _

在实际使用场景中,Linux USB 控制器驱动会根据 USB 接口的工作情况,基于 Linux PM Runtime 机制,动态开关 USB 控制器的 PD,以降低 USB 控制器的功耗。而当系统进入二级待机时,为了达到最优功耗的目的,软件会强制关闭 USB 控制器的所有 PD。因此,在实际产品的应用场景中,如果需要在二级待机时,保持 USB 控制器的寄存器工作状态,则需要在 USB 控制器驱动中调用函数device_init_wakeup ,避免二级待机时关闭 USB 控制器的 PD。

USB 控制器的功耗控制策略如下:

  1. 对于不使用的 USB 控制器,需要将对应的控制器 DTS 节点配置为 disabled;2. 对于内核已启用的 USB 控制器,内核 USB 驱动已经支持 USB 控制器 Auto suspend 功能 (当 USB HOST 接口不接任何外设时,控制器自动进入 suspend 低功耗状态),因此,开发者不需要对 USB控制器的动态功耗管理进行调试。

内核 disable USB 2.0 HOST0/1 的方法如下:

# Disable USB 2.0 HOST0
&usb_host0_ehci {
status = "disabled";
&usb_host0_ohci {
status = "disabled";
# Disable USB 2.0 HOST1
&usb_host1_ehci {
status = "disabled";
&usb_host1_ohci {
status = "disabled";

4.2 USB PHY 供电及功耗管理​

4.2.1 USB 2.0 PHY 供电及功耗管理​

RK3588 支持 4 个独立的 USB 2.0 PHY。RK3588S 相比 RK3588 少了 1 个 USB 2.0 PHY1 。在芯片内部,所有 USB 2.0 PHY 都属于 PD_BUS (Alive),并且,所有 USB 2.0 PHY 共用如下图 13 所示的 3 路供电电源。因此,在系统运行时,无法通过硬件断电和关闭 PD 的简单方法,来降低 USB 2.0 PHY 的功耗。

图 13 USB 2.0 PHY 供电电源

需要注意的是,在实际电路中,USB 2.0 PHY 的供电电压值超过规定的最大值或者低于规定的最小值,可能会导致 USB 连接异常。

表 8 USB 2.0 PHY 供电电压要求

供电电源最小正常最大Unit
USB20 DVDD 0V75 _ _0.69750.750.825V
USB20 AVDD 1V8 _ _1.6741.81.98V
USB20 AVDD 3V3 _ _3.0693.33.63V

USB 2.0 PHY 的功耗控制策略如下:

  1. 为了支持 Maskrom USB 下载固件的功能,必须保证 USB 2.0 PHY 的供电正常;2. 系统上电后,所有 USB 2.0 PHY 默认处于 Normal mode,软件在 U-Boot SPL 阶段,配置 USB 2.0 PHY1/PHY2/PHY3 处于最低功耗 IDDQ mode(SDK 已经支持),在进入系统后,内核 USB 驱动会根据应用需求,设置对应的 USB 2.0 PHY 退出 IDDQ mode;3. 对于不使用的 USB 2.0 PHY,需要将对应的 USB 2.0 PHY DTS 节点配置为 disabled (参考表 9);4. 对于内核已启用的 USB 2.0 PHY,内核 USB 2.0 PHY 驱动会自动对 PHY 进行动态功耗控制,当检测到有设备插入时,自动设置 USB 2.0 PHY 处于 Normal mode,当检测到没有设备插入时,自动设置 USB 2.0 PHY 处于 Suspend mode;

USB 2.0 PHY 处于不同工作模式的功耗数据如下表 9 所示。

表 9 USB 2.0 PHY 功耗数据

(统计单个 USB 2.0 PHY 的功耗)

供电电源读写数据动态休眠PHY disabled二级待机Unit
USB20 DVDD 0V75 _ _7.12.60.050mA
USB20 AVDD 1V8 _ _17.83.10.050mA
USB20 AVDD 3V3 _ _3.30.050.050mA

Note:

读写数据功耗的测试场景:接 U2 盘拷贝数据,PHY 处于 Normal mode;动态休眠功耗的测试场景:USB 2.0 PHY 的 DTS enable,但不接 USB 外设,PHY 处于 Suspend mode;PHY disabled 功耗的测试场景:USB 2.0 PHY 的 DTS diabled,PHY 处于 IDDQ mode;二级待机功耗的测试场景:USB 2.0 PHY 的三路供电电源全部关闭;

表 10 USB 2.0 PHY 和 USB 控制器的连接关系

USB 2.0 PHYUSB 控制器
USB 2.0 PHY0USB 3.1 OTG0
USB 2.0 PHY1USB 3.1 OTG1
USB 2.0 PHY2USB 2.0 HOST0
USB 2.0 PHY3USB 2.0 HOST1

内核 disable USB 2.0 PHY2/3 的方法如下:

&u2phy2 {
status = "disabled";
&u2phy3 {
status = "disabled";
&u2phy2_host {
status = "disabled";
&u2phy3_host {
status = "disabled";

4.2.2 USB 3.1 PHY 供电及功耗管理​

RK3588 支持两种 USB 3.1 Combo PHY:

  1. USB 3.1/DP Combo PHY 2. USB 3.1/SATA/PCIe Combo PHY

表 11 USB 3.1 Combo PHY 和 USB 控制器的连接关系

USB 3.1 Combo PHYUSB 控制器
USB 3.1/DP Combo PHY0USB 3.1 OTG0
USB 3.1/DP Combo PHY1USB 3.1 OTG1
USB 3.1/SATA/PCIe Combo PHY2USB 3.1 HOST2

这两种 USB 3.1 Combo PHY 对应的供电电源和功耗控制方式都不一样,下面分别进行说明。

4.2.2.1 USB 3.1/DP Combo PHY

RK3588 支持两个独立的 USB 3.1/DP Combo PHY 。RK3588S 相比 RK3588 少了 1 个 USB 3.1/DP Combo PHY1。在芯片内部,两个 USB 3.1/DP Combo PHY 都属于 PD_BUS (Alive),在芯片外部,两个 PHY 有独立的供电电源 pin,如图 14 所示。图 14 RK3588 USB 3.1/DP Combo PHY 供电电源

表 12 USB 3.1/DP Combo PHY 供电电压要求

供电电源最小正常最大Unit
VDD 0V85/VDDA 0V85 _ _0.80750.850.8925V
VDDH 1V8 _1.711.81.89V

USB 3.1/DP Combo PHY 的功耗控制策略如下:

  1. 为了支持 Maskrom USB 下载固件的功能,必须保证 Type-C0 USBDP PHY0 的供电正常;2. 当 Type-C1 接口不使用时,对应的 Type-C1 USBDP PHY1 可以不供电;3. 系统上电后,USBDP PHY 处于未初始化状态时的功耗最低;4. 对于不使用的 USBDP PHY,需要将对应的 USBDP PHY DTS 节点配置为 disabled,也即让 PHY 处于未初始化状态,功耗最低;5. 对于内核已启用的 USBDP PHY,内核 USBDP PHY 驱动会自动对 PHY 进行动态功耗控制,当检测到有设备插入时,自动设置 USBDP PHY 处于 P0 State,当检测到没有设备插入时,自动设置USBDP PHY 处于 P3 State (应用于 Type-A 接口)或者处于 reset state (应用于 Type-C 接口);

表 13 USB 3.1/DP Combo PHY 功耗数据

(统计单个 USB 3.1/DP Combo PHY 的功耗)

供电电源读写 数据动态休 眠[1]动态休 眠[2]PHY disabled二级 待机Unit
VDD 0V85/VDDA 0V85 _ _115.76.87.920mA
VDDH 1V8 _29.40200mA

Note:读写数据功耗的测试场景:接 U3 盘拷贝数据,PHY 处于 P0 state;动态休眠功耗[1]的测试场景:Type-C 接口,不接 USB 外设,PHY 处于 reset state;动态休眠功耗[2]的测试场景:Type-A 接口,不接 USB 外设,PHY 处于 P3 state PHY disabled 功耗的测试场景:PHY 的 DTS 节点配置为 disabled,PHY 处于未初始化状态,功耗最低;二级待机功耗的测试场景:PHY 的两路供电电源全部关闭;

内核 disable USBDP PHY1 的方法如下:

&usbdp_phy1 {
status = "disabled";
&usbdp_phy1_dp {
status = "disabled";
&usbdp_phy1_u3 {
status = "disabled";

4.2.2.2 USB 3.1/SATA/PCIe Combo PHY

RK3588 支持 1 个 USB3.1/SATA/PCIe Combo PHY。在芯片内部,这个 PHY 属于 PD_BUS (Alive),在芯片外部,PHY 有独立的供电电源,如图 15 所示。

图 15 RK3588 USB 3.1/SATA/PCIe Combo PHY 供电电源

表 14 USB 3.1/SATA/PCIe Combo PHY 供电电压要求

供电电源最小正常最大Unit
AVDD 0V85 _0.80.850.935V
AVDD 1V8 _1.621.81.98V

USB 3.1/SATA/PCIe Combo PHY 的功耗控制策略如下:

  1. 芯片上电时,USB 3.1/SATA/PCIe Combo PHY 默认处于工作状态。软件在 U-Boot SPL 阶段,配置设置 PHY 处于 reset state,以保持 PHY 处于最低功耗。进入内核后,USB 控制器驱动会通过调用rockchip_combphy_init() 函数释放 PHY 的 reset。2. PHY 的动态功耗控制:当 Combo PHY 工作在 USB mode 时,PHY 的 PIPE state (P0/P1/P2/P3) 由USB 控制器硬件自动控制,根据不同的工作场景,动态进入和退出 P0/P1/P2/P3 state。比如,未插入任何 USB 设备时,PIPE 处于 P3 state;插入 U3 disk 时,则切换到 P0 state;当接 U3 HUB 时,只要 HUB 的下行端口没有接其他 USB 外设,则 PIPE state 会自动进入 P3 state 低功耗。当有 USB 外设插入U3 HUB,则 PIPE state 自动切换为 P0。(注:P0 为正常工作状态,P3 为最低功耗状态) 3. 当明确不使用 USB 3.1 HOST2 接口时,对应的 USB 3.1/SATA/PCIe Combo PHY 可以不供电;4. 在 PHY 供电的情况下,如果不使用这个PHY,需要将对应的 PHY DTS 节点配置为 disabled,也即让 PHY 处于 reset state,功耗最低;

表 15 USB 3.1/SATA/PCIe Combo PHY 功耗数据

供电电源读写数据动态休眠PHY disabled二级待机Unit
AVDD 0V85 _43.443.30.40mA
AVDD 1V8 _4.34.10.20mA

Note:

读写数据功耗的测试场景:接 U3 盘拷贝数据,PHY 处于 P0 state。动态休眠的测试场景:PHY DTS enable,但不接 USB 外设,PHY 处于 P3 State; PHY disabled 的测试场景:PHY 的 DTS 节点配置为 disabled,PHY 处于 reset state;二级待机功耗的测试场景:PHY 的两路供电电源全部关闭;

内核 disable USB 3.1/SATA/PCIe Combo PHY 的方法如下:

&combphy2_psu {
status = "disabled";

4.3 USB 硬件电路设计​

4.3.1 TYPEC0_USB20_VBUSDET 电路设计​

TYPEC0_USB20_VBUSDET 用于 USB Device 的使用场景,检测 USB Device 的连接和断开。TYPEC0_USB20_VBUSDET 的设计注意点如下:

当 Type-C0 设计为支持 PD 功能的 Type-C 接口时,即支持外置 Type-C 控制器芯片(如:FUSB302或者HUSB311),则参考 RK3588 EVB1 Type-C0 的电路设计即可( TYPEC0_USB20_VBUSDET 固定上拉到 VCC_3V3_S0),软件驱动可以通过 Type-C 控制器芯片的 CC 检测 USB Device 的连接和断开;对于其他没有支持外置 Type-C 控制器芯片的电路设计方案(如Type-C0 USB 2.0 only,Type-A USB 3.1,Micro USB 2.0/3.1),要求 TYPEC0_USB20_VBUSDET 仍然按照传统的分压电路设计,连接到 USB 接口的VBUS 引脚,VBUSDET 不作常供电的设计(如果有作 USB HOST 的需求,需要独立的 GPIO 或者 PMIC VBUS 控制,不与其他 USB HOST 接口复用);要求芯片输入端 TYPEC0_USB20_VBUSDET 的高电平范围在[0.9V ~ 3.3V];

4.3.2 Maskrom USB 电路设计​

RK3588 Maskrom 固定使用 Type-C0 USB 2.0 作为下载固件的功能。相关的电路设计如下图 16 所示。为了保证 Maskrom USB 下载功能正常,要求如下:

TYPEC0_USB20_VBUSDET 要能支持外部拉高,不能悬空;TypeC0 USBDP PHY 的供电电源(TYPEC0_DP0_VDD_0V85/TYPEC0_DP0_VDDA_0V85/TYPEC0_DP0_VDDH_1V8)和外部参考电阻(TYPEC0_DP0_REXT)都要正常连接,进系统后,软件会对 TypeC0 USBDP PHY 进行低功耗处理。

图 16 RK3588 Maskrom USB2 固件下载口电路

4.3.3 Type-C USB 3.1/DP 全功能硬件电路​

该方案适用于 RK3588 Type-C0 和 Type-C1。

以 RK3588 EVB1 Type-C0 硬件电路设计为例。

  1. RK3588 Type-C0 各个 Pin 与 Type-C 接口的详细连接关系,请参考Type-C USB 3.1/DP 全功能接口的表 5;2. Type-C 电路需要配合外置的 Type-C 控制器芯片,才能实现 Type-C 的完整功能(包括:正反面检测、高电压大电流的 PD 协议交互等)。RK3588 可支持大部分常用的 Type-C 控制器芯片,具体请参考Type-C 控制器芯片支持列表;3. 为了支持高压充电功能,同时降低硬件电路的风险,TYPEC0_USB20_VBUSDET 不要连接 Type-C接口的 VBUS,固定上拉到 3.3V 即可(如图17 TYPEC0_USB20_VBUSDET 连接到VCC_3V3_S0),但不能悬空;4. TYPEC0_USB20_OTG_ID 只用于 Micro 接口类型的 OTG 功能,Type-C 电路不需要使用,悬空即可。5. TYPEC0_SBU1/TYPEC0_SBU2 只用于 DP Alternate Mode 的 AUX 通信。按照 AUX 的协议要求,需要根据 Type-C 插入的正反面,对 SBU1/SBU2 进行相应的电平上拉操作。 因为 RK3588 芯片内部没有实现 SBU1/SBU2 的自动上拉,所以要求硬件外部电路增加两个 GPIO 控制(对应图 19 中的TYPEC0_SBU1_DC/TYPEC0_SBU2_DC)。对 GPIO 的默认上下拉方式没要求,可以选择任意的GPIO。软件上,需要修改 usbdp_phy 节点的属性 sbu1-dc-gpios 和 sbu2-dc-gpios 进行适配;6. Type-C USB DTS 的软件配置,请参考Type-C USB 3.1/DP 全功能 DTS 配置;图 17 RK3588 Type-C0 电路

图 18 RK3588 Type-C0 PD 控制器电路和VBUS控制电路

图 19 RK3588 Type-C0 接口

4.3.4 Type-C to Type-A USB 3.1/DP 硬件电路​

该方案适用于 RK3588 Type-C0 和 Type-C1,可以拆分为独立的 Type-A USB 3.1 接口和 DP(2 x Lane)接口使用。

以 RK3588 EVB2 Type-C0 to Type-A USB 3.1/DP 硬件电路设计为例。

  1. Type-A USB 3.1 使用 TYPEC0_SSRX1P/N 和 TYPEC0_SSTX1P/N (对应芯片内部 USBDP PHY 的lane0/1),而 DP 使用 DP0_TX2P/N 和 DP0_TX3P/N (对应芯片内部 USBDP PHY 的 lane2/3);2. 如果 USB OTG 有作 Device/HOST 的应用场景,建议 TYPEC0_OTG_VBUSDET 通过 30KΩ 的电阻串联到 Type-A USB 接口的 VBUS;3. Type-A VBUS 的供电电源 (VCC5V0_USB30_HOST2) 由 GPIO 控制,当 OTG 作 Device mode,关闭VBUS 输出。当 OTG 作 HOST mode,打开 VBUS 输出。此外,稳压芯片 SY6280AAC 的输出电流由 OCB pin 连接的电阻决定,最大电流 Ilim(A)=6800/Rset(ohm) ,如下图 21 所示,VBUS 输出限流为 1A;4. Type-C to Type-A USB 3.1/DP 对应的 DTS 配置,请参考Type-C to Type-A USB 3.1/DP DTS 配置;

Note:

理论上,硬件电路也可以设计为 Type-A USB 3.1 使用 lane2/3,DP 使用 lane0/1,但软件需要对usbdp_phy 节点的属性 rockchip,dp-lane-mux 进行修改,以适配硬件设计。

图 20 RK3588 Type-A USB 3.1/DP 电路图 21 RK3588 Type-A USB3.1/DP 接口

4.3.5 Type-C to Type-A USB 2.0/DP 硬件电路​

该方案适用于 RK3588 Type-C0 和 Type-C1,可以拆分为独立的 Type-A USB 2.0 接口和 DP(4 x Lane)接口使用。

以 RK3588 NVR Demo Board Type-C1 to Type-A USB 2.0/DP 硬件电路设计为例。

  1. TYPEC1 USBDP PHY 的 4 x Lane 全部给 DP 接口使用,USB 不使用 USBDP PHY;2. TYPEC1 USB 只作 HOST mode 使用时,TYPEC1_USB20_OTG_ID 和 TYPEC1_USB20_VBUSDET悬空即可;3. Type-A VBUS 的供电电源 (VCC5V0_USB20_HOST) 由 GPIO 控制,当 OTG 作 HOST mode,打开VBUS 输出。此外,稳压芯片 SY6280AAC 的输出电流由 OCB pin 连接的电阻决定,最大电流Ilim(A)=6800/Rset(ohm) ,如下图 23 所示,VBUS 输出限流为 1.45A;4. Type-C to Type-A USB 2.0/DP 对应的 DTS 配置,请参考Type-C to Type-A USB 2.0/DP DTS 配置;图 22 RK3588 Type-A USB 2.0/DP 电路

图 23 RK3588 Type-A USB2/DP to HDMI 接口

4.3.6 Type-A USB 3.1 硬件电路​

该方案适用于 RK3588 Type-C0、Type-C1 和 USB 3.1 HOST2。其中,Type-C0/C1 对应的 Type-A USB 3.1硬件电路设计,请参考Type-A USB 3.1/DP 硬件电路的 USB 3.1 电路设计部分即可。

本章节重点说明 USB 3.1 HOST2 对应的 Type-A USB 3.1 硬件电路设计。

在本开发指南的前面章节RK3588 USB 控制器和 PHY 简介中,已经提到 USB 3.1 HOST_2 (也即USB30_2) 控制器没有带 USB 2.0 PHY,所以 USB 3.1 HOST_2 需要与 USB 2.0 HOST0/1 组成完整的 USB 3.1 接口功能。

以 RK3588 EVB2 USB30_2 HOST 硬件电路设计为例。

  1. USB 3.1 HOST2 与 USB 2.0 HOST1组成完整的 USB 3.1 接口;2. 按照 RK3588 的芯片设计,USB 3.1 HOST2 同样可与 Type-C0/1 的 USB 2.0 组合,但考虑到 Type- C0/C1 还可能作为 USB Device 使用,且 USB 3.1 OTG 控制器的 Device 和 Host 功能无法同时使用[2],所以,为了简化软硬件的设计,建议 USB 3.1 HOST2 只与 USB 2.0 HOST0/1 组合;3. Type-A USB 3.1 对应的 DTS 配置请参考Type-A USB 3.1 DTS 配置;图 24 RK3588 USB 3.1 HOST2 电路

图 25 RK3588 USB 3.1 HOST2 接口

4.3.7 Type-A USB 2.0 硬件电路​

该方案适用于 RK3588 USB 2.0 HOST0/1。

以 RK3588 EVB1 USB 2.0 HOST0/1 硬件电路设计为例。

  1. USB 2.0 HOST0/1 共用 VBUS 供电电源(VCC5V0_USB20_HOST) ,由 GPIO 控制稳压芯片SY6280AAC 输出 VBUS。最大输出电流由稳压芯片的 OCB pin 连接的电阻决定,最大电流Ilim(A)=6800/Rset(ohm) ,如下图 26 所示,VBUS 输出限流为 1.45A;2. Type-A USB 2.0 对应的 DTS 配置请参考Type-A USB 2.0 DTS 配置;图 26 RK3588 Type-A USB 2.0 HOST 电路

5. RK3588 USB DTS 配置​

RK3588 USB DTS 配置,包括:芯片级 USB 控制器/PHY DTSI 配置和板级 DTS 配置。

详细配置方法,请参考内核文档:

  1. kernel/Documentation/devicetree/bindings/usb/snps,dwc3.yaml 2. kernel/Documentation/devicetree/bindings/usb/generic-ohci.yaml 3. kernel/Documentation/devicetree/bindings/usb/generic-ehci.yaml 4. kernel/Documentation/devicetree/bindings/connector/usb-connector.yaml 5. kernel/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.yaml 6. kernel/Documentation/devicetree/bindings/phy/phy-rockchip-usbdp.yaml 7. kernel/Documentation/devicetree/bindings/phy/phy/phy-rockchip-naneng-combphy.txt

5.1 USB 芯片级 DTSI 配置​

RK3588 DTSI 文件中 USB 控制器和 PHY 相关的主要节点如下所示,因为 USB DTSI 节点配置的是 USB控制器和 PHY 的公共资源和属性,建议开发者不要改动。

USB 3.1 OTG0、USB 2.0 HOST0/1、USB 3.1 HOST2 的 DTSI配置放在 rk3588s-evb.dtsi

USB 3.1 OTG1 的 DTSI 配置放在 rk3588-evb.dts

对应的 DTSI 完整路径如下:

arch/arm64/boot/dts/rockchip/rk3588s.dtsi
arch/arm64/boot/dts/rockchip/rk3588.dtsi

Note:RK3588/RK3588S 的所有 USB 控制器和 PHY,在 rk3588s-evb.dtsi 和 rk3588-evb.dtsi 中,全部配置为 status = "okay",如果产品的板级 DTS 文件有 include 这两个 EVB DTSI 文件,则只需要在板级DTS 文件中,将不使用的 USB 节点配置为 "disabled" 即可。

USB 接口和 USB DTS 节点的对应关系如下表 16 所示。

表 16 RK3588 USB 接口和 USB DTS 节点的对应关系

USB 接口名称(原理图)USB 控制器 DTS 节点USB PHY DTS 节点
TYPEC0usbdrd3 0 _ usbdrd dwc3 0 _ _u2phy0 u2phy0 otg _ usbdp phy0 _ usbdp phy0 u3 _ _
TYPEC1usbdrd3 1 _ usbdrd dwc3 1 _ _u2phy1 u2phy1 otg _ usbdp phy1 _ usbdp phy1 u3 _ _
USB20 HOST0 _usb host0 ehci _ _ usb host0 ohci _ _u2phy2 u2phy2 host _
USB20 HOST1 _usb host1 ehci _ _ usb host1 ohci _ _u2phy3 u2phy3 host _
USB30 2 _usbhost3 0 _ usbhost dwc3 0 _ _combphy2 psu _

USB 控制器 DTSI 节点如下:

#USB3.1 OTG0 Controller
usbdrd3_0: usbdrd3_0 {
compatible = "rockchip,rk3588-dwc3", "rockchip,rk3399-dwc3";
......
usbdrd_dwc3_0: usb@fc000000 {
compatible = "snps,dwc3";
......
#USB2.0 HOST0 Controller
usb_host0_ehci: usb@fc800000 {
compatible = "generic-ehci";
......
usb_host0_ohci: usb@fc840000 {
compatible = "generic-ohci";
......
#USB2.0 HOST1 Controller
usb_host1_ehci: usb@fc880000 {
compatible = "generic-ehci";
......
usb_host1_ohci: usb@fc8c0000 {
compatible = "generic-ohci";
......
#USB3.1 HOST2 Controller
usbhost3_0: usbhost3_0 {
compatible = "rockchip,rk3588-dwc3", "rockchip,rk3399-dwc3";
......
usbhost_dwc3_0: usb@fcd00000 {
compatible = "snps,dwc3";
......
#USB3.1 OTG1 Controller
usbdrd3_1: usbdrd3_1 {
compatible = "rockchip,rk3588-dwc3", "rockchip,rk3399-dwc3";
......
usbdrd_dwc3_1: usb@fc400000 {
compatible = "snps,dwc3";
......

USB PHY DTSI 节点如下:

注意:USB PHY 和 USB 控制器具有一一对应的关系,需要成对配置。在芯片内部,USB PHY 和控制器的连接关系,请参考 RK3588 USB 控制器和 PHY 简介的图 1 和 表 16。在DTSI 节点中,通过 USB 控制器节点的 "phys" 属性关联对应的 USB PHY。

#USB2.0 PHY0
usb2phy0_grf: syscon@fd5d0000 {
compatible = "rockchip,rk3588-usb2phy-grf", "syscon",
"simple-mfd";
......
u2phy0: usb2-phy@0 {
compatible = "rockchip,rk3588-usb2phy";
......
u2phy0_otg: otg-port {
#phy-cells = <0>;
status = "disabled";
#USB2.0 PHY1
usb2phy1_grf: syscon@fd5d4000 {
......
#USB2.0 PHY2
usb2phy2_grf: syscon@fd5d8000 {
......
#USB2.0 PHY3
usb2phy3_grf: syscon@fd5dc000 {
......
#USB3.1/DP Combo PHY0
usbdp_phy0: phy@fed80000 {
compatible = "rockchip,rk3588-usbdp-phy";
......
usbdp_phy0_dp: dp-port {
#phy-cells = <0>;
status = "disabled";
usbdp_phy0_u3: u3-port {
#phy-cells = <0>;
status = "disabled";
#USB3.1/DP Combo PHY1
usbdp_phy1: phy@fed90000 {
......
#USB3.1/SATA/PCIe PHY2
combphy2_psu: phy@fee20000 {
compatible = "rockchip,rk3588-naneng-combphy";
......

5.2 Type-C USB 3.1/DP 全功能 DTS 配置​

参考 arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4.dtsi Type-C0 接口的 DTS 配置。

#USB2.0 PHY配置属性"rockchip,typec-vbus-det",表示支持Type-C VBUS_DET常拉高的硬件设计
&u2phy0_otg {
rockchip,typec-vbus-det;
#USB3.1/DP PHY0,需要根据硬件设计,配置属性"sbu1-dc-gpios"和"sbu2-dc-gpios"
&usbdp_phy0 {
orientation-switch;
svid = <0xff01>;
sbu1-dc-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
sbu2-dc-gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;
port {
#address-cells = <1>;
#size-cells = <0>;
usbdp_phy0_orientation_switch: endpoint@0 {
reg = <0>;
remote-endpoint = <&usbc0_orien_sw>;
usbdp_phy0_dp_altmode_mux: endpoint@1 {
reg = <1>;
remote-endpoint = <&dp_altmode_mux>;
#USB3.1 OTG0 Controller
&usbdrd_dwc3_0 {
dr_mode = "otg";
usb-role-switch;
port {
#address-cells = <1>;
#size-cells = <0>;
dwc3_0_role_switch: endpoint@0 {
reg = <0>;
remote-endpoint = <&usbc0_role_sw>;

#VBUS GPIO配置,在Type-C控制器芯片驱动中控制该GPIO

vbus5v0_typec: vbus5v0-typec {
compatible = "regulator-fixed";
regulator-name = "vbus5v0_typec";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
enable-active-high;
gpio = <&gpio4 RK_PD0 GPIO_ACTIVE_HIGH>;
vin-supply = <&vcc5v0_usb>;
pinctrl-names = "default";
pinctrl-0 = <&typec5v_pwren>;

#配置外置Type-C控制器芯片FUSB302 #需要根据实际的硬件设计,配置"I2C/interrupts/vbus-supply/usb_con"的属性

&i2c2 {
status = "okay";
usbc0: fusb302@22 {
compatible = "fcs,fusb302";
reg = <0x22>;
interrupt-parent = <&gpio3>;
interrupts = <RK_PB4 IRQ_TYPE_LEVEL_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&usbc0_int>;
vbus-supply = <&vbus5v0_typec>;
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
usbc0_role_sw: endpoint@0 {
remote-endpoint = <&dwc3_0_role_switch>;
usb_con: connector {
compatible = "usb-c-connector";
label = "USB-C";
data-role = "dual";
power-role = "dual";
try-power-role = "sink";
op-sink-microwatt = <1000000>;
sink-pdos =
<PDO_FIXED(5000, 1000, PDO_FIXED_USB_COMM)>;
source-pdos =
<PDO_FIXED(5000, 3000, PDO_FIXED_USB_COMM)>;
altmodes {
#address-cells = <1>;
#size-cells = <0>;
altmode@0 {
reg = <0>;
svid = <0xff01>;
vdo = <0xffffffff>;
ports {
......

Note:

如果使用 HUSB311 芯片替换 FUSB302 芯片,只需要基于 FUSB302 的 DTS 配置进行简单修改即可,参考修改:

#配置外置Type-C控制器芯片HUSB311

&i2c2 {
usbc0: husb311@4e {
compatible = "hynetek,husb311";
reg = <0x4e>;
......

5.3 Type-C to Type-A USB 3.1/DP DTS 配置​

参考 arch/arm64/boot/dts/rockchip/rk3588-evb2-lp4.dtsi Type-C0 to Type-A USB 3.1/DP 的 DTS配置。

#USB2.0 PHY0配置"phy-supply"属性,用于控制VBUS输出5V

#注意:使用phy-supply,无法实现VBUS的动态开关。如果OTG独占GPIO,不与其他HOST共用,并且OTG

需要支持Device/HOST,则应该配置为"vbus-supply = <&vcc5v0_otg>",才能实现VBUS动态开关。
&u2phy0_otg {
phy-supply = <&vcc5v0_host>;
#VBUS GPIO配置,在USB2.0 PHY驱动中控制该GPIO
vcc5v0_host: vcc5v0-host {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_host";
regulator-boot-on;
regulator-always-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
enable-active-high;
gpio = <&gpio4 RK_PA1 GPIO_ACTIVE_HIGH>;
vin-supply = <&vcc5v0_usb>;
pinctrl-names = "default";
pinctrl-0 = <&vcc5v0_host_en>;
#USB3.1/DP PHY0,只需配置DP使用lane2/3,驱动会自动分配lane0/1给USB3.1 Rx/Tx
#如果硬件设计DP使用lane0/1,则此处应配置"rockchip,dp-lane-mux = <0 1>"
&usbdp_phy0 {
rockchip,dp-lane-mux = <2 3>;
#USB3.1 OTG0 Controller

#配置"dr_mode"为"otg",同时配置"extcon"属性,才能支持软件切换Device/Host mode

&usbdrd_dwc3_0 {
dr_mode = "otg";
extcon = <&u2phy0>;
status = "okay";

5.4 Type-C to Type-A USB 2.0/DP DTS 配置​

参考 arch/arm64/boot/dts/rockchip/rk3588-nvr-demo.dtsi Type-C1 to Type-A USB 2.0/DP 的 DTS配置。

#USB2.0 PHY1配置"phy-supply"属性,用于控制VBUS输出5V
&u2phy1_otg {
phy-supply = <&vcc5v0_host>;
status = "okay";
#VBUS GPIO配置,在USB2.0 PHY驱动中控制该GPIO
vcc5v0_host: vcc5v0-host-regulator {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_host";
regulator-boot-on;
regulator-always-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
enable-active-high;
gpio = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>;
vin-supply = <&vcc5v0_sys>;
pinctrl-names = "default";
pinctrl-0 = <&vcc5v0_host_en>;
#USB3.1/DP PHY1,配置DP使用lane0/1/2/3

#需要根据实际的硬件设计,配置属性"rockchip,dp-lane-mux"

&usbdp_phy1 {
rockchip,dp-lane-mux = < 0 1 2 3 >;
status = "okay";
&usbdp_phy1_dp {
status = "okay";
#配置属性"maximum-speed",通知USBDP驱动将USB限制为USB2.0 only
&usbdp_phy1_u3 {
maximum-speed = "high-speed";
status = "okay";
#配置属性"maximum-speed",通知DWC3驱动将USB限制为USB2.0 only
&usbdrd_dwc3_1 {
dr_mode = "host";
maximum-speed = "high-speed";
status = "okay";

5.5 Type-C USB 2.0 only DTS 配置​

配置1. 硬件电路带外置 Type-C 控制器芯片,支持 PD

参考 arch/arm64/boot/dts/rockchip/rk3588s-tablet-rk806-single.dtsi Type-C0 USB 2.0 OTG的 DTS 配置

#USB2.0 PHY0注册typec orientation switch,用于与TCPM子系统交互,获取USB热拔插的信息

&u2phy0 {
orientation-switch;
status = "okay";
port {
#address-cells = <1>;
#size-cells = <0>;
u2phy0_orientation_switch: endpoint@0 {
reg = <0>;
remote-endpoint = <&usbc0_orien_sw>;
#USB2.0 PHY0 OTG配置
#配置属性"rockchip,sel-pipe-phystatus",表示选择GRF控制pipe phystatus,替代USBDP PHY的

控制

#配置属性"rockchip,typec-vbus-det",表示支持Type-C VBUS_DET常拉高的硬件设计
&u2phy0_otg {
rockchip,sel-pipe-phystatus;
rockchip,typec-vbus-det;
status = "okay";

#disable USBDP PHY0的所有相关节点,让USBDP PHY0处于未初始化状态,达到最低功耗的目的

&usbdp_phy0 {
status = "disabled";
&usbdp_phy0_dp {
status = "disabled";
&usbdp_phy0_u3 {
status = "disabled";
&dp0 {
status = "disabled";
#配置USB3.1 OTG0 Controller
#配置"phys = <&u2phy0_otg>",即不引用USBDP PHY
#配置maximum-speed = "high-speed",通知DWC3驱动将USB限制为USB2.0 only
&usbdrd3_0 {
status = "okay";
}
&usbdrd_dwc3_0 {
dr_mode = "otg";
status = "okay";
maximum-speed = "high-speed";
phys = <&u2phy0_otg>;
phy-names = "usb2-phy";
usb-role-switch;
port {
#address-cells = <1>;
#size-cells = <0>;
dwc3_0_role_switch: endpoint@0 {
reg = <0>;
remote-endpoint = <&usbc0_role_sw>;

#配置外置Type-C控制器芯片FUSB302 #需要根据实际的硬件设计,配置"I2C/interrupts/vbus-supply/usb_con"的属性

#需要配置usbc0_orien_sw的属性remote-endpoint = <&u2phy0_orientation_switch>
&i2c8 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&i2c8m2_xfer>;
usbc0: fusb302@22 {
compatible = "fcs,fusb302";
reg = <0x22>;
interrupt-parent = <&gpio0>;
interrupts = <RK_PC4 IRQ_TYPE_LEVEL_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&usbc0_int>;
vbus-supply = <&vbus5v0_typec>;
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
usbc0_role_sw: endpoint@0 {
remote-endpoint = <&dwc3_0_role_switch>;
usb_con: connector {
compatible = "usb-c-connector";
label = "USB-C";
data-role = "dual";
power-role = "dual";
......
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
usbc0_orien_sw: endpoint {
remote-endpoint =
<&u2phy0_orientation_switch>;

配置2. 硬件电路不带外置 Type-C 控制器芯片,支持 Device only

参考 arch/arm64/boot/dts/rockchip/rk3588-evb6-lp4.dtsi Type-C0 USB 2.0 Device 的 DTS 配置

#disable USBDP PHY0的所有相关节点,让USBDP PHY0处于未初始化状态,达到最低功耗的目的

&usbdp_phy0 {
status = "disabled";
&usbdp_phy0_dp {
status = "disabled";
&usbdp_phy0_u3 {
status = "disabled";
}
#配置USB3.1 OTG0 Controller
#配置dr_mode = "peripheral",通知DWC3驱动初始化为Device only mode
#配置"phys = <&u2phy0_otg>",即不引用USBDP PHY
#配置maximum-speed = "high-speed",通知DWC3驱动将USB限制为USB2.0 only
&usbdrd_dwc3_0 {
dr_mode = "peripheral";
phys = <&u2phy0_otg>;
phy-names = "usb2-phy";
maximum-speed = "high-speed";

配置3. 硬件电路不带外置 Type-C 控制器芯片,支持 OTG(需要增加 CC to ID 电平转换电路)

#disable USBDP PHY0的所有相关节点,让USBDP PHY0处于未初始化状态,达到最低功耗的目的

&usbdp_phy0 {
status = "disabled";
&usbdp_phy0_dp {
status = "disabled";
&usbdp_phy0_u3 {
status = "disabled";
}
#配置USB3.1 OTG0 Controller
#配置dr_mode = "otg"
#配置"phys = <&u2phy0_otg>",即不引用USBDP PHY
#配置maximum-speed = "high-speed",通知DWC3驱动将USB限制为USB2.0 only

#配置"extcon"属性,才能支持自动切换Device/Host mode

&usbdrd_dwc3_0 {
dr_mode = "peripheral";
phys = <&u2phy0_otg>;
phy-names = "usb2-phy";
maximum-speed = "high-speed";
extcon = <&u2phy0>;

5.6 Type-A USB 3.1 DTS 配置​

参考 arch/arm64/boot/dts/rockchip/rk3588-evb2-lp4.dtsi USB30_2 HOST 的 DTS 配置

#USB2.0 PHY3配置"phy-supply"属性,用于控制VBUS输出5V
&u2phy3_host {
phy-supply = <&vcc5v0_host>;
}
#VBUS GPIO配置,在USB2.0 PHY驱动中控制该GPIO
vcc5v0_host: vcc5v0-host {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_host";
regulator-boot-on;
regulator-always-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
enable-active-high;
gpio = <&gpio4 RK_PA1 GPIO_ACTIVE_HIGH>;
vin-supply = <&vcc5v0_usb>;
pinctrl-names = "default";
pinctrl-0 = <&vcc5v0_host_en>;
#使能USB3.1/SATA/PCIe Combo PHY
&combphy2_psu {
status = "okay";
#配置USB3.1 HOST2 Controller
&usbhost3_0 {
status = "okay";
&usbhost_dwc3_0 {
dr_mode = "host";
status = "okay";

5.7 Type-A USB 2.0 DTS 配置​

参考 arch/arm64/boot/dts/rockchip/rk3588-evb1-lp4.dtsi USB 2.0 HOST0/1 的 DTS 配置。

#USB2.0 PHY2/3配置"phy-supply"属性,用于控制VBUS输出5V
&u2phy2_host {
phy-supply = <&vcc5v0_host>;
&u2phy3_host {
phy-supply = <&vcc5v0_host>;
#VBUS GPIO配置,在USB2.0 PHY驱动中控制该GPIO
vcc5v0_host: vcc5v0-host {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_host";
regulator-boot-on;
regulator-always-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
enable-active-high;
gpio = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>;
vin-supply = <&vcc5v0_usb>;
pinctrl-names = "default";
pinctrl-0 = <&vcc5v0_host_en>;
#USB2.0 HOST0/1 Controller
&usb_host0_ehci {
status = "okay";
&usb_host0_ohci {
status = "okay";
&usb_host1_ehci {
status = "okay";
&usb_host1_ohci {
status = "okay";

5.8 Micro USB DTS 配置​

/* TODO */

6. RK3588 USB OTG mode 切换命令​

RK3588 SDK 支持通过软件方法,强制设置 USB OTG 切换到 Host mode 或者 Peripheral mode,而不受USB 硬件电路的 OTG ID 电平或者 Type-C 接口的影响。

RK3588 Linux-5.10 内核切换 USB OTG 控制器工作在 Peripheral mode 或 Host mode,有如下两种方式。

注意:方式 1 依赖于 USB DTS 的正确配置,只能用于非 Type-C 接口的硬件电路设计,方式 2 没有限制。因此,在不确定软硬件是否正确适配时,推荐优先使用方式 2。

方式1. [Legacy]

#1.Force host mode
echo host > /sys/devices/platform/fd5d0000.syscon/fd5d0000.syscon:usb2-
phy@0/otg_mode
#2.Force peripheral mode
echo peripheral > /sys/devices/platform/fd5d0000.syscon/fd5d0000.syscon:usb2-
phy@0/otg_mode

方式2. [New]

#1.Force host mode
echo host > /sys/kernel/debug/usb/fc000000.usb/mode
#2.Force peripheral mode
echo device > /sys/kernel/debug/usb/fc000000.usb/mode

7. Type-C 控制器芯片支持列表​

表 17 Type-C 控制器芯片支持列表

Type-C控制器 芯片型号Linux- 4.4Linux- 4.19Linux- 5.10说明
FUSB302支持支持支持RK平台最常用
ET7301B支持支持支持软硬件完全兼容 FUSB302note1
ET7303不支持支持支持软硬件完全兼容 RT1711note2
HUSB311不支持支持支持推荐优先使用 硬件兼容FUSB302,软件不兼容note3
RT1711H不支持支持支持驱动支持,功能待验证
ANX7411不支持不支 持调试 中RK3588 适配中
WUSB3801SDK 不 支持, 个别项目 使用不支 持不支 持自定义的单线通信机制,误码率高,无 法保证通信稳定。

note1.

Linux-4.4 因为不支持 TCPM 软件框架,所有只能支持 FUSB302/ET7301B;Linux-4.19/5.10 支持 TCPM 软件框架和 TCPCI 协议,理论上可以兼容所有基于 TCPCI 标准设计的Type-C 控制器芯片;

note2.

小封装的 ET7303 (据了解原厂目前没有提供大封装) 已经在 RK 平台验证通过。软件复用 RT1711H内核驱动,只需要修改 RT1711H 驱动中的 VID/PID 即可。

note3.

RK3399 挖掘机 FUSB302 电路设计不适用 HUSB311,需要飞线。RK3399 IND 板子 FUSB302 可直接替换为 HUSB311;

8. 参考文献​

  1. 《Universal Serial Bus Type-C Cable and Connector Specification》2. 《Rockchip_Developer_Guide_USB_CN》