依据Rockchip RK356x USB V1.4.0中英文原稿完整整理。适用范围为RK356x、Linux 4.19+;ArmSoM仅作为平台参考,具体板卡、SDK/BSP、内核分支、USB/DP引脚、VBUS供电与Type-C控制器必须逐项适配,不宣称所有板卡支持。未进行ArmSoM硬件验证,测试及输出为原稿示例。中文使用中文原图,英文/俄文/德文使用英文原图。
原稿概述:本指南帮助理解RK356x USB控制器与USB PHY的硬件设计、软件驱动设计,以便按产品USB需求灵活设计并快速开发。原稿适用表:RK3566、RK3568,Linux-4.19及以上版本。
原稿时点的“支持/不支持/调试中”不代表当前SDK状态。所有供电与连接必须符合具体器件额定值,原稿命令仅供审核后在适配设备上执行;本次未执行硬件命令。
1. RK356x USB 控制器和 PHY 简介
RK356x USB 控制器支持列表如下表 1表 1 RK356x USB 控制器列表
| 芯片/控制器 | USB 2.0 HOST (EHCI/OHCI) | USB 3.0/2.0 OTG (DWC3/xHCI) |
|---|---|---|
| RK3566 | 2 | 2 (OTG 2.0 + Host 3.0) |
| RK3568 | 2 | 2 (OTG 3.0+ Host 3.0) |
RK356x USB PHY支持列表如下表 2表 2 RK356x USB PHY 列表
| 芯片/PHY | USB 2.0 ComboPHY | USB 3.0/SATA/QSGMII ComboPHY |
|---|---|---|
| RK3566 | 2 [2 × port] | 1 |
| RK3568 | 2 [2 × port] | 2 |
Note:
-
表格中,数字 N 表示支持 N 个独立的 USB 控制器;
-
表格中,[2 × ports] 表示一个 PHY 支持两个 USB port;
-
表格中,“EHCI/OHCI” 表示该 USB 控制器集成了 EHCI 控制器和 OHCI 控制器;“DWC3/xHCI” 表示该 USB 控制器集成了 DWC3 控制器和 xHCI 控制器;
-
RK3566 的 DWC3 OTG 控制器只支持 OTG 2.0,不支持 OTG 3.0,也即最高只能支持 USB 2.0480Mbps 传输;RK3566 和 RK3568 的 USB 模块区别是,RK3568 支持 OTG 3.0,而 RK3566 只支持 OTG 2.0,但都支持 1 个 USB 3.0 Host,2 个 USB 2.0 Host。如下图 1-1 是 RK3568 USB 控制器和 PHY 的连接示意图。由图 1-1 可以看出:
-
USB 3.0 OTG 控制器与 SATA_0 控制器复用 USB3/SATA Combo PHY_0;
-
USB 3.0 Host_1 控制器与 SATA_1/QSGMII 控制器复用 USB3/SATA/QSGMII Combo PHY_1;
-
USB 3.0 OTG 控制器与 USB 3.0 Host_1 控制器分别使用 USB 2.0 Comb PHY_0 的 port0 和port1;
-
USB 2.0 Host_2 控制器与 USB 2.0 Host_3 控制器分别使用 USB 2.0 Comb PHY_1 的 port0 和port1;需要注意的是,USB3/SATA Combo PHY_0 和 USB3/SATA/QSGMII Combo PHY_1 在同一时刻,只能支持一种工作模式,也即 USB3 与SATA, QSGMII 接口是互斥的,开发者可以根据产品形态,灵活配置内核的 DTS, 使能对应的外设接口。USB 的 DTS 配置方法,请参考 RK356x USB DTS 配置。

原稿技术图1,中文PDF第5页
图 1-1 RK3568 USB 控制器和 PHY 的连接示意图
2. RK356x USB 硬件电路设计
本章节主要说明 RK356x USB 在实际应用中,可以支持不同硬件电路设计方案。如下图 2-1 是 RK3568USB 接口框图,可以看到,RK3568 USB 总共支持 4 个 USB 外设接口,包括 1 个 USB 3.0 OTG 接口,1个 USB 3.0 Host 接口,以及 2 个 USB 2.0 Host 接口。而 RK3566 USB 同样支持 4 个 USB 外设接口,包括 1 个 USB 2.0 OTG 接口,1 个 USB 3.0 Host 接口,以及 2 个 USB 2.0 Host 接口。

原稿技术图2,中文PDF第5页
图 2-1 RK3568 原理图的USB 外设接口
2.1 RK356x USB 2.0/3.0 供电及功耗控制
功耗控制的原则是:
-
硬件电路设计中,如果可以直接断开 USB 2.0 PHY或者 Combo PHY 的供电,则 PHY 功耗为0,PHY 对应的 DTS 节点配置为disable 即可;
-
硬件电路设计中,如果必须保证 USB 2.0 PHY 的供电,则 DTS 中需要将 PHY 对应的两个 port 节点都配置为enable 状态,以便 PHY 驱动中设置不使用的 port 进入suspend mode;
-
不使用的 USB 控制器,对应的控制器 DTS 节点配置为 disable 即可;
-
不使用的 Combo PHY,对应的 Combo PHY DTS 节点配置为 disable 即可;
2.1.1 RK356x USB 2.0/3.0 控制器供电及功耗控制
RK356x USB 2.0/3.0 控制器的供电是 VDD_LOGIC,并且 USB 3.0 控制器与 PCIE/SATA/XPCS 一起使用芯片内部的 power domain PD_PIPE,可以根据 USB 3.0 接口的工作情况,动态控制 PD_PIPE 的开关,以降低 USB 3.0 控制器的功耗。但 USB 2.0 控制器没有 power domain。需要注意的是,RK356x Linux 内核已经支持 USB 3.0 OTG 的 PD_PIPE 动态开关,以及支持 USB Hostauto suspend功能(指 USB Host 接口不接任何外设时,Host 控制器自动进入 suspend 低功耗状态),因此开发者不用对 USB 2.0/3.0 控制器的功耗控制进行调试工作。如果产品上不需要使用所有的 USB 接口,建议在内核中,将未使用的 USB 控制器的 DTS 配置为disable,以降低 USB 控制器的功耗。如下是 disable USB 2.0 Host_2 和 USB 2.0 Host_3 的方法:
&usb_host0_ehci {
status = "disabled";
};
&usb_host0_ohci {
status = "disabled";
};
&usb_host1_ehci {
status = "disabled";
};
&usb_host1_ohci {
status = "disabled";
};
2.1.2 RK356x USB 2.0 PHYs 供电及功耗控制
RK356x 包含 2 个 USB 2.0 Combo PHY。其中,USB OTG 和 USB Host_1 使用USB 2.0 Comb PHY_0;USB Host_2 和 USB Host_3 使用 USB 2.0 Comb PHY_1。每一个 USB 2.0 Combo PHY 的供电有三路:
3.3V,1.8V 和 0.9V,如下表 3 所示。需要注意的是,实际电路中,这三路电压值超过规定的最大值或者低于规定的最小值(电压最大允许上下波动±10%),都可能会导致 USB 连接异常。表 3 USB2.0 PHY power supplies
| Supply Voltage | Min | Typ | Max | Unit |
|---|---|---|---|---|
| USB_AVDD_3V3 | 3.0 | 3.3 | 3.6 | V |
| USB_AVDD_1V8 | 1.62 | 1.8 | 1.98 | V |
| USB_AVDD_0V9 | 0.81 | 0.9 | 0.99 | V |

