----------------------------------------------------------------------------------------------------------------------------
开发板 :NanoPC-T4
开发板eMMC
:16GB
LPDDR3
:4GB
显示屏 :15.6
英寸HDMI
接口显示屏u-boot
:2023.04
linux
:6.3
----------------------------------------------------------------------------------------------------------------------------
一、USB
基础知识回顾
在linux
驱动移植-usb
驱动基础我们对USB
总线进行了简单的介绍,其中包括:
USB
协议版本介绍:USB1.0
、USB1.1
、USB2.0
、USB3.0
、USB3.1
、USB3.2
、USB4.0
;USB
接口:伴随着USB
版本迭代,USB
产生了多种连接器类型规范,比如Type-A
、Type-B
、Mini-A
、Mini-B
、Micro-A
、Micro-B
、Type-C
等。
1.1 USB
协议版本
从USB
协议诞生至今,出现了多个USB
协议版本,如USB1.0
、USB1.1
、USB2.0
、USB3.0
、USB3.1
、USB3.2
。最新的是USB4.0
协议,可直连CPU
的PCIe
总线,最大速度可达40Gbps
,使用Type-C
接口,兼容DP
视频协议、PD
快充协议等,最高支持100W
供电。
USB协议版本 | 速率称号 | 最大速率 | 电源 | 类型 | 推出时间 |
---|---|---|---|---|---|
USB1.0 | 低速(Low-Speed) | 1.5Mbps | 5V/500mA | 半双工 | 1996年1月 |
USB1.1 | 全速(Full-Speed) | 12Mbps | 5V/500mA | 半双工 | 1998年9月 |
USB2.0 | 高速(High-Speed) | 480Mbps | 5V/500mA | 半双工 | 2000年4月 |
USB3.0(USB3.2 Gen1) | 超高速(SuperSpeed USB) | 5Gbps | 5V/900mA | 全双工(两对数据线和一根屏蔽地线,以及2.0的四根线) | 2008年月11月 |
USB3.1(USB3.2 Gen2) | SuperSpeed USB 10Gbps | 10Gbps | 20V/5A | 全双工(两对数据线和一根屏蔽地线) | 2013年月7月 |
USB3.2(USB3.2 Gen2×2) | SuperSpeed USB 20Gps | 20Gbps | 20V/5A | dual-lane(2线,每条lane都是一对差分线) | 2017年月9月 |
USB4.0(Gen3×2) | ---- | 40Gbps | 100瓦 | single-lane或dual-lane,兼容Thunderbolt3 | 2019年月8月 |
为了支持更高的传输速度,正常而言,越高版本的USB
协议,定义的传输信号线会越多。
USB3.0
包括USB2.0
的引脚,USB3.1
和3.0
引脚相同;
-
USB2.0
:一共有4根引脚,一对差分线D+
/D-
,还有地线GND
、电源线VBUS
; -
USB3.0
:一共有9根引脚,为了兼容USB2.0
除了拥有USB2.0
的一对差分线D+
/D-
、以及地线GND
、电源线VBUS
外,还会拥有两对差分线(SSTX+
和SSTX-
及SSRX+
和SSRX-
)和一根屏蔽地线;
USB3.0
和USB2.0
使用不同的差分线传输数据,两者互不干扰,可同时工作。USB3.0
线缆中保留了USB2.0
的数据传输通道,实现了对USB2.0
的兼容,另外加了5根线来进行全双工的高速传输。
USB
是主从模式的总线,主机称为Host
,丛机称为Device
(设备)。从机与从机之间、主机与主机之间(不包括USB4.0
),不能互联。每次通信都是由主机发起,从机不能主动发起通信,只能被动的应答主机的请求。
为了增加灵活性,又出现了USB OTG
(On The Go
),USB OTG
支持主从切换,同一个设备,在不同场合下,可以在主机和从机之间切换。
USB2.0 OTG
线中增加了一根USB ID
线,当USB ID
线上拉时,处于从机模式,当USB ID
线接地时,处于主机模式。更多相关内容参考:《Rockchip RK3399 - USB OTG
和extcon
驱动 》。
1.2 USB
框图
这里我们需要补充一些USB
相关的硬件知识,因为RK3399
驱动编写中会涉及到。
USB
芯片内部实现的功能就是接受软件的控制,进而从内存搬运数据并按照USB
协议进行数据打包,并串转换后输出到芯片外部。或者从芯片外部接收差分数据信号,串并转换后进行数据打包并写到内存中。
USB
芯片一般分为Controller
和PHY
,以Controller
和 PHY
都被封装到SoC
为例,如图:
图中绘制的是USB 2.0
芯片,其中:
VBUS
:电压线,主机利用VBUS
给USB
设备提供工作电压;D+
: 正向传送数据 数据线;D-
: 反向传送数据 数据线;GND
:地线;
一般来说如果芯片的USB PHY
封装在芯片内,基本采用UTMI+
的接口。不封装到芯片内的一般采用ULPI
接口,这样可以降低pin
的数量。
1.2.1 Controller
控制器部分(Controller
):主要实现USB
协议和控制,内部逻辑主要由MAC
层、CSR
层、FIFO
层,还有其他低功耗管理之类层次;
MAC
实现按USB
协议进行数据包打包和解包,并把数据按照UTMI
/ULPI
总线格式发送给PHY
;CSR
层进行寄存器控制,软件对USB
芯片的控制就是通过CSR
寄存器,这部分和CPU
进行交互访问,主要作为Slave
通过AXI
或者AHB
进行交互;FIFO
控制层主要是和DDR
进行数据交互,控制USB
从DDR
搬运数据的通道,主要作为Master
通过AXI
/AHB
进行交互;
按照设备端关联的USB
控制器是工作在主模式还是从模式,将:
- 工作在主模式的
USB
控制器,称为USB
主机控制器 (UHC
:USB Host Controller
); - 工作在从模式的
USB
控制器,称为USB
设备控制器 (UDC
:USB Device Controller
); - 支持主从模式切换的
USB
控制器称为USB OTG
控制器,同一个设备,在不同场合下,可以在主机和从机之间切换;正常模式下每个OTG
控制器都可以工作在主机或从机模式下。
USB
主机控制器类型:
OHCI
:支持USB 1.1
;UHCI
:支持USB1.0/1.1
,与OHCI
不兼容;EHCI
:支持USB2.0
;xHCI
:支持USB3.0
;
1.2.2 PHY
USB PHY
负责最底层的信号转换,作用类似于网口的PHY
。主要实现并转串的功能,把控制器通过 UTMI
或ULPI
总线传递过来的并行数据转换为串行数据,再通过差分数据线输出到USB
接口。
二、RK3399 USB
介绍
2.1 USB
控制器
RK3399
支持4个独立的USB
控制器,不同控制器相互独立:
- 两个
USB2.0 HOST
(EHCI
&OHCI
); - 两个
USB3.0/2.0 OTG
(DWC3/xHCI
);在官方开发手册中这个有时候也被叫做Type C USB3.0
,官方为什么这么称呼呢?我个人认为是因为这个控制器连接的USB3.0 Type-C PHY
,可以用来实现USB3.0 Type-C
接口;
其中:
EHCI/OHCI
: 表示该USB
控制器集成了EHCI
控制器和OHCI
控制器;DWC3/xHCI
:表示该USB
控制器集成了DWC3
控制器和xHCI
控制器;
2.1.1 USB2.0 HOST
支持高速 (480Mbps
),全速 (12Mbps
) 和低速 (1.5Mbp
s),USB2.0 Host
控制器的框图如下图所示;
内部有EHCI
和OHCI
Host Controller
:
OHCI
支持USB1.0
和USB1.1
;EHCI
支持USB2.0
;
Port Routing Control
: 用于选择用EHCI
还是OHCI
。
USB2.0Host
控制器连接到USB2.0 PHY
。
EHCI
和OHCI Rockchip
采用linux
内核Generic
驱动,一般开发时只需要对设备树作相应配置,即可正常工作。
为了同时支持USB1.0
、USB1.1
和USB2.0
,就需要同时用到EHCI
和OHCI
,因此需要在设备树中把这两个USB
控制器都打开,如:
&usb_host0_ehci {
status = "okay";
};
&usb_host0_ohci {
status = "okay";
}
&usb_host1_ehci {
status = "okay";
};
&usb_host1_ohci {
status = "okay";
};
这样配置之后,RK3399
的两个USB2.0 HOST
控制器就使能了,并且同时支持EHCI
和OHCI
。
2.1.2 USB2.0 OTG
RK3399
没有独立的USB2.0 OTG
控制器,但有独立的USB3.0 OTG
控制器,并且可以向下兼容USB2.0 OTG
的完整功能。
USB2.0 OTG
控制器具有以下特性:
- 支持
Host
模式和Device
模式; - 支持
OTG ID
检测,并通过ID
电平自动切换Host
模式和Device
模式; - 不支持
ADP/SRP/HNP
协议; Host
模式支持高速、全速和低速,Device
模式只支持高速和全速模式;Host
模式支持9个通道;Device
模式支持9
个端点(不包括端点0),其中,4个IN
端点,3个OUT
端点,2 个IN/OUT
双
向端点;- 支持
1024x35 bits
内部FIFO
; - 支持内部
DMA
,并且支持scatter/gather
功能; - 支持动态配置每个端点的
FIFO
大小; Device
模式支持BCD
(Battery Charging Detect
);- 支持
UART Bypass
模式;
USB2.0 OTG
控制器的框图如下图所示;
2.1.3 USB3.0 OTG
RK3399 USB3.0 OTG
使用Synopsys
方案,即xHCI
扩展的DWC3
控制器,Host
功能在xHCI
框架下实现,而Device
功能由DWC3
扩展部分实现。
DWC3
具有以下特性:
- 支持
Control
/Bulk
(including stream
)/Interrupt
/Isochronous
传输方式; USB3.0
支持同时执行IN
和OUT
传输,带宽达到8Gbps
;- 支持描述符缓存 (
Descriptor Caching
) 和数据预取 (Data Pre-fetching
); Device
模式支持的IN
端点数量和OUT
端点数量请参考芯片手册;- 支持硬件自动处理
ERDY
和burst
; - 支持端点批量流传输 (
bulk stream
); - 支持
USB3.0 DRD
(Dual-Role Device
) 特性; - 支持根据
OTG ID
状态切换Device
和Host
模式; - 对于支持
Type-C
的芯片,支持UFP/DFP
角色交换; - 不支持
SRP
(session request protocol
),HNP
(hostnegotiation protocol
)和RSP
(Role Swap Protocol
);
USB3.0 xHCI Host
特性:
- 最多可以连接
64
个外设; - 支持一个中断器;
- 支持一个
USB2.0
端口和一个USB 3.0
端口; - 支持
USB 3.0/USB 2.0
并发传输,带宽达到8Gbps
; - 支持标准和开源的
xHCI
驱动; - 部分芯片支持
xHCI Debug Capability
;
USB3.0 OTG
控制器的框图如下图所示;
USB3.0 OTG
具有USB3.0 OTG
(USB Peripheral
和USB Host
)功能,且向下兼容USB2.0 OTG
功能,大传输速率为5Gbps
。
由于USB3.0 HOST
控制器为xHCI
,集成于DWC3 OTG IP
中,所以不用单独为其配置设备树,只需要配置DWC3
,并且设置DWC3
的dr_mode
属性为dr_mode
= otg
或者dr_mode
= host
,即可以使能xHCI
控制器。
2.2 USB PHY
RK3399
支持4个独立的USB PHY
:
- 2个
USB2.0 PHY
:在设备树中分别叫做u2phy0
和u2phy1
; - 2个
USB3.0 Type-C PHY
:在设备树中分别叫做tcphy0
和tcphy0
;
2.2.1 USB2.0 PHY
USB2.0 PHY
支持1个port
和2个port
两种设计,如下图是支持2个port
的框图;
Host Port
:通过UTMI+
连接到USB2.0 Host
控制器;
OTG Port
:通过UTMI+
连接USB3.0/2.0 OTG
控制器的USB2.0
逻辑模块;
以RK3399
为例,每个USB 2.0 PHY
都有两个port
端口;
u2phy0
:包含u2phy0_host
和u2phy0_otg
;u2phy1
:包含u2phy1_host
和u2phy1_otg
;
2.2.2 USB3.0 Type-C PHY
USB3.0 Type-C PHY
具有以下特性
- 支持
USB 3.0
(Super-Speed only
); - 支持
DisplayPort 1.3
(RBR,HBR and HBR2 data rates only
); - 支持
DisplayPort AUX
通道; - 支持
USB Type-C and DisplayPort Alt Mode
; - 支持
DisplayPort Alt Mode on TypeC A, B, C, D, E and F
管脚分配; - 支持正面和反面两个方向;
USB3.0 Type-C PHY
框图如下图所示:
USB3.0 Type-C PHY
由USB3.0 SuperSpeed PHY
和DisplayPort Transmit PHY
组成。其中:
PIPE_IF
接上面提到的USB3.0 OTG
;DPTX_IF
接DP
;
以RK3399
为例;
tcphy0
:包含tcphy0_dp
和tcphy0_usb3
;tcphy1
:包含u2phy1_host
和u2phy1_otg
;
USB3.0 Type-C PHY
可以根据实际的应用需求,将物理接口简化设计为USB3.0/2.0 Type-A
,USB 3.0/2.0 Micro-B
、USB 3.0/2.0 Type-C
等多种接口类型,内核USB
驱动已经兼容这几种不同类型的USB
接口,只需要根据实际的硬件设计修改对应的板级设备树配置,就可以使能相应的USB
接口。
2.3 USB
控制器和PHY
关系
RK3399 USB
控制器和USB PHY
的连接示意图如下:
上图中DP
是Display Port
控制器,DP
与USB3.0./2.0 OTG
共用USB3.0 Type-C PHY
。一个完整的Type-C
功能,是由USB3.0 SuperSpeed PHY
和USB2.0 OTG PHY
两部分组成的,这两部分PHY
在芯片内部的硬件模块是独立的,供电也是独立的。
三、硬件原理图
这里我使用的开发板型号是NanoPC-T4
,开发板如下图所示;
USB
资源如下:
- 2个独立的原生
USB2.0 Host Type-A
接口;对应开发板上的USBH2
、USBH3
; - 1个原生
USB3.0 Host Type-A
接口;对应开发板上的CON5
; - 1个
USB3.0 Type-C
, 支持USB3.0 Type-C
和DisplayPort 1.2 Alt Mode on USB Type-C
;对应开发板上的TYPE-C/DP
;
3.1 USB2.0 Host Type-A
Nanpi-T4
开发板USB2.0 PHY
芯片引脚如下图所示:
3.1.1 电源接线
上图中供电依次为VCCA0V9_S3
、VCCA1V8_S3
、VCC3V3_S3
;
(1) 电源VCCA0V9_S3
由RT9041B-10GE
提供的,这是一款稳压器IC
,其输入端为VCC3V3_S5
;
RT9041B-10GE
由VCC1V8_S3
使能,VCC1V8_S3
作为使能引脚EN
的输入端;
VCC1V8_S3
是由PMIC_SLEEP_H
(连接RK3399
的GPIO1_A5/AP_PWROFF
,这个应该是处理的睡眠引脚,处理器睡眠时,输出高电平)引脚控制的;
PMIC_SLEEP_H
为低电平,Q35 N MOS管导通
、VCC1V8_S3
输出为1.8V
;PMIC_SLEEP_H
为高电平,Q35 MOS管截止
、VCC1V8_S3
输出为0V
;
输入端VCC3V3_S5
是由VCC12V0_SYS
经过NB680GD
降压开关模块转换器输出得到固定3.3V
电压,有关电路这里就不截图了。
(2) 电源VCCA1V8_S3
由RT9193-18PU5/1.8V
提供的,这是一款稳压器IC
,其输入端为VCC3V3_SYS
;
RT9193-18PU5/1.8V
同样由VCC1V8_S3
使能。
输入端VCC3V3_SYS
同样是由VCC12V0_SYS
经过NB680GD
降压开关模块转换器输出得到固定3.3V
电压。
(3) 电源VCC3V3_S3
由RK808
提供的,连接RK808
电源管理芯片第7号输出引脚VSWOUT1
;
3.1.2 Type-A
接口接线
HOST0_DM
、HOST0_DP
连接到USBH2
,USBH2
为USB2.0 Host Type-A
接口;
RK3399 | USB2.0 PHY0 | USB2.0 Host Type A | |
---|---|---|---|
HOST0_DP | HOST0_DP | D+ | |
HOST0_DM | HOST0_DM | D- |
HOST1_DM
、HOST1_DP
连接到USBH3
,USBH3
为USB2.0 Host Type-A
接口;
RK3399 | USB PHY1 | USB2.0 Host Type A | |
---|---|---|---|
HOST1_DP | HOST1_DP | D+ | |
HOST1_DM | HOST1_DM | D- |
如下图所示;
电源VCC5V0_HOST0
由RT9724GQW
提供的,RT9724GQW
是一款USB
电源供应IC
,集成了过电流保护电路、短路折返电路、热关断电路和欠压锁定电路,其输入端为VCC5V0_SYS
。
RT9724GQW
由VCC5V0_SYS
使能,VCC5V0_SYS
作为使能引脚EN
的输入端,因此RT9724GQW
默认就是使能的。
3.2 USB3.0 Host Type-A
我们使用的开发板Nanpi-T4
,其中一个USB3.0 Type-C PHY
物理接口被设计为USB3.0 Host Type-A
,如下图所示:
3.2.1 Type-A
接口接线
其中USB3_DM
、USB3_DP
、USB3_SSRXN
、USB3_SSRXP
、USB3_SSTXN
、USB3_SSTXP
连接到CON5
,CON5
为USB3.0 Host Type-A
接口;
RK3399 | USB3.0 Type-C PHY1 | USB2.0 PHY1 | USB3.0 Host Type A | |
---|---|---|---|---|
TYPEC1_TX1P | USB3_SSTXP | TX+ | ||
TYPEC1_TX1M | USB3_SSTXN | TX- | ||
TYPEC1_RX1P | USB3_SSRXP | RX+ | ||
TYPEC1_RX1M | USB3_SSRXN | RX- | ||
TYPEC1_DM | USB3_DM | D- | ||
TYPEC1_DP | USB3_DP | D+ |
如下图所示:
电源VCC5V0_HOST2
由RT9724GQW
提供的,RT9724GQW
是一款USB
电源供应IC
,集成了过电流保护电路、短路折返电路、热关断电路和欠压锁定电路,其输入端为VCC5V0_SYS
。
RT9724GQW
由VCC5V0_SYS
使能,VCC5V0_SYS
作为使能引脚EN
的输入端,因此RT9724GQW
默认就是使能的。
输入端VCC5V0_SYS
是由VCC12V0_SYS
经过NB679GD
降压开关模块转换器输出得到固定5.0V
电压。
3.3 USB3.0 Type-C
我们使用的开发板Nanpi-T4
,另一个USB3.0 Type-C PHY
物理接口被设计为USB3.0 Type-C
,如下图所示:
3.3.1 Type-C
接口接线
其中TYPEC0_TX1P
、TYPEC0_TX1N
、TYPEC0_RX1P
、TYPEC0_RX1N
、TYPEC0_TX2P
、TYPEC0_TX2N
、TYPEC0_RX2P
、TYPEC0_RX2N
、TYPEC0_SBU1
、TYPEC0_SBU2
、TYPEC0_SBU1_DC
、TYPEC0_SBU2_DC
连接到TYPE-C
,TYPE-C
为USB3.0Type-C
接口;
RK3399 | USB3.0 Type-C PHY0 | USB2.0 PHY0 | USB3.0 Type-C | |
---|---|---|---|---|
TYPEC0_TX1P | TYPEC0_TX1P | SSTX1_P | ||
TYPEC0_TX1M | TYPEC0_TX1N | SSTX1_N | ||
TYPEC0_RX1P | TYPEC0_RX1P | SSRX1_P | ||
TYPEC0_RX1M | TYPEC0_RX1N | SSRX1_N | ||
TYPEC0_TX2P | TYPEC0_TX2P | SSTX2_P | ||
TYPEC0_TX2M | TYPEC0_TX2N | SSTX2_N | ||
TYPEC0_RX2P | TYPEC0_RX2P | SSRX2_P | ||
TYPEC0_RX2M | TYPEC0_RX2N | SSRX2_N | ||
TYPEC0_AUXP | TYPEC0_SBU1 | SBU1 | ||
TYPEC0_AUXM | TYPEC0_SBU2 | SBU2 | ||
TYPEC0_AUXP_PD_PU | TYPEC0_SBU1_DC | SBU1 | ||
TYPEC0_AUXM_PU_PD | TYPEC0_SBU2_DC | SBU2 | ||
TYPEC0_DP | TYPEC0_DP | DP1 | ||
TYPEC0_DM | TYPEC0_DM | DM1 | ||
TYPEC0_DP | TYPEC0_DP | DP2 | ||
TYPEC0_DM | TYPEC0_DM | DM2 | ||
TYPEC_CC1 | ||||
TYPEC_CC2 |
如下图所示:
电源VBUS_TYPEC
由RT9724GQW
提供的,其输入端为VCC5V0_SYS
。由GPIO4_D2
引脚使能;
3.3.2 fusb302
fusb302
是可编程的USB Type-C
控制器,支持识别各种USB
设备和对应的工作状态,且支持最高100W
的PD
协议。
其具有一下主要特征:
- 具备自主
DRP
切换的双重角色功能; - 根据已连接的设备选择作为
Host
(主机)或Device
(设备)进行连接; - 通过软件配置为
Host
(主机)、Device
(设备)或双重角色; - 支持
USB
功率传递(PD
)2.0:
其引脚如下:
引脚 | 类型 | 功能 |
---|---|---|
CC1/CC2 | I/O | Type-C连接器的配置通道(CC)引脚。最初用于确定插入事件发生以及插入的方向。连接后的功能取决于检测到的操作模式。 作为主机运行时: 1)设置可被连接设备感知的VBUS的允许充电电流 2)用于与使用USB BMC Power Delivery的设备进行通信 3)用于检测已发生的拔出事件 作为设备运行时: 4)指示来自连接的主机的允许下沉电流。用于与使用USB BMC Power Delivery的设备进行通信主要用来 PD协议通信或其他: |
VBUS | Input | 当作为面向上行端口(设备)运行时,该引脚可用于设备插入和拔出的检测。 |
VCONN | Power Switch | 要将调节输入电源切换到正确的CC引脚作为VCONN以为USB3.1完整功能电缆和其他配件供电。 |
INIT | Open-Drain Output | 中断输出,当有事件发生时,用于通知处理器读取I2C寄存器数据。如:插入/拔出typeC,INIT_N都会拉低一下。 |
SCL | Input | I2C时钟 |
SDA | Open-Drain I/O | I2C数据引脚 |
INT
连接的是RK3399
的GPIO1_A2
引脚,I2C
通信使用的是I2C4
。
由于这篇文章不是fusb302
的专栏,所以就不细说了,具体参考《PD
快充 - fusb302
驱动调试笔记》。
参考文章
[1] PD
快充 - fusb302
驱动调试笔记
[2] RK3399 Android7.1 USB
模块中的控制器和PHY
[3] RK3399ANDROID7.1 USB TYPE-A
的配置
[4] 超详细USB Type-C
引脚信号及PCB
布局布线介绍
[5] Rockchip_Developer_Guide_USB_CN.pdf
[6] Rockchip_RK3399_Developer_Guide_USB_DTS_CN.pdf
[7] RK
平台如何配置USB
功能
[8] 正点原子视频
[9] Linux: USB Gadget
驱动简介