RK3568 Android 13 板载驱动适配-USB

目录

前言

一、USB基础知识快速回顾

[1. USB 主机与设备](#1. USB 主机与设备)

[2. USB接口与传输速率](#2. USB接口与传输速率)

[3. USB软件架构](#3. USB软件架构)

[二、RK3568 USB控制器与PHY简介](#二、RK3568 USB控制器与PHY简介)

[1. 控制器资源概览](#1. 控制器资源概览)

[2. PHY资源与复用关系](#2. PHY资源与复用关系)

三、USB硬件原理图分析

[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_HOSTVCC5V0_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-onregulator-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-onregulator-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,大部分的工作官方都已经适配好了,一般就是核对电源控制部分,让其和自己的原理图匹配。希望本文能为大家提供一些参考。

相关推荐
delta_hell1 小时前
【阅读源码-Android】动画之Choreographer-2
android·源码·choreographer
mmsx2 小时前
基于 Android 的博物馆文化展示与预约 App —— 设计与实现(有源码和文档)
android·app·源码·文档
一笑的小酒馆3 小时前
AndroidAGP9.0升级之路
android
阮胜昌3 小时前
MySQL 中的动态数据脱敏:无需更改应用程序即可保护敏感数据
android·mysql·adb
aaajj5 小时前
关于MODIFY_PHONE_STATE权限
android
古法安卓6 小时前
Android-高版本 LMKD 源码解析:基于 PSI 的内存压力监控与查杀全流程
android·java·android studio
古法安卓6 小时前
Android-PSI 详解:libpsi 源码解析——116 行代码架起 lmkd 与内核之间的桥
android·java·android studio
DevHub8 小时前
probe-rs 教程:一行命令替代 OpenOCD 烧写调试 Cortex-M
arm开发·嵌入式硬件·mcu·rust
黑猫学长呀9 小时前
【驱动开发常见问题】编译出现rm: cannot remove `asm/arch‘: Is a directory
驱动开发·单片机·嵌入式硬件·bug·编译报错·kernrl