原稿技术图3,中文PDF第7页
图 2-2 USB 2.0 Comb PHY_0 (for OTG and Host_1) 供电电路

原稿技术图4,中文PDF第7页
图 2-3 USB 2.0 Comb PHY_1 (for Host_2 and Host_3) 供电电路上电后,USB 2.0 Comb PHY 的默认配置是处于正常工作的状态,因此需要在 USB PHY 驱动中做动态功耗控制(PHY 驱动代码已经支持),或者断开 USB PHY 的供电。需要注意的是,USB 2.0 Comb PHY_0用于 USB OTG,因为至少需要支持 USB 下载固件的功能,所以 USB 2.0 Comb PHY_0 的供电一定不能断。在 RK356x 实际的产品中,一种常⻅ USB 2.0 PHY 功耗优化场景是:产品只需要支持 USB OTG 功能,不需要 USB 3.0 Host_1/USB 2.0 Host_2/USB 2. 0 Host_3,建议 USB
2.0 PHY 功耗优化如下:
-
在内核 DTS 中,disable u2phy0_host 节点目的是,避免在 PHY 驱动 的 probe 流程中,执行 u2phy0_host 的初始化,导致 u2phy0_host 功耗增加。
-
断开 USB 2.0 Comb PHY_1 的供电如下图 2-4 的硬件电路所示,将 Comb PHY_1 的三路供电接地。

原稿技术图5,中文PDF第8页
图 2-4 USB 2.0 Comb PHY_1 (for Host_2 and Host_3) 断开供电电路因为 Comb PHY_1 对一个 USB 2.0 Host2 和 USB 2.0 Host3,所以,软件上需要相应修改内核 DTS,必须 disable 内核 DTS 中的 PHY 节点 u2phy1_host 和 u2phy1_otg,以及对应的 USB 控制器节点usb_host1_ehci 和 usb_host1_ohci,参考方法如下:
&usb_host1_ehci {
status = "disabled";
};
&usb_host1_ohci {
status = "disabled";
};
&u2phy1_host {
status = "disabled";
};
&u2phy1_otg {
status = "disabled";
};
需要特别注意的是,在 USB PHY 未供电的情况下,如果没有 disable 内核 DTS 中 PHY 对应的 USB 控制器节点,将会导致内核初始化时,卡死在 USB 控制器的初始化,对应的典型 log 如下:
[ 1.240101] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[ 1.241896] ohci-platform: OHCI generic platform driver
[ 1.242698] ohci-platform fd8c0000.usb: Generic Platform OHCI controller
[ 1.243686] ohci-platform fd8c0000.usb: new USB bus registered, assigned bus
number 3
2.1.3 RK356x USB 3.0 PHYs 供电及功耗控制
RK3566 USB 3.0 Host_1 使用 USB3/SATA/QSGMII Combo PHY_1 (对应原理图中的 MULTI_PHY1 );RK3568 USB 3.0 OTG 使用 USB3/SATA Combo PHY_0 (对应原理图中的 MULTI_PHY0 ),USB 3.0Host_1 使用 USB3/SATA/QSGMII Combo PHY_1 (对应原理图中的 MULTI_PHY1);RK356x MULTI_PHY0/MULTI_PHY1/MULTI_PHY2 使用同样的供电电源,如下图 2-5 所示,有两路供电:0.9V 和 1.8V。对这两路供电电源的电压要求,请参考表 4。表 4 USB 3.0 Combo PHY power supplies
| Supply Voltage | Min | Typ | Max | Unit |
|---|---|---|---|---|
| MULTI_PHY_AVDD_1V8 | 1.62 | 1.8 | 1.98 | V |
| MULTI_PHY_AVDD_0V9 | 0.81 | 0.9 | 0.99 | V |

原稿技术图6,中文PDF第9页
图 2-5 RK356x Multi PHYs 供电电路芯片上电时,三个 MULTI_PHY0/MULTI_PHY1/MULTI_PHY2 默认处于工作状态。在 UBoot 中,会通过软件设置三个 PHY 处于 reset 状态,以保持 PHY 处于最低功耗。进入内核后,USB
3.0/SATA/PCIE/QSGMII 控制器驱动会调用 rockchip_combphy_init() 函数释放 PHY 的 reset。当 Combo PHY 工作在 USB 3.0 mode 时,PHY 的 PIPE state (P0/P1/P2/P3) 由 USB 3.0 控制器硬件自动控制,根据不同的工作场景,动态进入和退出 P0/P1/P2/P3 state。比如,USB 3.0 Host 未插入任何USB 设备时,则 PIPE处于 P3 state;插入 U3 disk 时,则切换到 P0 state;当接 USB 3.0 HUB 时,只要 HUB 的下行端口没有接其他 USB 外设,则 PIPE state 会自动进入 P3 state。当有 USB 外设插入USB3 HUB,则 PIPE state 切为 P0。(注:P0 为正常工作状态,P3 为最低功耗状态)当 Combo PHY 未作任何功能使用时,建议在内核 DTS 中,将对应的 USB 3.0 控制器和 PHY 节点disable,以保证 PHY 处于最低功耗状态。DTS 的配置方法,请参考章节RK356x USB DTS 配置。
2.2 RK3566 USB 2.0 OTG Micro-B 接口硬件电路
RK3566 USB 2.0 OTG Micro-B 接口硬件电路如下图 2-6 ~ 图 2-8 所示,与 Rockchip 其他平台的 SDK 中常⻅的 USB 2.0 OTG 电路设计类似,因此,这里不详细介绍电路设计原理。有三点需要注意:
-
DP/DM 必须分别串接 2.2 Ω 电阻,提高 DP/DM 的抗压/抗静电能力;
-
如果要支持 USB Device 动态拔插检测和充电类型检测功能,则 VBUSDET 脚一定要连接到 USBMicro接口;
-
如果不需要支持 USB Device 动态拔插检测和充电类型检测功能,可以允许 VBUSDET 脚固定拉高到 3.3V 或者悬空 (推荐拉高到 3.3V)。由于 RK356x Maskrom USB 的连接不依赖于 VBUSDET 信号的检测,所以即使 VBUSDET 脚悬空,Maskrom USB 仍然可以正常工作并下载固件;

原稿技术图7,中文PDF第10页
图 2-6 RK3566 USB2.0 OTG Pins

原稿技术图8,中文PDF第10页
图 2-7 RK3566 USB2.0 OTG Micro-B 接口

