目录
[1. USB 主机与设备](#1. USB 主机与设备)
[2. USB接口与传输速率](#2. USB接口与传输速率)
[3. USB软件架构](#3. USB软件架构)
[二、RK3568 USB控制器与PHY简介](#二、RK3568 USB控制器与PHY简介)
[1. 控制器资源概览](#1. 控制器资源概览)
[2. PHY资源与复用关系](#2. PHY资源与复用关系)
[1. 电源5V供电:USB接口的"生命线"](#1. 电源5V供电:USB接口的“生命线”)
[1.1 Host 5V供电](#1.1 Host 5V供电)
[1.2 OTG 5V供电](#1.2 OTG 5V供电)
[2. 其他关键硬件信号](#2. 其他关键硬件信号)
[1. 电源5V供电Regulator节点](#1. 电源5V供电Regulator节点)
[1.1 主USB电源](#1.1 主USB电源)
[1.2 Host 5V供电](#1.2 Host 5V供电)
[1.3 OTG 5V供电](#1.3 OTG 5V供电)
[2. USB 2.0 PHY节点](#2. USB 2.0 PHY节点)
[2.1 usb2phy0(OTG + USB 3.0 Host共用)](#2.1 usb2phy0(OTG + USB 3.0 Host共用))
[2.2 usb2phy1(USB 2.0 Host0 + Host1共用)](#2.2 usb2phy1(USB 2.0 Host0 + Host1共用))
[3. USB 2.0 Host控制器节点](#3. USB 2.0 Host控制器节点)
[3.1 EHCI控制器(USB 2.0高速)](#3.1 EHCI控制器(USB 2.0高速))
[3.2 OHCI控制器(USB 1.1全速/低速)](#3.2 OHCI控制器(USB 1.1全速/低速))
[4. USB 3.0控制器节点](#4. USB 3.0控制器节点)
[4.1 USB 3.0 OTG控制器](#4.1 USB 3.0 OTG控制器)
[4.2 USB 3.0 Host控制器](#4.2 USB 3.0 Host控制器)
[5. GPIO复用配置](#5. GPIO复用配置)
前言
USB作为嵌入式产品中最基础、最常用的外设接口,其功能适配的稳定性直接影响产品的用户体验。RK3568作为瑞芯微出品的一款高性能、低功耗的国产SoC,广泛应用于AIoT、边缘计算、工业控制等领域,其USB控制器资源丰富,支持USB 3.0 OTG、USB 2.0 Host等多种接口类型。
近期,我在基于RK3568的Android 13 SDK上完成了全部USB接口的适配工作。本文将从硬件原理图分析入手,深入解析设备树中每一个USB相关节点及其关键属性的作用,并结合实际的调试验证过程,分享一套完整的USB适配思路和方法。无论你是刚接触RK3568平台,还是在调试USB功能时遇到了困难,希望这篇文章都能为你提供一些参考。
一、USB基础知识快速回顾
在深入适配工作之前,我们先来简单回顾几个USB相关的核心概念。
1. USB 主机与设备
| 角色 | 说明 |
|---|---|
| USB Host(主设备) | 控制和管理USB总线,是数据传输的发起方。常见如电脑、开发板上的USB-A口。 |
| USB Slave/Device(从设备) | 受主机控制的设备,响应主机的请求。常见如U盘、鼠标、键盘。 |
| USB OTG(On-The-Go) | 允许设备在主设备和从设备之间动态切换角色,实现"即插即用"的设备互联。 |
2. USB接口与传输速率
| 接口版本 | 别名 | 最高速率 | 备注 |
|---|---|---|---|
| USB 1.1 | Full Speed / Low Speed | 12 Mbps / 1.5 Mbps | 已逐步淘汰 |
| USB 2.0 | High Speed | 480 Mbps | 目前最主流的USB标准 |
| USB 3.0 / 3.1 Gen1 | Super Speed | 5 Gbps | 向下兼容USB 2.0 |
3. USB软件架构
在Linux/Android系统中,USB软件栈采用分层架构:
-
USB PHY驱动:负责底层物理层信号的控制和调整。
-
USB控制器驱动:负责与硬件寄存器交互,管理数据传输,如DWC2、DWC3驱动。
-
USB Core:提供核心框架和协议处理。
-
USB Gadget驱动:当设备作为Device端时,实现ADB、MTP、RNDIS等功能。
二、RK3568 USB控制器与PHY简介
1. 控制器资源概览
RK3568内置了丰富的USB控制器资源,具体如下表所示:
| 控制器类型 | 控制器名称 | 数量 | 说明 |
|---|---|---|---|
| USB 3.0 OTG | DWC3 | 1个 | 支持OTG 3.0,最高速率5Gbps |
| USB 3.0 Host | DWC3 | 1个 | 仅支持Host模式,最高速率5Gbps |
| USB 2.0 Host | EHCI/OHCI | 2个 | 兼容USB 1.1和USB 2.0,每个控制器包含EHCI和OHCI两个子控制器 |
2. PHY资源与复用关系
RK3568的USB PHY与控制器之间存在明确的对应关系:
| PHY名称 | 类型 | 连接的控制器 | 说明 |
|---|---|---|---|
usb2phy0 |
USB 2.0 Combo PHY | OTG控制器 + USB 3.0 Host | 包含OTG Port和Host Port两个子端口 |
usb2phy1 |
USB 2.0 Combo PHY | USB 2.0 Host0 + USB 2.0 Host1 | 包含OTG Port和Host Port两个子端口 |
combphy0 / combphy1 |
USB 3.0/SATA Combo PHY | OTG控制器 / USB 3.0 Host | 与SATA功能复用,同一时刻仅能支持一种工作模式 |
这里有一个关键的硬件设计点需要注意:USB 3.0 PHY与SATA功能是复用的。也就是说,如果你在项目中需要使用SATA接口,那么对应的USB 3.0端口就只能工作在USB 2.0模式下。
三、USB硬件原理图分析
拿到板卡的硬件原理图后,我们首先关注USB接口的供电部分------这是USB功能是否能够正常工作的前提。



1. 电源5V供电:USB接口的"生命线"
USB接口的5V供电至关重要。无论是Host模式对外设供电,还是Device模式下检测VBUS,都需要可靠的5V电源控制。
1.1 Host 5V供电
原理图上,VCC5V0_HOST由VCC5V0_USB通过一个负载开关转换而来,使能信号由GPIO0_A6控制:
VCC5V0_USB → 负载开关(EN: GPIO0_A6)→ VCC5V0_HOST → USB HOST接口
当GPIO0_A6输出高电平时,VCC5V0_HOST输出5V,为USB外设供电。当GPIO为低电平时,关闭5V输出。
1.2 OTG 5V供电
VCC5V0_OTG的控制逻辑与Host类似,但使用的GPIO为GPIO0_A5:
VCC5V0_USB → 负载开关(EN: GPIO0_A5)→ VCC5V0_OTG → USB OTG接口
在实际应用中,OTG接口的Vbus供电通常需要在软件层面进行动态控制:
-
Device模式:由外部Host供电,板卡本身不输出5V。
-
Host模式:板卡自身输出5V,为外设供电。
2. 其他关键硬件信号
USB2.0的接口只有一组差分信号线,USB3.0有3组差分信号线,在rk3568上这些通信线都是固定的引脚,没有复用。信号线的节点定义,可参考rk3568-pinctrl.dtsi文件,官方的芯片级设备树文件(rk3568.dtsi),信号线都已经配置好了。
四、设备树适配
RK3568 Android 13 SDK中的设备树文件已经提供了完整的USB节点定义,我们只需要根据实际硬件设计,在参考评估板设备树文件(rk3568-evb.dtsi)中使能对应的节点并配置好电源控制即可。
1. 电源5V供电Regulator节点
设备树中首先定义了5V供电的regulator节点:
1.1 主USB电源
vcc5v0_usb: vcc5v0-usb {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_usb";
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
vin-supply = <&dc_12v>;
};
节点作用 :定义USB 5V供电的源头。regulator-always-on和regulator-boot-on确保系统启动后VCC5V0_USB一直有电。
1.2 Host 5V供电
bash
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 = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
vin-supply = <&vcc5v0_usb>;
pinctrl-names = "default";
pinctrl-0 = <&vcc5v0_host_en>;
};
节点作用 :控制Host接口的5V输出。GPIO0_A6为高电平时,VCC5V0_HOST输出5V。enable-active-high属性表明GPIO为高电平有效。
1.3 OTG 5V供电
bash
vcc5v0_otg: vcc5v0-otg-regulator {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_otg";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
enable-active-high;
gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
vin-supply = <&vcc5v0_usb>;
pinctrl-names = "default";
pinctrl-0 = <&vcc5v0_otg_en>;
};
节点作用 :控制OTG接口的5V输出。与Host不同的是,OTG的VBUS在Device模式下需要关闭,因此此处不添加 regulator-always-on和regulator-boot-on属性,而是由PHY驱动根据OTG模式动态控制。
2. USB 2.0 PHY节点
2.1 usb2phy0(OTG + USB 3.0 Host共用)
bash
&usb2phy0 {
status = "okay";
};
usb2phy0是USB 2.0 Combo PHY_0,它包含两个子端口:
OTG端口
bash
&u2phy0_otg {
vbus-supply = <&vcc5v0_otg>; // VBUS供电由vcc5v0_otg提供
status = "okay";
};
关键属性:
vbus-supply:指定OTG VBUS的供电regulator。在OTG模式切换时,PHY驱动会动态控制该regulator的开关。
Host端口
bash
&u2phy0_host {
phy-supply = <&vcc5v0_host>; // PHY的电源由vcc5v0_host提供
status = "okay";
};
关键属性:
phy-supply:指定PHY的供电regulator。与vbus-supply不同,phy-supply在系统启动后一直保持开启。
2.2 usb2phy1(USB 2.0 Host0 + Host1共用)
bash
&usb2phy1 {
status = "okay";
};
&u2phy1_host {
phy-supply = <&vcc5v0_host>;
status = "okay";
};
&u2phy1_otg {
phy-supply = <&vcc5v0_host>;
status = "okay";
};
usb2phy1负责两个独立的USB 2.0 Host接口。这里u2phy1_otg虽然名字叫"otg",但在Host模式下被用作普通的Host端口,因此也使用phy-supply控制电源。
3. USB 2.0 Host控制器节点
3.1 EHCI控制器(USB 2.0高速)
bash
&usb_host0_ehci {
status = "okay";
};
&usb_host1_ehci {
status = "okay";
};
节点作用 :ehci(Enhanced Host Controller Interface)负责USB 2.0高速(480Mbps)传输。每个USB 2.0 Host控制器由一个EHCI和一个OHCI子控制器组成,它们共用同一个PHY。
3.2 OHCI控制器(USB 1.1全速/低速)
bash
&usb_host0_ohci {
status = "okay";
};
&usb_host1_ohci {
status = "okay";
};
节点作用 :ohci(Open Host Controller Interface)负责USB 1.1全速(12Mbps)和低速(1.5Mbps)传输,用于兼容老旧或低速的USB设备。
4. USB 3.0控制器节点
4.1 USB 3.0 OTG控制器
bash
&usbdrd30 {
status = "okay";
};
&usbdrd_dwc3 {
dr_mode = "otg"; // 模式:otg/host/peripheral
extcon = <&usb2phy0>; // 外接连接器检测
status = "okay";
};
关键属性:
-
dr_mode:控制器的角色模式。-
"otg":根据OTG ID引脚自动切换或软件手动切换。 -
"host":只作为主机。 -
"peripheral":只作为设备。
-
-
extcon:指定外接连接器(extcon)设备,用于检测USB连接状态。
节点关系 :usbdrd30是控制器父节点,usbdrd_dwc3是子节点。这种设计是为了在芯片级设备树配置公共资源(如时钟、电源域),在板级设备树配置具体的工作模式和属性。
4.2 USB 3.0 Host控制器
bash
&usbhost30 {
status = "okay";
};
&usbhost_dwc3 {
status = "okay";
};
节点作用:USB 3.0 Host控制器只工作在Host模式,不支持OTG功能,结构比OTG控制器简单。
5. GPIO复用配置
bash
&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>;
};
};
};
节点作用 :pinctrl将GPIO0_A6和GPIO0_A5配置为普通的GPIO功能(RK_FUNC_GPIO),并设置为无上拉/下拉(pcfg_pull_none),使它们能够作为电源控制信号。
总结
本文介绍了在RK3568 Android 13平台上如何适配USB,大部分的工作官方都已经适配好了,一般就是核对电源控制部分,让其和自己的原理图匹配。希望本文能为大家提供一些参考。