一、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
支持主从切换,同一个设备,在不同场合下,可以在主机和从机之间切换。
USB OTG
线中增加了一根USB ID
线,当USB ID
线上拉时,处于从机模式,当USB ID
线接地时,处于主机模式。
1.2 USB
接口类型
USB
接口目前主要有四个接口类型,实物图如下图所示:
USB Type-A
,这种接口类型是我们最常见的USB
接口,主要用在电脑,充电器,鼠标,键盘,U
盘等设备上。USB Type-B
,这种接口类型主要用在打印机等设备上,没有Type-A
接口常见。Micro-B
,这种接口我们都见过,就是几年前手机充电器的接口;USB Type-C
,USB Type-C
最明显的特点就是支持正反面盲插,是以后USB
接口的发展趋势,也是当前手机充电器广泛使用的接口;
这里有一点我们需要了解的是,接口类型不同,引脚也会有差别;纵然是同一类型接口,比如Type A
,不同USB
协议版本,引脚也会不同。
这里不做过多展开介绍,更多可以参考:USB2.0
、USB3.0
和typec
引脚定义
实物图如下图所示:
1.3 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.3.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
进行交互;
1.3.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),USB 2.0 Host
控制器的框图如下图所示;
内部有EHCI
和OHCI
Host Controller
:
OHCI
支持USB1.0
和USB1.1
;EHCI
支持USB2.0
;
Port Routing Control
: 用于选择用EHCI
还是OHCI
。
USB 2.0 Host
控制器连接到USB2.0 PHY
。
EHCI
和OHCI Rockchip
采用linux
内核USB 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 USB 2.0 PHY
USB 2.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
由USB 3.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-TC
,开发板如下图所示;
USB
资源如下:
- 2个独立的原生
USB2.0 Host Type-A
接口; - 1个原生
USB3.0 Host Type-A
接口; - 1个
USB3.0 Type-C
, 支持USB3.0 Type-C
和DisplayPort 1.2 Alt Mode on USB Type-C
;
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 |
如下图所示:
从原理图上可以看出来Type-C
接口比Type-A
接口的引脚多多了,标准的Type-C
接口有24个引脚,共有有4对TX
/RX
差分线,2对USBD+
/D-
,一对SBU
,2个CC
,另外还有4个VBUS
和4个地线。
电源VBUS_TYPEC
由RT9724GQW
提供的,其输入端为VCC5V0_SYS
。由GPIO4_D2
引脚使能;
3.3.2 FUSB302
INT
连接的是RK3399
的GPIO_A2
引脚,I2C
通信使用的是I2C4
。
四、设备树
4.1 USB2.0 Host Type-A
NanoPC-TC
开发板支持两个USB2.0 Host Type-A
接口,对应的USB
控制器为USB2.0 HOST(EHCI&OHCI)
、对应的USB PHY
为USB2.0 HOST PHY
;
因此对应的设备树配置,包括USB2.0 HOST(EHCI&OHCI)
控制器设备树配置和USB2.0 HOST PHY
设备树配置。
4.1.1 控制器配置
(1) USB2.0 HOST0
控制器设备节点usb_host0_ehci
、usb_host0_ohci
定义在arch/arm64/boot/dts/rockchip/rk3399.dts
;
usb_host0_ehci: usb@fe380000 {
compatible = "generic-ehci";
reg = <0x0 0xfe380000 0x0 0x20000>;
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH 0>;
clocks = <&cru HCLK_HOST0>, <&cru HCLK_HOST0_ARB>,
<&u2phy0>;
phys = <&u2phy0_host>;
phy-names = "usb";
status = "disabled";
};
usb_host0_ohci: usb@fe3a0000 {
compatible = "generic-ohci";
reg = <0x0 0xfe3a0000 0x0 0x20000>;
interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH 0>;
clocks = <&cru HCLK_HOST0>, <&cru HCLK_HOST0_ARB>,
<&u2phy0>;
phys = <&u2phy0_host>;
phy-names = "usb";
status = "disabled";
};
在USB
控制器设备节点中,通过phys
属性关联对应的USB PHY
。
phys = <&u2phy0_host>;
这表明这两个USB
控制器都用了u2phy0_host
这个USB PHY
.
这两个USB
控制器就是我们之前介绍的是EHCI
和OHCI
,OHCI
支持USB1.0
和USB1.1
,EHCI
支持USB2.0
。
(2) USB2.0 HOST1
控制器设备节点usb_host1_ehci
、usb_host1_ohci
定义在arch/arm64/boot/dts/rockchip/rk3399.dts
;
usb_host1_ehci: usb@fe3c0000 {
compatible = "generic-ehci";
reg = <0x0 0xfe3c0000 0x0 0x20000>;
interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH 0>;
clocks = <&cru HCLK_HOST1>, <&cru HCLK_HOST1_ARB>,
<&u2phy1>;
phys = <&u2phy1_host>;
phy-names = "usb";
status = "disabled";
};
usb_host1_ohci: usb@fe3e0000 {
compatible = "generic-ohci";
reg = <0x0 0xfe3e0000 0x0 0x20000>;
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH 0>;
clocks = <&cru HCLK_HOST1>, <&cru HCLK_HOST1_ARB>,
<&u2phy1>;
phys = <&u2phy1_host>;
phy-names = "usb";
status = "disabled";
};
4.1.2 PHY
配置
(1) USB2.0 HOST PHY0
设备节点u2phy0_host
定义在arch/arm64/boot/dts/rockchip/rk3399.dts
;
u2phy0: usb2phy@e450 {
compatible = "rockchip,rk3399-usb2phy";
reg = <0xe450 0x10>;
clocks = <&cru SCLK_USB2PHY0_REF>;
clock-names = "phyclk";
#clock-cells = <0>;
clock-output-names = "clk_usbphy0_480m";
status = "disabled";
u2phy0_host: host-port {
#phy-cells = <0>;
interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH 0>;
interrupt-names = "linestate";
status = "disabled";
};
u2phy0_otg: otg-port {
#phy-cells = <0>;
interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH 0>,
<GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH 0>,
<GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH 0>;
interrupt-names = "otg-bvalid", "otg-id",
"linestate";
status = "disabled";
};
};
(2) USB2.0 HOST PHY1
设备节点u2phy1_host
定义在arch/arm64/boot/dts/rockchip/rk3399.dts
;
u2phy1: usb2phy@e460 {
compatible = "rockchip,rk3399-usb2phy";
reg = <0xe460 0x10>;
clocks = <&cru SCLK_USB2PHY1_REF>;
clock-names = "phyclk";
#clock-cells = <0>;
clock-output-names = "clk_usbphy1_480m";
status = "disabled";
u2phy1_host: host-port {
#phy-cells = <0>;
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH 0>;
interrupt-names = "linestate";
status = "disabled";
};
u2phy1_otg: otg-port {
#phy-cells = <0>;
interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH 0>,
<GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH 0>,
<GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH 0>;
interrupt-names = "otg-bvalid", "otg-id",
"linestate";
status = "disabled";
};
};
4.1.3 电源配置
(1) USB2.0 PHY
芯片三路电源依次为VCCA0V9_S3
、VCCA1V8_S3
、VCC3V3_S3
;
VCCA0V9_S3
、VCCA1V8_S3
这两路由PMIC_SLEEP_H
(连接RK3399
的GPIO1_A5/AP_PWROFF
,这个应该是处理的睡眠引脚,处理器工作时电源有效)引脚控制的;
VCC3V3_S3
由RK808
电源管理芯片第7号引脚VSWOUT
提供,因此需要配置其电源输出为3.3V
;
在arch/arm64/boot/dts/rockchip/rk3399-evb.dts
配置vcc3v3_s3
设备节点;
&i2c0 {
......
rk808: pmic@1b {
......
regulators {
......
vcc3v3_s3: SWITCH_REG1 {
regulator-always-on;
regulator-boot-on;
regulator-name = "vcc3v3_s3";
regulator-state-mem {
regulator-off-in-suspend;
};
};
......
};
};
};
完整的rk808
设备节点配置参考:rk808驱动配置。
(2) USB2.0 Host Type-A
接口电源VCC5V0_HOST0
由RT9724GQW
提供的,其输入端为VCC5V0_SYS
。
在arch/arm64/boot/dts/rockchip/rk3399-evb.dts
配置vcc5v0_host
;
vcc5v0_sys: vcc5v0-sys {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_sys";
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
};
vcc5v0_host: vcc5v0-host-regulator {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_host";
regulator-always-on;
regulator-boot-on;
vin-supply = <&vcc5v0_sys>;
};
4.1.4 使能
(1) 为了同时支持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";
};
(2) 使能USB2.0 HOST PHY0
,同时配置USB2.0 HOST PHY0 phy-supply
属性,用于控制USB
电源VBUS
;
&u2phy0 {
status = "okay";
};
&u2phy0_host {
phy-supply = <&vcc5v0_host>;
status = "okay";
};
(3) 使能USB2.0 HOST PHY1
,同时配置USB2.0 HOST PHY1 phy-supply
属性,用于控制USB
电源VBUS
;
&u2phy1 {
status = "okay";
};
&u2phy1_host {
phy-supply = <&vcc5v0_host>;
status = "okay";
};
4.2 USB3.0 Host Type-A
NanoPC-TC
开发板支持1个USB3.0 Host Type-A
接口,对应的USB
控制器为USB3.0/2.0 OTG(DWC3/xHCI)
、对应的USB PHY
为USB3.0 Type-C PHY
和USB2.0 OTG PHY
;
因此对应的设备树配置,包括USB3.0/2.0 OTG(DWC3/xHCI)
控制器设备树配置和USB3.0 Type-C PHY
、USB2.0 OTG PHY
设备树配置。
4.2.1 控制器配置
(1) USB3.0/2.0 OTG(DWC3/xHCI)
控制器设备节点usbdrd3_1
,定义在arch/arm64/boot/dts/rockchip/rk3399.dts
;
usbdrd3_1: usb@fe900000 {
compatible = "rockchip,rk3399-dwc3";
#address-cells = <2>;
#size-cells = <2>;
ranges;
clocks = <&cru SCLK_USB3OTG1_REF>, <&cru SCLK_USB3OTG1_SUSPEND>,
<&cru ACLK_USB3OTG1>, <&cru ACLK_USB3_RKSOC_AXI_PERF>,
<&cru ACLK_USB3>, <&cru ACLK_USB3_GRF>;
clock-names = "ref_clk", "suspend_clk",
"bus_clk", "aclk_usb3_rksoc_axi_perf",
"aclk_usb3", "grf_clk";
resets = <&cru SRST_A_USB3_OTG1>;
reset-names = "usb3-otg";
status = "disabled";
usbdrd_dwc3_1: usb@fe900000 {
compatible = "snps,dwc3";
reg = <0x0 0xfe900000 0x0 0x100000>;
interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH 0>;
clocks = <&cru SCLK_USB3OTG1_REF>, <&cru ACLK_USB3OTG1>,
<&cru SCLK_USB3OTG1_SUSPEND>;
clock-names = "ref", "bus_early", "suspend";
dr_mode = "otg";
phys = <&u2phy1_otg>, <&tcphy1_usb3>;
phy-names = "usb2-phy", "usb3-phy";
phy_type = "utmi_wide";
snps,dis_enblslpm_quirk;
snps,dis-u2-freeclk-exists-quirk;
snps,dis_u2_susphy_quirk;
snps,dis-del-phy-power-chg-quirk;
snps,dis-tx-ipgap-linecheck-quirk;
power-domains = <&power RK3399_PD_USB3>;
status = "disabled";
};
};
4.2.2 PHY
配置
(1) USB3.0 Type-C PHY
设备节点tcphy1_usb3
,定义在arch/arm64/boot/dts/rockchip/rk3399.dts
;
tcphy1: phy@ff800000 {
compatible = "rockchip,rk3399-typec-phy";
reg = <0x0 0xff800000 0x0 0x40000>;
clocks = <&cru SCLK_UPHY1_TCPDCORE>,
<&cru SCLK_UPHY1_TCPDPHY_REF>;
clock-names = "tcpdcore", "tcpdphy-ref";
assigned-clocks = <&cru SCLK_UPHY1_TCPDCORE>;
assigned-clock-rates = <50000000>;
power-domains = <&power RK3399_PD_TCPD1>;
resets = <&cru SRST_UPHY1>,
<&cru SRST_UPHY1_PIPE_L00>,
<&cru SRST_P_UPHY1_TCPHY>;
reset-names = "uphy", "uphy-pipe", "uphy-tcphy";
rockchip,grf = <&grf>;
status = "disabled";
tcphy1_dp: dp-port {
#phy-cells = <0>;
};
tcphy1_usb3: usb3-port {
#phy-cells = <0>;
};
};
(2) USB2.0 OTG PHY
设备节点u2phy1_otg
,定义在arch/arm64/boot/dts/rockchip/rk3399.dts
;
u2phy1: usb2phy@e460 {
compatible = "rockchip,rk3399-usb2phy";
reg = <0xe460 0x10>;
clocks = <&cru SCLK_USB2PHY1_REF>;
clock-names = "phyclk";
#clock-cells = <0>;
clock-output-names = "clk_usbphy1_480m";
status = "disabled";
u2phy1_host: host-port {
#phy-cells = <0>;
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH 0>;
interrupt-names = "linestate";
status = "disabled";
};
u2phy1_otg: otg-port {
#phy-cells = <0>;
interrupts = <GIC_SPI 108 IRQ_TYPE_LEVEL_HIGH 0>,
<GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH 0>,
<GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH 0>;
interrupt-names = "otg-bvalid", "otg-id",
"linestate";
status = "disabled";
};
};
4.2.3 电源配置
(1) USB2.0 PHY
芯片三路电源依次为VCCA0V9_S3
、VCCA1V8_S3
、VCC3V3_S3
, 这个配置上面已经介绍了,不再重复介绍。
(2) USB3.0 Type-C PHY
芯片三路电源和USB2.0 PHY
芯片三路电源一样。
(3) USB3.0 Host Type-A
接口电源VCC5V0_HOST2
由RT9724GQW
提供的,其输入端为VCC5V0_SYS
。
在arch/arm64/boot/dts/rockchip/rk3399-evb.dts
配置vcc5v2_host
;
vcc5v0_sys: vcc5v0-sys {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_sys";
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
};
vcc5v2_host: vcc5v2-host-regulator {
compatible = "regulator-fixed";
regulator-name = "vcc5v2_host";
regulator-always-on;
regulator-boot-on;
vin-supply = <&vcc5v0_sys>;
};
4.2.4 使能
(1) 使能usbdrd3_1
:
/* Configurate and Enable USB3.0/2.0 OTG Controller */
&usbdrd3_1 {
status = "okay";
};
&usbdrd_dwc3_1 {
/* 配置dr_mode为host,表示只支持Host only mode */
dr_mode = "host";
status = "okay";
};
(2) 使能tcphy1_usb3
;
/* Enable USB3.0 PHY */
&tcphy1 {
status = "okay";
};
&tcphy1_usb3{
status = "okay";
}
(3) 使能u2phy1_otg
,同时配置USB2.0 OTG PHY1 phy-supply
属性,用于控制USB
电源VBUS
;
/* Enable USB2.0 PHY */
&u2phy1 {
status = "okay";
};
&u2phy1_otg {
phy-supply = <&vcc5v2_host>;
status = "okay";
};
4.2.5 总结
USB3.0 Host Type-A
接口设备树配置的注意点如下:
- 对应的fusb节点不要配置,因为
USB3.0 Host Type-A
不需要fusb302
芯片; - 对应的
USB
控制器节点(usbdrd3
)和PHY
的节点(tcphy
和u2phy
)都要删除extcon
属性; - 对应的
USB
控制器子节点(usbdrd_dwc3
)的dr_mode
属性要配置为host
;
4.3 USB3.0 Type-C
NanoPC-TC
开发板支持1个USB3.0 Type-C
接口,对应的USB
控制器为USB3.0/2.0 OTG(DWC3/xHCI)
、对应的USB PHY
为USB3.0 Type-C PHY
和USB2.0 OTG PHY
;
因此对应的设备树配置,包括USB3.0/2.0 OTG(DWC3/xHCI)
控制器设备树配置和USB3.0 Type-C PHY
、USB2.0 OTG PHY
设备树配置。
4.3.1 控制器配置
(1) USB3.0/2.0 OTG(DWC3/xHCI)
控制器设备节点usbdrd3_0
,定义在arch/arm64/boot/dts/rockchip/rk3399.dts
;
usbdrd3_0: usb@fe800000 {
compatible = "rockchip,rk3399-dwc3";
#address-cells = <2>;
#size-cells = <2>;
ranges;
clocks = <&cru SCLK_USB3OTG0_REF>, <&cru SCLK_USB3OTG0_SUSPEND>,
<&cru ACLK_USB3OTG0>, <&cru ACLK_USB3_RKSOC_AXI_PERF>,
<&cru ACLK_USB3>, <&cru ACLK_USB3_GRF>;
clock-names = "ref_clk", "suspend_clk",
"bus_clk", "aclk_usb3_rksoc_axi_perf",
"aclk_usb3", "grf_clk";
resets = <&cru SRST_A_USB3_OTG0>;
reset-names = "usb3-otg";
status = "disabled";
usbdrd_dwc3_0: usb@fe800000 {
compatible = "snps,dwc3";
reg = <0x0 0xfe800000 0x0 0x100000>;
interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH 0>;
clocks = <&cru SCLK_USB3OTG0_REF>, <&cru ACLK_USB3OTG0>,
<&cru SCLK_USB3OTG0_SUSPEND>;
clock-names = "ref", "bus_early", "suspend";
dr_mode = "otg";
phys = <&u2phy0_otg>, <&tcphy0_usb3>;
phy-names = "usb2-phy", "usb3-phy";
phy_type = "utmi_wide";
snps,dis_enblslpm_quirk;
snps,dis-u2-freeclk-exists-quirk;
snps,dis_u2_susphy_quirk;
snps,dis-del-phy-power-chg-quirk;
snps,dis-tx-ipgap-linecheck-quirk;
power-domains = <&power RK3399_PD_USB3>;
status = "disabled";
};
};
4.3.2 PHY
配置
(1) USB3.0 Type-C PHY
设备节点tcphy0_usb3
,定义在arch/arm64/boot/dts/rockchip/rk3399.dts
;
tcphy0: phy@ff7c0000 {
compatible = "rockchip,rk3399-typec-phy";
reg = <0x0 0xff7c0000 0x0 0x40000>;
clocks = <&cru SCLK_UPHY0_TCPDCORE>,
<&cru SCLK_UPHY0_TCPDPHY_REF>;
clock-names = "tcpdcore", "tcpdphy-ref";
assigned-clocks = <&cru SCLK_UPHY0_TCPDCORE>;
assigned-clock-rates = <50000000>;
power-domains = <&power RK3399_PD_TCPD0>;
resets = <&cru SRST_UPHY0>,
<&cru SRST_UPHY0_PIPE_L00>,
<&cru SRST_P_UPHY0_TCPHY>;
reset-names = "uphy", "uphy-pipe", "uphy-tcphy";
rockchip,grf = <&grf>;
status = "disabled";
tcphy0_dp: dp-port {
#phy-cells = <0>;
};
tcphy0_usb3: usb3-port {
#phy-cells = <0>;
};
};
(2) USB2.0 OTG PHY
设备节点u2phy0_otg
,定义在arch/arm64/boot/dts/rockchip/rk3399.dts
;
u2phy0: usb2phy@e450 {
compatible = "rockchip,rk3399-usb2phy";
reg = <0xe450 0x10>;
clocks = <&cru SCLK_USB2PHY0_REF>;
clock-names = "phyclk";
#clock-cells = <0>;
clock-output-names = "clk_usbphy0_480m";
status = "disabled";
u2phy0_host: host-port {
#phy-cells = <0>;
interrupts = <GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH 0>;
interrupt-names = "linestate";
status = "disabled";
};
u2phy0_otg: otg-port {
#phy-cells = <0>;
interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH 0>,
<GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH 0>,
<GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH 0>;
interrupt-names = "otg-bvalid", "otg-id",
"linestate";
status = "disabled";
};
};
4.3.3 电源配置
(1) USB2.0 PHY
芯片三路电源依次为VCCA0V9_S3
、VCCA1V8_S3
、VCC3V3_S3
, 这个配置上面已经介绍了,不再重复介绍。
(2) USB3.0 Type-C PHY
芯片三路电源和USB2.0 PHY
芯片三路电源一样。
(3) USB3.0 Type-C
接口电源VBUS_TYPEC
由RT9724GQW
提供的,其输入端为VCC5V0_SYS
。由GPIO4_D2
引脚使能,高电平有效;
在arch/arm64/boot/dts/rockchip/rk3399-evb.dts
配置vbus_typec
;
vcc5v0_sys: vcc5v0-sys {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_sys";
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
};
vbus_typec: vbus-typec {
compatible = "regulator-fixed";
enable-active-high;
gpio = <&gpio4 RK_PD2 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&vbus_typec_en>;
regulator-name = "vbus_typec";
vin-supply = <&vcc5v0_sys>;
};
由于vbus_typec
节点配置了default
状态对应的引脚配置节点为vbus_typec_en
,因此需要在pinctrl
节点下增加引脚配置节点vbus_typec_en
,这个节点在fusb
配置中介绍。
4.3.4 fusb
配置
在arch/arm64/boot/dts/rockchip/rk3399-evb.dts
配置:
&i2c4 {
clock-frequency = <400000>;
i2c-scl-rising-time-ns = <160>;
i2c-scl-falling-time-ns = <30>;
status = "okay";
fusb0: typec-portc@22 {
compatible = "fcs,fusb302";
reg = <0x22>;
interrupt-parent = <&gpio1>;
interrupts = <RK_PA2 IRQ_TYPE_LEVEL_LOW>;
pinctrl-names = "default";
pinctrl-0 = <&fusb0_int>;
vbus-supply = <&vbus_typec>;
};
};
&pinctrl {
fusb30x {
fusb0_int: fusb0-int {
rockchip,pins = <1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>;
};
vbus_typec_en: vbus-typec-en {
rockchip,pins = <4 RK_PD2 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
......
}
其中GPIO_A2
连接了fusb302
的中断引脚,低电平触发。
4.3.5 使能
(1) 使能usbdrd3_0
:
/* Configurate and Enable USB3.0/2.0 OTG Controller notifier */
&usbdrd3_0 {
status = "okay";
/* 配置extcon属性,用于接收fusb302驱动的UFP/DFP */
extcon = <&fusb0>;
};
&usbdrd_dwc3_0 {
/* 配置dr_mode为otg */
dr_mode = "otg";
status = "okay";
};
(2) 使能tcphy0_usb3
;
/* Enable USB3.0 PHY */
&tcphy0 {
status = "okay";
/* 配置extcon属性,用于接收fusb302驱动的UFP/DFP */
extcon = <&fusb0>;
};
&tcphy0_usb3{
status = "okay";
}
(3) 使能u2phy0_otg
,同时配置USB2.0 OTG PHY0 phy-supply
属性,用于控制USB
电源VBUS
;
/* Enable USB2.0 PHY */
&u2phy0 {
status = "okay";
/* 配置extcon属性,用于接收fusb302驱动的UFP/DFP */
extcon = <&fusb0>;
};
&u2phy0_otg {
phy-supply = <&vbus_typec>;
status = "okay";
};
4.3.6 总结
USB3.0 Type-C
设备树配置的注意点如下:
- 对应的fusb节点需要配置,因为
USB3.0 Type-C
需要fusb302
芯片; - 对应的
USB
控制器节点(usbdrd3
)和PHY
的节点(tcphy
和u2phy
)都要配置extcon
属性; - 对应的
USB
控制器子节点(usbdrd_dwc3
)的dr_mode
属性要配置为otg
;
- 找到设备
所有USB设备可以在 /sys/bus/usb/devices 下找到。
/sys/bus/usb/devices# ls
1-0:1.0 1-1.1:1.0 1-1.1:1.3 1-1.2:1.1 1-1.2:1.4 1-1.2:1.7 1-1.3 1-1.3:1.2 1-1.5:1.0 1-1.5:1.3 1-1.5:1.6 1-1:1.0 4-0:1.0 usb1 usb4
1-1 1-1.1:1.1 1-1.2 1-1.2:1.2 1-1.2:1.5 1-1.2:1.8 1-1.3:1.0 1-1.3:1.3 1-1.5:1.1 1-1.5:1.4 1-1.5:1.7 2-0:1.0 5-0:1.0 usb2 usb5
1-1.1 1-1.1:1.2 1-1.2:1.0 1-1.2:1.3 1-1.2:1.6 1-1.2:1.9 1-1.3:1.1 1-1.5 1-1.5:1.2 1-1.5:1.5 1-1.5:1.8 3-0:1.0 6-0:1.0 usb3 usb6
如上图所示,可以看到大量的USB设备。
取名规则如下:
bus-port.port.port:configuration.interface
比如
1-1.3 表示总线编号为1的第一个硬件端口上接了HUB,HUB的第二个硬件端口上接了USB设备。
1-1.5:1.0 :表示根总线编号为1的HUB上的第一个硬件接口接了HUB,HUB的第五个硬件接口上的USB设备。该USB设备的第一个配置下的编号为0的接口。
1-1.5:1.0:
HUB1
----PORT1
----PORT1
----PORT2
----PORT3
----PORT4
----PORT5(1-1.5)
----PORT2
----PORT3
...
- 找到接口
进一步的,我们可以查看其PID和VID:
/sys/bus/usb/devices# ls 1-1.5/id*
1-1.5/idProduct 1-1.5/idVendor
/sys/bus/usb/devices# cat 1-1.5/idVendor
3c93
每个USB设备一般会有多个接口:
/sys/bus/usb/devices# ls 1-1.5/1-1.5\:1.
1-1.5:1.0/ 1-1.5:1.1/ 1-1.5:1.2/ 1-1.5:1.3/ 1-1.5:1.4/ 1-1.5:1.5/ 1-1.5:1.6/ 1-1.5:1.7/ 1-1.5:1.8/
3.找到设备路径
我的这个USB设备包含3个串口设备和一个以太网设备,可以查看映射的TTY设备号:
sys/bus/usb/devices/1-1.5# find . -maxdepth 3 -name "tty*"
./1-1.5:1.0/tty
./1-1.5:1.0/tty/ttyACM9
./1-1.5:1.2/tty
./1-1.5:1.2/tty/ttyACM10
./1-1.5:1.4/tty
./1-1.5:1.4/tty/ttyACM11
三个串口分别在0、2、4号接口上。
查看网络设备:
/sys/bus/usb/devices/1-1.5# find . -maxdepth 5 -name "address"
./1-1.5:1.6/net/usb0/address
:/sys/bus/usb/devices/1-1.5# cat 1-1.5:1.6/net/usb0/address
02:0c:29:a3:9b:6d
视频:
https://www.bilibili.com/video/BV1Ja4y1T7Y2?p=114&vd_source=3b467a684444e8e584a88367ddfac9b8
USB3.0及以后的USB协议,主机也可以和集线器(Hub)通信。为了增加灵活性,又出现了USB OTG(On The Go),USB OTG支持主从切换,同一个设备,在不同场合下,可以在主机和从机之间切换。
2个USB,都支持OTG:
-
一个做OTG,基本上是作为USB device,用来烧写代码;
-
另外一路用来连接USB HUB,扩展USB HOST接口,用来做为主机;
每个USB OTG控制器都可以运行在高速模式、全速模式、低俗模式。
正常模式下每个OTG控制器都可以工作在主机(HOST)或从机(DEVICE)模式下,每个USB控制器都有其对应的接口。
USB主机控制器类型:OHCI和UHCI,EHCI;
- OHCI:支持USB 1.1;
- UHCI:支持USB1.0/1.1,与OHCI不兼容;
- EHCI:支持USB2.0;
- xHCI:支持USB3.0;
两个USB控制器都是2.0的,因此兼容ECHI标准。
ehci-platform fe380000.usb: EHCI Host Controller
- bus number 2
ohci-platform fe3a0000.usb: Generic Platform OHCI controller
- bus number 3
- usb 3-1: new low-speed USB device number 2 using ohci-platform
[ 2.987644] input: SEMICO USB Keyboard as /devices/platform/fe3a0000.usb/usb3/3-1/3-1:1.0/0003:1A2C:4D7E.0001/input/input0
[ 3.070030] hid-generic 0003:1A2C:4D7E.0001: input: USB HID v1.10 Keyboard [SEMICO USB Keyboard] on usb-fe3a0000.usb-1/input0
[ 3.100074] input: SEMICO USB Keyboard Consumer Control as /devices/platform/fe3a0000.usb/usb3/3-1/3-1:1.1/0003:1A2C:4D7E.0002/input/input1
[ 3.177831] input: SEMICO USB Keyboard System Control as /devices/platform/fe3a0000.usb/usb3/3-1/3-1:1.1/0003:1A2C:4D7E.0002/input/input2
[ 3.192243] input: SEMICO USB Keyboard as /devices/platform/fe3a0000.usb/usb3/3-1/3-1:1.1/0003:1A2C:4D7E.0002/input/input4
[ 3.205093] hid-generic 0003:1A2C:4D7E.0002: input: USB HID v1.10 Keyboard [SEMICO USB Keyboard] on usb-fe3a0000.usb-1/input1
ehci-platform fe3c0000.usb: EHCI Host Controller
- bus number 4
ohci-platform fe3e0000.usb: Generic Platform OHCI controller
-
bus number 1
-
usb 1-1: new full-speed USB device number 2 using ohci-platform
[ 3.222468] input: Logitech USB Receiver as /devices/platform/fe3e0000.usb/usb1/1-1/1-1:1.0/0003:046D:C52B.0003/input/input5
[ 3.302271] hid-generic 0003:046D:C52B.0003: input: USB HID v1.11 Keyboard [Logitech USB Receiver] on usb-fe3e0000.usb-1/input0
[ 3.322472] input: Logitech USB Receiver Mouse as /devices/platform/fe3e0000.usb/usb1/1-1/1-1:1.1/0003:046D:C52B.0004/input/input6
[ 3.336668] input: Logitech USB Receiver Consumer Control as /devices/platform/fe3e0000.usb/usb1/1-1/1-1:1.1/0003:046D:C52B.0004/input/input7
[ 3.410331] input: Logitech USB Receiver System Control as /devices/platform/fe3e0000.usb/usb1/1-1/1-1:1.1/0003:046D:C52B.0004/input/input8
[ 3.425000] hid-generic 0003:046D:C52B.0004: input: USB HID v1.11 Mouse [Logitech USB Receiver] on usb-fe3e0000.usb-1/input
原理图:
USB OTG2:通过GL850G芯片实现一拖四,扩展4路USB Host(作为主机),可以外接键盘,鼠标;
USB OTG1:
- 可以作为USB DEVICE(作为从机),一般连接为type c,或者老版本手机充电线接口;
- 也可以作为USB HOST(作为主机);
核心区别在于ID线,USB OTG线中增加了一根USB ID线,当USB ID线上拉时,处于从机模式,当USB ID线接地时,处于主机模式。
模拟U盘实验,将整个开发板的存储:SD、eMMC、U盘模拟为U盘;
- 需要注意:linux下的SD卡、eMMC文件系统一般是ext4,在windows下不识别;
- 所以我们做实验,就使用一个FAT格式的存储器,那就是U盘;所以需要将U盘连接在USB OTG1(作为从机);
Device drivers:
USB support
USB Gadget Support
USB Gadget Drivers
Mass Storage Gadget # 大容量存储设备
模拟键盘:
模拟声卡:
配置输出设备为开发板声卡。
参考文章
https://blog.csdn.net/zhoudidong/article/details/129767212
https://blog.csdn.net/weixin_43245753/article/details/123496262(推荐)
[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功能
标签:Type,USB,Rockchip,USB3.0,PHY,RK3399,USB2.0,usb From: https://www.cnblogs.com/zyly/p/17701211.html