原稿技术图9,中文PDF第10页
图 2-8 RK3566 USB2.0 OTG VBUS 和 OTG_ID 控制电路
2.3 RK3566 USB 2.0 OTG Type-C 接口硬件电路
2.3.1 RK3566 Type-C USB 2.0 only 硬件电路设计[No PD]
RK3566 Type-C USB2 only 硬件电路设计如下图 2-9 ~ 图 2-11 所示。该电路设计的特点是:
-
支持 USB 2.0 OTG mode 检测和自动切换;
-
不支持 Type-C PD (Power delivery);
-
不需要 Type-C 外置控制器芯片,节省硬件成本;在该电路设计中,Type-C 接口的 DP1/DM1 和 DP2/DM2 直接连接到 RK3566 芯片的USB_OTG0_DP/USB_OTG0_DM,所以不需要检测 Type-C 的正反插。电路设计的关键点在于通过CC1/CC2 检测 UFP/DFP 类型(对应 USB Device/Host mode),参考图 2-11。CC 检测电路的设计原理是基于 USB Type-C Specification[1] 文档中的 3.5.2 USB Type-C to USB 2.0 Standard-A CableAssembly 和 3.6.1 USB Type-C to USB 3.1 Standard-A Receptacle Adapter Assembly 的设计规范:
-
Type-C to USB 2.0 Standard-A Cable,Pin A5 (CC) of the USB Type-C plug shall be connectedto VBUS through a resistor Rp (56 kΩ ± 5%) ;
-
Type-C to USB 3.1 Standard-A Receptacle,Pin A5 (CC) of the USB Type-C plug shall beconnected to GND through a resistor Rd (5.1 kΩ ± 20%);

原稿技术图10,中文PDF第11页
图 2-9 RK3566 USB2.0 OTG Pins

原稿技术图11,中文PDF第11页
图 2-10 RK3566 USB 2.0 OTG Type-C 接口

原稿技术图12,中文PDF第12页
图 2-11 RK3566 USB 2.0 OTG Type-C CC 检测电路Note:
-
RK3566 芯片内部 USB_OTG0_ID 内部上拉电压 1.8V,内部上拉电阻 155K ohm;
-
当插入 Type-C to USB 2.0 Standard-A Plug cable 时,cable 的 CC 线弱上拉到 VBUS 5V,保证USB_OTG0_ID 为高电平,因此 USB 2.0 OTG 工作于 Device 模式;
-
当插入 Type-C to USB 2.0 Standard-A Receptacle cable 时,cable 的 CC 线弱下拉到 GND,USB_OTG0_ID 也会被拉到低电平,因此 USB 2.0 OTG 根据 ID 中断,切换为 Host 模式;
2.3.2 RK3566 Type-C USB 2.0 + PD 硬件电路
RK3566 Type-C USB2 + PD 的硬件电路设计如下图 2-12 ~ 图 2-14 所示。该电路设计的特点是:
-
支持 USB 2.0 OTG mode 检测和自动切换;
-
支持 Type-C PD (Power delivery);
-
需要 Type-C 外置控制器芯片;
-
需要 Type-C VBUS 5V 稳压电路(为了支持 PD 高压大电流充电);

原稿技术图13,中文PDF第12页
图 2-12 RK3566 Type-C USB 2.0 + PD 接口

原稿技术图14,中文PDF第13页
图 2-13 RK3566 Type-C FUSB302 电路

原稿技术图15,中文PDF第13页
图 2-14 RK3566 Type-C VBUS 5V 稳压电路
2.4 RK356x USB 2.0 Host Type-A 接口硬件电路
RK356x USB 2.0 Host Type-A 接口硬件电路如下图 2-15 和图 2-16 所示,与 Rockchip 其他平台的 SDK中常⻅的 USB 2.0 Host 电路设计类似,因此,这里不详细介绍电路设计原理。需要注意的是,如果产品上不使用 USB 2.0 Host,建议断开 USB 2.0 Host PHY 的供电,具体方法参考章节RK356x USB 2.0 PHYs 供电及功耗控制和图 5 的电路设计。

原稿技术图16,中文PDF第14页
图 2-15 RK356x USB 2.0 Host pins

原稿技术图17,中文PDF第14页
图 2-16 RK356x USB 2.0 Host 接口
2.5 RK3568 USB 3.0 OTG Type-A 接口硬件电路
RK3568 USB 3.0 OTG Type-A 的接口电路设计如图 2-17 ~ 图 2-19 所示。这种电路设计的优点是物理接口比 Micro USB 3.0 尺寸小,并且方便接 USB 外设。但缺点是,没有支持 USB3_OTG0_ID 的检测,因此无法支持硬件自动切换 OTG Host mode,需要通过软件切换 mode,切换命令参考章节 RK356x USBOTG mode 切换命令。通常情况下,USB 3.0 OTG 默认是配置为 OTG mode,当作为 Device mode 连接 PC 时,USB 驱动支持自动切换为 Device mode。如果要连接 USB 外设(如 U 盘)时,则需要软件强制切换为 Host mode。当需要从 Host mode 切换回 Device mode 时,同样需要软件强制切换。需要注意的是,有些 USB 3.0 外设(如 USB 3.0 机械硬盘和 USB 3.0 Camera)对工作电流要求较高,所以当 USB 3.0 OTG 作 Host mode 时,需要保证 VBUS 的供电电流达到 1A 以上,如图 2-19 所示,电源芯片 SY6280AAC 的输出限流配置为 1.446 A,满足大部分 USB 3.0 外设的工作电流需求。有四点需要注意:
-
DP/DM 必须分别串接 2.2 Ω 电阻,提高 DP/DM 的抗压/抗静电能力;
-
如果要支持 USB Device 动态拔插检测和充电类型检测功能,则 VBUSDET 脚一定要连接到 USBType-A 接口;
-
如果不需要支持 USB Device 动态拔插检测和充电类型检测功能,可以允许 VBUSDET 脚固定拉高到 3.3V 或者悬空 (推荐拉高到 3.3V)。由于 RK356x Maskrom USB 的连接不依赖于 VBUSDET 信号的检测,所以即使 VBUSDET 脚悬空,Maskrom USB 仍然可以正常工作并下载固件;
-
USB3_OTG0_ID 未使用,悬空即可,芯片内部拉高到 1.8V;

原稿技术图18,中文PDF第15页
图 2-17 RK3568 USB 3.0 OTG Pins

原稿技术图19,中文PDF第15页
图 2-18 RK3568 USB 3.0 OTG Type-A 接口

原稿技术图20,中文PDF第16页
图 2-19 RK3568 USB 3.0 OTG VBUS 和 OTG ID 控制电路
2.6 RK3568 USB 3.0 OTG Type-C 接口硬件电路
RK3568 SDK 未提供 USB 3.0 OTG Type-C 接口的硬件参考电路。如果开发者要支持该接口,需要在RK3568 USB 3.0 OTG 和 Type-C 接口中间增加一个 USB 3.1 Switch 芯片(如 FUSB340)和一个 CC 通信芯片(如 FUSB302)。
2.7 RK356x USB 3.0 HOST Type-A 接口硬件电路
RK3566/RK3568 USB 3.0 HOST Type-A 接口硬件电路与前面章节 RK3568 USB 3.0 OTG Type-A 接口硬件电路 基本一样,不同点在于 RK3566/RK3568 USB 3.0 HOST 没有 VBUSDET pin 和 ID pin。电路设计的注意事项,请参考 RK3568 USB 3.0 OTG Type-A 接口硬件电路。

原稿技术图21,中文PDF第16页
图 2-20 RK356x USB3.0 HOST1 Pins

原稿技术图22,中文PDF第17页
图 2-21 RK356x USB3.0 HOST1 Type-A 接口

