一、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.5Mbps),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功能