原稿技术图23,中文PDF第17页
图 2-22 RK356x USB3.0 HOST1 VBUS 控制电路
3. RK356x USB DTS 配置
RK356x USB 硬件电路具有多样化的特点,尤其是灵活多变的 USB OTG 口的硬件电路,以及复杂的USB 3.0/SATA/QSGMII Combo PHY 复用关系。因此,建议开发者要在理解硬件电路设计的基础上,正确配置 USB 相关的控制器和 PHY 的 DTS 节点。本文档主要说明 USB DTS 的配置方法,没有说明 USB 控制器和 PHY 的驱动。如果开发者需要了解 USB控制器和 PHY 的详细设计,请参考 SDK 的 USB 开发指南[2]。
3.1 RK3568 USB 控制器和 PHY DTSI 节点
RK3568 USB 控制器和 PHY 的 DTS 详细配置方法,请参考内核文档[4]~[10]。如下代码是 DTSI 中 USB 控制器和 PHY 相关的主要节点。
/* USB 3.0 OTG/SATA Combo PHY_0 */
combphy0_us: phy@fe820000 {
compatible = "rockchip,rk3568-naneng-combphy";
reg = <0x0 0xfe820000 0x0 0x100>;
#phy-cells = <1>;
clocks = <&pmucru CLK_PCIEPHY0_REF>, <&cru PCLK_PIPEPHY0>,
<&cru PCLK_PIPE>;
clock-names = "refclk", "apbclk", "pipe_clk";
assigned-clocks = <&pmucru CLK_PCIEPHY0_REF>;
assigned-clock-rates = <24000000>;
resets = <&cru SRST_P_PIPEPHY0>, <&cru SRST_PIPEPHY0>;
reset-names = "combphy-apb", "combphy";
rockchip,pipe-grf = <&pipegrf>;
rockchip,pipe-phy-grf = <&pipe_phy_grf0>;
status = "disabled";
};
/* USB 3.0 Host/SATA/QSGMII Combo PHY_1 */
combphy1_usq: phy@fe830000 {
compatible = "rockchip,rk3568-naneng-combphy";
reg = <0x0 0xfe830000 0x0 0x100>;
#phy-cells = <1>;
clocks = <&pmucru CLK_PCIEPHY1_REF>, <&cru PCLK_PIPEPHY1>,
<&cru PCLK_PIPE>;
clock-names = "refclk", "apbclk", "pipe_clk";
assigned-clocks = <&pmucru CLK_PCIEPHY1_REF>;
assigned-clock-rates = <24000000>;
resets = <&cru SRST_P_PIPEPHY1>, <&cru SRST_PIPEPHY1>;
reset-names = "combphy-apb", "combphy";
rockchip,pipe-grf = <&pipegrf>;
rockchip,pipe-phy-grf = <&pipe_phy_grf1>;
status = "disabled";
};
/* USB OTG/USB Host_1 USB 2.0 Comb PHY_0 */
usb2phy0: usb2-phy@fe8a0000 {
compatible = "rockchip,rk3568-usb2phy";
reg = <0x0 0xfe8a0000 0x0 0x10000>;
interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&pmucru CLK_USBPHY0_REF>;
clock-names = "phyclk";
#clock-cells = <0>;
assigned-clocks = <&cru USB480M>;
assigned-clock-parents = <&usb2phy0>;
clock-output-names = "usb480m_phy";
rockchip,usbgrf = <&usb2phy0_grf>;
status = "disabled";
u2phy0_host: host-port {
#phy-cells = <0>;
status = "disabled";
};
u2phy0_otg: otg-port {
#phy-cells = <0>;
status = "disabled";
};
};
/* USB Host_1/USB Host_2 USB 2.0 Comb PHY_0 */
usb2phy1: usb2-phy@fe8b0000 {
compatible = "rockchip,rk3568-usb2phy";
reg = <0x0 0xfe8b0000 0x0 0x10000>;
interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&pmucru CLK_USBPHY1_REF>;
clock-names = "phyclk";
#clock-cells = <0>;
rockchip,usbgrf = <&usb2phy1_grf>;
status = "disabled";
u2phy1_host: host-port {
#phy-cells = <0>;
status = "disabled";
};
u2phy1_otg: otg-port {
#phy-cells = <0>;
status = "disabled";
};
};
/* USB 3.0 OTG controller */
usbdrd30: usbdrd {
compatible = "rockchip,rk3568-dwc3", "rockchip,rk3399-dwc3";
clocks = <&cru CLK_USB3OTG0_REF>, <&cru CLK_USB3OTG0_SUSPEND>,
<&cru ACLK_USB3OTG0>, <&cru PCLK_PIPE>;
clock-names = "ref_clk", "suspend_clk",
"bus_clk", "pipe_clk";
#address-cells = <2>;
#size-cells = <2>;
ranges;
status = "disabled";
usbdrd_dwc3: dwc3@fcc00000 {
compatible = "snps,dwc3";
reg = <0x0 0xfcc00000 0x0 0x400000>;
interrupts = <GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "otg";
phys = <&u2phy0_otg>, <&combphy0_us PHY_TYPE_USB3>;
phy-names = "usb2-phy", "usb3-phy";
phy_type = "utmi_wide";
power-domains = <&power RK3568_PD_PIPE>;
resets = <&cru SRST_USB3OTG0>;
reset-names = "usb3-otg";
snps,dis_enblslpm_quirk;
snps,dis-u1-entry-quirk;
snps,dis-u2-entry-quirk;
snps,dis-u2-freeclk-exists-quirk;
snps,dis-del-phy-power-chg-quirk;
snps,dis-tx-ipgap-linecheck-quirk;
snps,dis_rxdet_inp3_quirk;
snps,xhci-trb-ent-quirk;
status = "disabled";
};
};
/* USB 3.0 Host_1 controller */
usbhost30: usbhost {
compatible = "rockchip,rk3568-dwc3", "rockchip,rk3399-dwc3";
clocks = <&cru CLK_USB3OTG1_REF>, <&cru CLK_USB3OTG1_SUSPEND>,
<&cru ACLK_USB3OTG1>, <&cru PCLK_PIPE>;
clock-names = "ref_clk", "suspend_clk",
"bus_clk", "pipe_clk";
#address-cells = <2>;
#size-cells = <2>;
ranges;
status = "disabled";
usbhost_dwc3: dwc3@fd000000 {
compatible = "snps,dwc3";
reg = <0x0 0xfd000000 0x0 0x400000>;
interrupts = <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>;
dr_mode = "host";
phys = <&u2phy0_host>, <&combphy1_usq PHY_TYPE_USB3>;
phy-names = "usb2-phy", "usb3-phy";
phy_type = "utmi_wide";
power-domains = <&power RK3568_PD_PIPE>;
resets = <&cru SRST_USB3OTG1>;
reset-names = "usb3-host";
snps,dis_enblslpm_quirk;
snps,dis-u2-freeclk-exists-quirk;
snps,dis-del-phy-power-chg-quirk;
snps,dis-tx-ipgap-linecheck-quirk;
snps,dis_rxdet_inp3_quirk;
snps,xhci-trb-ent-quirk;
status = "disabled";
};
};
/* USB 2.0 Host_2 EHCI controller for high speed */
usb_host0_ehci: usb@fd800000 {
compatible = "generic-ehci";
reg = <0x0 0xfd800000 0x0 0x40000>;
interrupts = <GIC_SPI 130 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_USB2HOST0>, <&cru HCLK_USB2HOST0_ARB>,
<&cru PCLK_USB>, <&usb2phy1>;
clock-names = "usbhost", "arbiter", "pclk", "utmi";
phys = <&u2phy1_otg>;
phy-names = "usb2-phy";
status = "disabled";
};
/* USB 2.0 Host_2 OHCI controller for full/low speed */
usb_host0_ohci: usb@fd840000 {
compatible = "generic-ohci";
reg = <0x0 0xfd840000 0x0 0x40000>;
interrupts = <GIC_SPI 131 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_USB2HOST0>, <&cru HCLK_USB2HOST0_ARB>,
<&cru PCLK_USB>, <&usb2phy1>;
clock-names = "usbhost", "arbiter", "pclk", "utmi";
phys = <&u2phy1_otg>;
phy-names = "usb2-phy";
status = "disabled";
};
/* USB 2.0 Host_3 EHCI controller for high speed */
usb_host1_ehci: usb@fd880000 {
compatible = "generic-ehci";
reg = <0x0 0xfd880000 0x0 0x40000>;
interrupts = <GIC_SPI 133 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_USB2HOST1>, <&cru HCLK_USB2HOST1_ARB>,
<&cru PCLK_USB>, <&usb2phy1>;
clock-names = "usbhost", "arbiter", "pclk", "utmi";
phys = <&u2phy1_host>;
phy-names = "usb2-phy";
status = "disabled";
};
/* USB 2.0 Host_3 OHCI controller for full/low speed */
usb_host1_ohci: usb@fd8c0000 {
compatible = "generic-ohci";
reg = <0x0 0xfd8c0000 0x0 0x40000>;
interrupts = <GIC_SPI 134 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_USB2HOST1>, <&cru HCLK_USB2HOST1_ARB>,
<&cru PCLK_USB>, <&usb2phy1>;
clock-names = "usbhost", "arbiter", "pclk", "utmi";
phys = <&u2phy1_host>;
phy-names = "usb2-phy";
status = "disabled";
};
3.2 RK3568 USB 3.0 OTG to USB 2.0 only 配置
USB 3.0 OTG 的 USB 3.0 PHY 与 SATA_0 控制器复用 Comb PHY_0,当 Comb PHY_0 配置给 SATA_0 用时,需要配置 USB 3.0 OTG 工作在 USB 2.0 only 模式,对应的 DTS 配置如下(控制器和PHY的驱动不用改动):
&usbdrd_dwc3 {
phys = <&u2phy0_otg>; /* 配置 phys 属性只引⽤ usb 2.0 phy 节点 */
phy-names = "usb2-phy";
extcon = <&usb2phy0>;
maximum-speed = "high-speed"; /* 配置 dwc3 控制器最⾼⽀持 high speed */
snps,dis_u2_susphy_quirk; /* 配置 dwc3 控制器不⽀持⾃动 suspend usb2 phy */
snps,usb2-lpm-disable; /* 配置 dwc3 host mode 不⽀持 LPM 功能 */
};
&combphy0_us {
rockchip,dis-u3otg0-port; /* 配置 dwc3_0 控制器最⾼⽀持 high speed */
status = "okay";
};
&u2phy0_otg {
rockchip,dis-u2-susphy; /* 可选项,⽤于关闭 PHY 动态进⼊ suspend 的功能,提⾼
USB 热拔插稳定性 */
status = "okay";
};
3.3 RK356x USB 3.0 Host to USB 2.0 only 配置
USB 3.0 Host 的 USB 3.0 PHY 与 SATA_1/QSGMII 控制器复用 Comb PHY_1,当 Comb PHY_1 配置给SATA_1 或者 QSGMII 用时,需要配置 USB 3.0 Host 工作在 USB 2.0 only 模式,对应的 DTS 配置如下(控制器和PHY的驱动不用改动):
&usbhost_dwc3 {
phys = <&u2phy0_host>; /* 配置 phys 属性只引⽤ usb 2.0 phy 节点 */
phy-names = "usb2-phy";
maximum-speed = "high-speed"; /* 配置 dwc3 控制器最⾼⽀持 high speed */
snps,dis_u2_susphy_quirk; /* 配置 dwc3 控制器不⽀持⾃动 suspend usb2 phy */
snps,usb2-lpm-disable; /* 配置 dwc3 host mode 不⽀持 LPM 功能 */
status = "okay";
};
&combphy1_usq {
rockchip,dis-u3otg1-port; /* 配置 dwc3_1 控制器最⾼⽀持 high speed */
status = "okay";
};
3.4 RK356x Type-C USB DTS 配置
常⻅的 RK356x Type-C 设计方案包括如下五种:
-
RK3566 Type-C USB 2.0 only;
-
RK3568 Type-C USB 2.0 only;
-
RK3566 Type-C USB 2.0 + PD;
-
RK3568 Type-C USB 2.0 + PD;
-
RK3568 Type-C USB 3.0 + PD;上述方案 1 和 2,硬件电路可以参考章节RK3566 Type-C USB 2.0 only 硬件电路设计[No PD],采用了CC to OTG_ID 的硬件转换电路,芯片内部检测 OTG mode 的原理与 Micro-B USB 接口一样。因此,方案 1 和 2 的 USB DTS 配置请参考常⻅的 RK356x OTG Micro-USB /Type-A 接口设计即可。方案 3 和 4,硬件电路可以参考章节RK3566 Type-C USB 2.0 + PD 硬件电路,采用外置 Type-C 控制器芯片以支持 PD 通信,这两种方案的 USB DTS 配置基本一样,本章节重点说明方案 3 (RK3566 Type-CUSB 2.0 + PD) 的 USB DTS 配置方法,方案 4 只需要在此基础上,参考章节RK3568 USB 3.0 OTG toUSB 2.0 only 配置,配置 USB 控制器工作在 USB 2.0 only 模式即可。方案 5,考虑到 RK3568 USB3 PHY 不支持 Type-C 正反面切换,因此,硬件电路上需要增加两个外置芯片,即:一个 USB3 Switch 芯片(如 FUSB340)和一个 Type-C 控制器芯片(如 FUSB302)。其中,Type-C 控制器芯片的 DTS 配置可以参考方案 3 和 4,而 USB 3.1 Switch 芯片的控制,需要根据硬件方案选型,自行开发控制驱动。
3.4.1 Linux-4.19 RK3566 Type-C USB 2.0 + FUSB302 DTS 配置
Linux-4.19 内核支持两套 FUSB302 驱动,分别是:drivers/mfd/fusb302.c [Legacy]drivers/usb/typec/tcpm/fusb302.c [New]Linux-4.19 SDK 默认使用 Legacy 驱动,rockchip_defconfig 已经使能对应的驱动配置CONFIG_FUSB_30X,并且,该驱动已经在 RK3399 平台上推广和量产,推荐优先使用。如果使用新驱动,需要参考Linux-4.19 RK3566 Type-C USB 2.0 + HUSB311 DTS 配置,更新内核 Type-C TCPM 系列补丁。
以适配 Legacy FUSB302 驱动为例,Linux-4.19 DTS 参考配置如下:
/* 根据 FUSB302 I2C 实际硬件设计进⾏修改 */
&i2cx {
fusb0: fusb30x@22 { /* 配置 FUSB302 芯⽚硬件信息*/
compatible = "fairchild,fusb302";
reg = <0x22>;
pinctrl-names = "default";
pinctrl-0 = <&fusb0_int>;
int-n-gpios = <&gpiox RK_Pxx GPIO_ACTIVE_HIGH>; /* 根据 FUSB302
INT 实际连接的 GPIO 进⾏修改 */
vbus-5v-gpios = <&gpiox RK_Pxx GPIO_ACTIVE_HIGH>; /* 根据 Type-C
VBUS 实际连接的 GPIO 进⾏修改 */
status = "okay";
};
};
/* 使能 USB2.0 PHY */
&usb2phy0 {
status = "okay";
extcon = <&fusb0>; /* 配置 extcon 属性,⽤于接收 FUSB302 驱动的 Type-C DRD
notifier*/
};
/* 使能 USB2.0 PHY OTG port */
&u2phy0_otg {
rockchip,dis-u2-susphy; /* 可选项,⽤于关闭 PHY 动态进⼊ suspend 的功能,提⾼
USB 热拔插稳定性 */
status = "okay";
};
/* 使能 USB3 控制器⽗节点 */
&usbdrd30 {
status = "okay";
};
/* 使能 USB3 控制器⼦节点 */
&usbdrd_dwc3 {
extcon = <&fusb0>; /* 配置 extcon 属性,⽤于接收 FUSB302 驱动的 Type-C DRD
notifier*/
status = "okay";
};
&pinctrl {
fusb30x { /* 配置 FUSB302 驱动的中断和 vbus gpio pinctrl */
fusb0_int: fusb0-int {
rockchip,pins = <gpiox RK_Pxx RK_FUNC_GPIO
&pcfg_pull_up>,
<gpiox RK_Pxx RK_FUNC_GPIO
&pcfg_pull_up>;
};
};
};
3.4.2 Linux-4.19 RK3566 Type-C USB 2.0 + HUSB311 DTS 配置
RK3568 最新的 Linux-4.19 内核已经可以支持 HUSB311 和 ET7303 这两款 Type-C 控制器芯片,考虑到HUSB311 和 ET7303 的 I2C 设备地址都为4E,DTS 配置基本一样,只需要修改节点名字和”compatible” 属性,因此,本章节以 HUSB311 为例进行说明。HUSB311 和 ET7303 这两款芯片都是基于内核 Type-C 驱动 TCPM 框架,因此,要求 Linux-4.19 同步到develop-4.19 最新代码,如果无法同步完整的内核代码,至少要同步如下目录:
kernel/include/linux/usb
kernel/drivers/usb/typec
kernel/drivers/usb/dwc3
同时,还需要手动更新如下补丁:
0001-usb-typec-tcpm-add-vdm-retry-mechanism.patch
0002-arm64-rockchip_defconfig-enable-tcpm-and-husb311-and.patch
请下载完整的参考资料: “RK356x_Linux-4.19_TypeC-HUSB311-ET7303-参考设计”,进行修改。下载地址:https://redmine.rockchip.com.cn/documents/113以 RK3566 适配 HUSB311 驱动为例,Linux-4.19 DTS 参考配置如下:
/* 需要包含头⽂件 */
#include "dt-bindings/usb/pd.h"
/* 可选配置,⽤于 vbus 通过 gpio 控制的硬件⽅案 */
vcc_otg_vbus: otg-vbus-regulator {
compatible = "regulator-fixed";
gpio = <&gpiox RK_PXX GPIO_ACTIVE_HIGH>; /* 根据 Type-C VBUS 实际连接的 GPIO
进⾏修改 */
pinctrl-names = "default";
pinctrl-0 = <&otg_vbus_drv>;
regulator-name = "vcc_otg_vbus";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
enable-active-high;
};
/* 根据 HUSB311 I2C 实际硬件设计进⾏修改 */
&i2cx {
/* 对于 et7303, 可以修改为 usbc0: et7303@4e */
usbc0: husb311@4e {
/* 对于 et7303, compatible = "etek,et7303"*/
compatible = "hynetek,husb311";
reg = <0x4e>;
/* 根据 HUSB311 INT 实际连接的 GPIO 进⾏修改 */
interrupt-parent = <&gpiox>;
interrupts = <X IRQ_TYPE_LEVEL_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&husb311_int>;
/*
* vbus 配置
* 若 vbus 是通过 gpio 控制,则需要 vbus-supply = <&vcc_otg_vbus> 配
置;
* 若 vbus 是 RK817/RK818/bq25700/其他 charge ic 输出,则⽆需 vbus-
supply = <&vcc_otg_vbus> 配置;
*/
vbus-supply = <&vcc_otg_vbus>;
status = "okay";
usb_con: connector {
data-role = "dual";
power-role = "dual";
try-power-role = "sink";
/*
* source-pdos: PDO_FIXED(电压(mV), 电流(mA),
PDO_FIXED_USB_COMM)
* 主板端作为 Source 时,主板 vbus 可以输出的电压/电流列表,对于RK
平台采⽤默认值即可
*/
source-pdos = <PDO_FIXED(5000, 2000,
PDO_FIXED_USB_COMM)>;
/*
* sink-pdos: <PDO_FIXED(电压(mV), 电流(mA),
PDO_FIXED_USB_COMM)>
* 主板端作为 Sink 时, 主板可以⽀持的电压/电流列表.
* 若有 PD 快充需求, sink-pdos 配置依赖于 charger ic 充电输⼊最
⼤电压/电流和主板承受的能⼒
* 若电压太⼤可能会烧主板, 这个细节请与硬件⼯程师沟通.
* 下⾯是主板可⽀持最⼤充电电压(20v)/电流(3A)配置, 请根据硬件设计
和实际需求进⾏适当修改.
* ⽐如主板只⽀持最⼤充电电压(12v)/电流(3A),必须需要去掉 15v/3A
和 20V/3A.
*/
sink-pdos = <PDO_FIXED(5000, 3000, PDO_FIXED_USB_COMM)
PDO_FIXED(9000, 3000, PDO_FIXED_USB_COMM)
PDO_FIXED(12000, 3000, PDO_FIXED_USB_COMM)
PDO_FIXED(15000, 3000, PDO_FIXED_USB_COMM)
PDO_FIXED(20000, 3000, PDO_FIXED_USB_COMM)>;
/* 若没有 PD 快充需求, sink-pdos 配置如下即可. */
sink-pdos = <PDO_FIXED(5000, 2000, PDO_FIXED_USB_COMM)>;
/*充电功率(op-sink-microwatt) = max_vol(mV) * max_cur(mA),
使⽤默认即可 */
op-sink-microwatt = <10000000>;
};
};
};
&pinctrl {
husb311 {
husb311_int: husb311-int {
rockchip,pins = <X RK_PXX RK_FUNC_GPIO &pcfg_pull_up>;
};
};
usb {
otg_vbus_drv: otg-vbus-drv {
/* 可选项,如果⽆ vcc_otg_vbus,就不需要该配置 */
rockchip,pins = <RK_XX RK_FUNC_GPIO &pcfg_pull_none>;
};
};
};
/* 使能 PMIC */
bq25700: bq25700@6b {
compatible = "ti,bq25703";
reg = <0x6b>;
extcon = <&usbc0>; /* 配置 extcon 属性,⽤于接收 TCPM 驱动的 PD notifier */
......
};
/* 使能 USB2.0 PHY */
&u2phy0 {
status = "okay";
extcon = <&usbc0>; /* 配置 extcon 属性,⽤于接收 TCPM 驱动的 Type-C DRD
notifier*/
};
/* 使能 USB2.0 PHY OTG port */
&u2phy0_otg {
rockchip,dis-u2-susphy; /* 可选项,⽤于关闭 PHY 动态进⼊ suspend 的功能,提⾼
USB 热拔插稳定性 */
status = "okay";
};
/* 使能 USB3 控制器⽗节点 */
&usbdrd30 {
status = "okay";
};
/* 使能 USB3 控制器⼦节点 */
&usbdrd_dwc3 {
status = "okay";
extcon = <&usbc0>; /* 配置 extcon 属性,⽤于接收 TCPM 驱动的 Type-C DRD
notifier */
};
USB VBUS 通过 RK817/RK818/bq25700 等 PMIC 控制的 DTS 配置说明
/* rk818 */
rk818: pmic@1c {
extcon = <&usbc0>;
};
/* rk817 */
rk817: pmic@20 {
charger {
extcon = <&usbc0>;
};
};
/* bq25700 */
bq25700: bq25700@09 {
extcon = <&usbc0>;
};
3.4.3 Linux-5.10 RK3566 Type-C USB 2.0 + FUSB302 DTS 配置
Linux-5.10 Type-C 驱动采用标准的 TCPM 框架,与 Linux-4.19及更早的内核版本,最大的区别在于:Linux-5.10 Type-C 驱动采用 remote-endpoint 和注册回调函数的机制,替代之前的 extcon 机制。因此,Linux-5.10 Type-C 相关的 DTS 配置中,不再需要 “extcon” 属性。以 RK3566 适配 FUSB302 驱动为例,Linux-5.10 DTS 参考配置如下:
/* 配置 VBUS gpio regulator,⽤于 Type-C 作 USB Host mode 时 VBUS 5V 输出控制 */
vbus_typec: vbus-typec-regulator {
compatible = "regulator-fixed";
enable-active-high;
gpio = <&gpiox RK_PXX GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&vcc5v0_typec0_en>;
regulator-name = "vbus_typec";
vin-supply = <&vcc5v0_sys>;
};
/* 配置 FUSB302 芯⽚硬件信息*/
&i2cX { /* 根据 FUSB302 I2C 实际硬件设计进⾏修改 */
usbc0: fusb302@22 {
compatible = "fcs,fusb302";
reg = <0x22>;
interrupt-parent = <&gpix>; /* 根据 FUSB302 INT 实际连接的 GPIO 进⾏
修改 */
interrupts = <RK_PXX IRQ_TYPE_LEVEL_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&usbc0_int>;
vbus-supply = <&vbus_typec>;
status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
/* ⽤于关联 USB 控制器,实现 USB ⻆⾊切换的功能 */
port@0 {
reg = <0>;
usbc0_role_sw: endpoint@0 {
remote-endpoint = <&dwc3_role_switch>;
};
};
};
usb_con: connector { /* ⽤于描述 PD 协议相关信息 */
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, 2500, PDO_FIXED_USB_COMM)>;
source-pdos =
<PDO_FIXED(5000, 1500, PDO_FIXED_USB_COMM)>;
};
};
};
/* 使能 Type-C0 USB2.0 PHY */
&u2phy0 {
status = "okay";
};
&u2phy0_otg {
rockchip,dis-u2-susphy; /* 可选项,⽤于关闭 PHY 动态进⼊ suspend 的功能,提⾼
USB 热拔插稳定性 */
status = "okay";
};
/* 使能 USB3 控制器⽗节点 */
&usbdrd30 {
status = "okay";
};
/* 使能 USB3 控制器⼦节点 */
&usbdrd_dwc3 {
status = "okay";
usb-role-switch; /* ⽤于使能 DWC3 驱动注册 USB Role Switch 回调函数 */
port {
#address-cells = <1>;
#size-cells = <0>;
dwc3_role_switch: endpoint@0 {
reg = <0>;
remote-endpoint = <&usbc0_role_sw>; /* 关联 FUSB302,实现
USB ⻆⾊切换的功能 */
};
};
};
&pinctrl {
usb-typec {
usbc0_int: usbc0-int { /* 配置 FUSB302 驱动的中断 gpio pinctrl */
rockchip,pins = <X RK_PXX RK_FUNC_GPIO &pcfg_pull_up>;
};
vcc5v0_typec0_en: vcc5v0-typec0-en { /* 配置 FUSB302 驱动的 VBUS
gpio pinctrl */
rockchip,pins =
<X RK_PXX RK_FUNC_GPIO &pcfg_pull_none>;
};
};
};
3.4.4 Linux-5.10 RK3566 Type-C USB 2.0 + HUSB311 DTS 配置
使用 HUSB311 芯片替换 FUSB302 芯片,只需要基于Linux-5.10 RK3566 Type-C USB 2.0 + FUSB302DTS 配置进行简单修改即可,参考修改:
/* 配置外置 Type-C 控制器芯⽚ HUSB311 */
&i2cx {
usbc0: husb311@4e {
compatible = "hynetek,husb311";
reg = <0x4e>;
......
};
};
3.5 USB VBUS 配置
Rockchip 平台的 USB VBUS 控制电路,主要有三种方案[3]:
-
使用 GPIO 控制电源稳压芯片输出 Vbus 5V 供电电压;
-
使用 PMIC(如RK809/RK817/RK818)输出 Vbus 5V 供电电压;
-
开机后,硬件直接输出 Vbus 5V 供电电压,不需要软件控制,一般用于 USB Host 接口;RK356x SDK 主要使用的是第 1 种方案,以 RK3568 EVB 的 OTG 口和 HOST 口的 VBUS 配置为例:
vcc5v0_host: vcc5v0-host-regulator {
compatible = "regulator-fixed";
enable-active-high;
gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&vcc5v0_host_en>;
regulator-name = "vcc5v0_host";
regulator-always-on; /* Host Vbus 为常供电,所以配置属性为 regulator-always-
on */
};
vcc5v0_otg: vcc5v0-otg-regulator {
compatible = "regulator-fixed";
enable-active-high;
gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&vcc5v0_otg_en>;
regulator-name = "vcc5v0_otg";
};
&pinctrl {
usb {
vcc5v0_host_en: vcc5v0-host-en {
rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>;
};
vcc5v0_otg_en: vcc5v0-otg-en {
rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
};
/* 注意: host 控制 vbus 的属性是 phy-supply */
&u2phy0_host {
phy-supply = <&vcc5v0_host>;
status = "okay";
};
/* 注意: otg 控制 vbus 的属性是 vbus-supply */
&u2phy0_otg {
vbus-supply = <&vcc5v0_otg>;
status = "okay";
};
&u2phy1_host {
phy-supply = <&vcc5v0_host>;
status = "okay";
};
&u2phy1_otg {
phy-supply = <&vcc5v0_host>;
status = "okay";
};
3.6 Linux USB DT 配置的注意点
3.6.1 USB DT 重要属性说明
3.6.1.1 USB 3.1 控制器 DT 属性
-
“snps,dis_rxdet_inp3_quirk”:RK356x USB 3.1 控制器的特有属性,用于关闭 P3 state 下的receiver dtection(Rx-detect)功能,即增加该属性后,在执行receiver dtection时,会先将USB3 PHY 状态从 P3 切回 P2,待 receiver dtection(耗时 30us 左右)结束后,再将 PHY 状态切回 P3。该属性可以解决部分 USB3 盘无法识别的兼容性问题。
-
“snps,dis_u2_susphy_quirk”: 配置 USB 3.1 控制器不支持自动 suspend USB2 PHY。在 USB 3.1force 为 USB 2.0 使用的场景,必须加该属性,否则,可能导致 USB2 功能异常。其他场景,加该属性,不会影响 USB 功能,但会增加 USB autosuspend 场景的功耗。
-
“snps,usb2-lpm-disable”:配置 USB 3.1 控制器关闭 USB2 LPM 的功能。在 USB 3.1 force 为USB 2.0 使用的场景,必须加该属性,以兼容不支持 USB2 LPM 的 U盘。
-
“usb-role-switch” :仅用于 Linux-5.10 且 USB 物理接口为标准 Type-C 接口(带有 PD 控制器芯片),同时须配置 dr_mode = “otg” 属性;如果 dr_mode 为非 “otg” 模式,请勿配置 “usb-role-switch” ;
-
“extcon” :主要功能之一是动态切换 OTG mode,适用于非标准 Type-C 接口(带有 PD 控制器芯片)的硬件电路设计,如:USB Micro 接口或者 Type-A 接口,同时控制器配置为 “otg” 模式的方案中,实现 OTG 模式动态切换。
3.6.1.2 USB2 PHY DT 属性
-
“vbus-supply” 和 “phy-supply”:这两个属性都是用于控制 VBUS 输出 5V,但两者又有使用区别。”vbus-supply” 用于 OTG 口,支持动态开关 VBUS。”phy-supply” 用于 USB2 HOST 口,系统上电后,VBUS 5V 常开;
-
“rockchip,vbus-always-on”:用于 OTG 接口且 VBUS 常供电的场景。增加该属性,可以解决 USBDevice (如:USB ADB)无法识别的问题。但同时会禁止 USB2 PHY autosuspend 的功能,增加动态运行时的 USB2 PHY 功耗;
-
“rockchip,dis-u2-susphy”,关闭USB2 PHY驱动动态进入suspend mode的功能,主要用于 USB
2.0 only 的方案,保持 USB2 PHY 输出时钟给 USB 控制器。
3.6.1.3 USB 3.0/SATA/QSGMII ComboPHY DT 属性
-
“rockchip,dis-u3otg0-port”:关闭 USB3_OTG0 的 USB3 root port,用于 USB3_OTG0 force 为USB 2.0 使用的场景;
-
“rockchip,dis-u3otg1-port”:关闭 USB3_HOST1 的 USB3 root port,用于 USB3_HOST1 force为 USB 2.0 使用的场景;
4. RK356x USB OTG mode 切换命令
RK356x SDK 支持通过软件方法,强制设置 USB 2.0/3.0 OTG 切换到 Host mode 或者 Peripheralmode,而不受 USB 硬件电路的 OTG ID 电平或者 Type-C 接口的影响。Linux-4.19/5.10 USB OTG mode 切换命令 (Legacy)
#1.Force host mode
echo host > /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
#2.Force peripheral mode
echo peripheral > /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
#3.Force otg mode
echo otg > /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
Linux-5.10 内核新增切换命令
#1.Force host mode
echo host > /sys/kernel/debug/usb/fcc00000.usb/mode
#2.Force peripheral mode
echo device > /sys/kernel/debug/usb/fcc00000.usb/mode
Note:Linux-5.10 内核新增的切换命令,可以解决旧的切换命令的使用限制(依赖于 USB DTS 的 “extcon” 属性的正确配置)。
5. Type-C 控制器芯片支持列表
表 5-1 Type-C 控制器芯片支持列表
| Type-C控制器芯 片型号 |
Linux-4.4 | Linux- 4.19 |
Linux- 5.10 |
说明 |
|---|---|---|---|---|
| FUSB302 | 支持 | 支持 | 支持 | RK平台最常用 |
| ET7301B | 支持 | 支持 | 支持 | 软硬件完全兼容 FUSB302note1 |
| ET7303 | 不支持 | 支持 | 支持 | 硬件兼容 FUSB302,软件驱动与 RT1711 高度相似note2 |
| HUSB311 | 不支持 | 支持 | 支持 | 推荐优先使用 硬件兼容 FUSB302,但软件驱动 不兼容note3 |
| RT1711H | 不支持 | 支持 | 支持 | 硬件兼容 FUSB302,软件驱动与 ET7303 高度相似note4 |
| ANX7411 | 不支持 | 不支持 | 调试中 | RK3588 适配中 |
| WUSB3801 | SDK 不支 持, 个别项目 使用 |
不支持 | 不支持 | 自定义的单线通信机制,误码率 高,无法保证通信稳定。 |
note1.Linux-4.4 因为不支持 TCPM 软件框架,所有只能支持 FUSB302/ET7301B,两者可以直接替换使用,不需要修改软硬件;Linux-4.19/5.10 支持 TCPM 软件框架和 TCPCI 协议,理论上可以兼容所有基于 TCPCI 标准设计的Type-C 控制器芯片(如:ET7303/HUSB311/RT1711H);note2.小封装的 ET7303 (据了解原厂目前没有提供大封装) 已经在 RK 平台验证通过。内核需要单独使能CONFIG_TYPEC_ET7303,DTS 详细配置请参考章节Linux-4.19 RK3566 Type-C USB 2.0 +HUSB311 DTS 配置和章节Linux-5.10 RK3566 Type-C USB 2.0 + HUSB311 DTS 配置,因为HUSB311 和 ET7303 的 I2C 设备地址都为 0x4E,DTS 配置基本一样,只需要修改节点名字和compatible = “etek,et7303” 属性。note3.内核需要单独使能 CONFIG_TYPEC_HUSB311,DTS 详细配置请参考章节Linux-4.19 RK3566Type-C USB 2.0 + HUSB311 DTS 配置和章节Linux-5.10 RK3566 Type-C USB 2.0 + HUSB311 DTS配置。note4.RT1711H 硬件兼容 FUSB302/ET7303,同时软件驱动与 ET7303 高度相似。内核需要单独使能CONFIG_TYPEC_RT1711H,DTS 配置与 HUSB311/ET7303 基本一样,I2C 设备地址都为 0x4E,只需要修改节点名字和 compatible = “richtek,rt1711h” 属性。
6. 参考文献
-
《Universal Serial Bus Type-C Cable and Connector Specification》
-
《Rockchip_Developer_Guide_USB_CN》
-
《Rockchip_RK3399_Developer_Guide_USB_CN》
-
kernel/Documentation/devicetree/bindings/usb/generic.txt
-
kernel/Documentation/devicetree/bindings/usb/dwc3.txt
-
kernel/Documentation/devicetree/bindings/usb/rockchip,dwc3.txt
-
kernel/Documentation/devicetree/bindings/usb/usb-ehci.txt
-
kernel/Documentation/devicetree/bindings/usb/usb-ohci.txt
-
kernel/Documentation/devicetree/bindings/phy/phy-rockchip-naneng-combphy.txt
-
kernel/Documentation/devicetree/bindings/phy/phy-rockchip-inno-usb2.txt
