Rockchip RK3399 - USB基础

发布时间 2023-09-14 19:27:32作者: 大奥特曼打小怪兽

一、USB基础知识回顾

linux驱动移植-usb驱动基础我们对USB总线进行了简单的介绍,其中包括:

  • USB协议版本介绍:USB1.0USB1.1USB2.0USB3.0USB3.1USB3.2USB4.0
  • USB接口:伴随着USB版本迭代,USB产生了多种连接器类型规范,比如Type-AType-BMini-AMini-BMicro-AMicro-BType-C等。

1.1 USB协议版本

从USB协议诞生至今,出现了多个USB协议版本,如USB1.0USB1.1USB2.0USB3.0USB3.1USB3.2。最新的是USB4.0协议,可直连CPUPCIe总线,最大速度可达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.13.0引脚相同;

  • USB2.0:一共有4根引脚,一对差分线D+/D-,还有地线GND、电源线VBUS

  • USB3.0:一共有9根引脚,为了兼容USB2.0除了拥有USB2.0的一对差分线D+/D-、以及地线GND、电源线VBUS外,还会拥有两对差分线(SSTX+SSTX-SSRX+SSRX-)和一根屏蔽地线;

USB3.0USB2.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-CUSB Type-C最明显的特点就是支持正反面盲插,是以后USB接口的发展趋势,也是当前手机充电器广泛使用的接口;

这里有一点我们需要了解的是,接口类型不同,引脚也会有差别;纵然是同一类型接口,比如Type A,不同USB协议版本,引脚也会不同。

这里不做过多展开介绍,更多可以参考:USB2.0USB3.0typec引脚定义

实物图如下图所示:

1.3 USB框图

这里我们需要补充一些USB相关的硬件知识,因为RK3399驱动编写中会涉及到。

USB芯片内部实现的功能就是接受软件的控制,进而从内存搬运数据并按照USB协议进行数据打包,并串转换后输出到芯片外部。或者从芯片外部接收差分数据信号,串并转换后进行数据打包并写到内存中。

USB芯片一般分为ControllerPHY,以Controller PHY 都被封装到SoC为例,如图:

图中绘制的是USB 2.0芯片,其中:

  • VBUS :电压线,主机利用VBUSUSB设备提供工作电压;
  • 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进行数据交互,控制USBDDR搬运数据的通道,主要作为Master通过AXI/AHB进行交互;
1.3.2 PHY

USB PHY负责最底层的信号转换,作用类似于网口的PHY。主要实现 并转串的功能,把控制器通过 UTMIULPI总线传递过来的并行数据 转换为串行数据,再通过差分数据线输出到USB接口。

二、RK3399 USB介绍

2.1 USB控制器

RK3399支持4个独立的USB控制器,不同控制器相互独立:

  • 两个USB2.0 HOSTEHCI&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控制器的框图如下图所示;

内部有EHCIOHCI Host Controller

  • OHCI支持USB1.0USB1.1;
  • EHCI支持USB2.0

Port Routing Control: 用于选择用EHCI还是OHCI

USB 2.0 Host控制器连接到USB2.0 PHY

EHCIOHCI Rockchip采用linux内核USB Generic驱动,一般开发时只需要对设备树作相应配置,即可正常工作。

为了同时支持USB1.0USB1.1USB2.0,就需要同时用到EHCIOHCI,因此需要在设备树中把这两个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控制器就使能了,并且同时支持EHCIOHCI

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支持同时执行INOUT传输,带宽达到8Gbps
  • 支持描述符缓存 (Descriptor Caching) 和数据预取 (Data Pre-fetching);
  • Device模式支持的IN端点数量和OUT端点数量请参考芯片手册;
  • 支持硬件自动处理ERDYburst
  • 支持端点批量流传输 (bulk stream);
  • 支持USB3.0 DRD (Dual-Role Device) 特性;
  • 支持根据OTG ID状态切换DeviceHost模式;
  • 对于支持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 OTGUSB PeripheralUSB Host)功能,且向下兼容USB2.0 OTG功能,大传输速率为5Gbps

由于USB3.0 HOST控制器为xHCI,集成于DWC3 OTG IP中,所以不用单独为其配置设备树,只需要配置DWC3,并且设置DWC3dr_mode属性为dr_mode = otg或者dr_mode = host,即可以使能xHCI控制器。

2.2 USB PHY

RK3399支持4个独立的USB PHY

  • 2个USB2.0 PHY:在设备树中分别叫做u2phy0u2phy1;
  • 2个USB3.0 Type-C PHY:在设备树中分别叫做tcphy0tcphy0
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_hostu2phy0_otg
  • u2phy1:包含u2phy1_hostu2phy1_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 PHYUSB 3.0 SuperSpeed PHYDisplayPort Transmit PHY组成。其中:

  • PIPE_IF接上面提到的USB3.0 OTG
  • DPTX_IFDP

RK3399为例;

  • tcphy0:包含tcphy0_dptcphy0_usb3
  • tcphy1:包含u2phy1_hostu2phy1_otg

USB3.0 Type-C PHY可以根据实际的应用需求,将物理接口简化设计为USB3.0/2.0 Type-AUSB 3.0/2.0 Micro-B USB 3.0/2.0 Type-C等多种接口类型,内核USB驱动已经兼容这几种不同类型的USB接口,只需要根据实际的硬件设计修改对应的板级设备树配置,就可以使能相应的USB接口。

2.3 USB控制器和PHY关系

RK3399 USB控制器和USB PHY的连接示意图如下:

上图中DPDisplay Port控制器,DPUSB3.0./2.0 OTG共用USB3.0 Type-C PHY。一个完整的Type-C功能,是由USB3.0 SuperSpeed PHYUSB2.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-CDisplayPort 1.2 Alt Mode on USB Type-C

3.1 USB2.0 Host Type-A

Nanpi-T4 开发板USB2.0 PHY芯片引脚如下图所示:

3.1.1 电源接线

上图中供电依次为VCCA0V9_S3VCCA1V8_S3VCC3V3_S3

(1) 电源VCCA0V9_S3RT9041B-10GE提供的,这是一款稳压器IC,其输入端为VCC3V3_S5

RT9041B-10GEVCC1V8_S3使能,VCC1V8_S3作为使能引脚EN的输入端;

VCC1V8_S3是由PMIC_SLEEP_H(连接RK3399GPIO1_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_S3RT9193-18PU5/1.8V提供的,这是一款稳压器IC,其输入端为VCC3V3_SYS

RT9193-18PU5/1.8V同样由VCC1V8_S3使能。

输入端VCC3V3_SYS同样是由VCC12V0_SYS经过NB680GD降压开关模块转换器输出得到固定3.3V电压。

(3) 电源VCC3V3_S3RK808提供的,连接RK808电源管理芯片第7号输出引脚VSWOUT1

3.1.2 Type-A接口接线

HOST0_DMHOST0_DP连接到USBH2USBH2USB2.0 Host Type-A接口;

RK3399 USB2.0 PHY0 USB2.0 Host Type A
HOST0_DP HOST0_DP D+
HOST0_DM HOST0_DM D-

HOST1_DMHOST1_DP连接到USBH3USBH3USB2.0 Host Type-A接口;

RK3399 USB PHY1 USB2.0 Host Type A
HOST1_DP HOST1_DP D+
HOST1_DM HOST1_DM D-

如下图所示;

电源VCC5V0_HOST0RT9724GQW提供的,RT9724GQW是一款USB电源供应IC,集成了过电流保护电路、短路折返电路、热关断电路和欠压锁定电路,其输入端为VCC5V0_SYS

RT9724GQWVCC5V0_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_DMUSB3_DPUSB3_SSRXNUSB3_SSRXPUSB3_SSTXNUSB3_SSTXP连接到CON5CON5USB3.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_HOST2RT9724GQW提供的,RT9724GQW是一款USB电源供应IC,集成了过电流保护电路、短路折返电路、热关断电路和欠压锁定电路,其输入端为VCC5V0_SYS

RT9724GQWVCC5V0_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_TX1PTYPEC0_TX1NTYPEC0_RX1PTYPEC0_RX1NTYPEC0_TX2PTYPEC0_TX2NTYPEC0_RX2PTYPEC0_RX2NTYPEC0_SBU1TYPEC0_SBU2TYPEC0_SBU1_DCTYPEC0_SBU2_DC连接到TYPE-CTYPE-CUSB3.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_TYPECRT9724GQW提供的,其输入端为VCC5V0_SYS。由GPIO4_D2引脚使能;

3.3.2 FUSB302

INT连接的是RK3399GPIO_A2引脚,I2C通信使用的是I2C4

四、设备树

4.1 USB2.0 Host Type-A

NanoPC-TC开发板支持两个USB2.0 Host Type-A接口,对应的USB控制器为USB2.0 HOST(EHCI&OHCI)、对应的USB PHYUSB2.0 HOST PHY

因此对应的设备树配置,包括USB2.0 HOST(EHCI&OHCI)控制器设备树配置和USB2.0 HOST PHY设备树配置。

4.1.1 控制器配置

(1) USB2.0 HOST0控制器设备节点usb_host0_ehciusb_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控制器就是我们之前介绍的是EHCIOHCIOHCI支持USB1.0USB1.1EHCI支持USB2.0

(2) USB2.0 HOST1控制器设备节点usb_host1_ehciusb_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_S3VCCA1V8_S3VCC3V3_S3

VCCA0V9_S3VCCA1V8_S3这两路由PMIC_SLEEP_H(连接RK3399GPIO1_A5/AP_PWROFF,这个应该是处理的睡眠引脚,处理器工作时电源有效)引脚控制的;

VCC3V3_S3RK808电源管理芯片第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_HOST0RT9724GQW提供的,其输入端为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.0USB1.1USB2.0,就需要同时用到EHCIOHCI,因此需要把这两个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 PHYUSB3.0 Type-C PHYUSB2.0 OTG PHY

因此对应的设备树配置,包括USB3.0/2.0 OTG(DWC3/xHCI)控制器设备树配置和USB3.0 Type-C PHYUSB2.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_S3VCCA1V8_S3VCC3V3_S3, 这个配置上面已经介绍了,不再重复介绍。

(2) USB3.0 Type-C PHY芯片三路电源和USB2.0 PHY芯片三路电源一样。

(3) USB3.0 Host Type-A接口电源VCC5V0_HOST2RT9724GQW提供的,其输入端为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的节点(tcphyu2phy)都要删除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 PHYUSB3.0 Type-C PHYUSB2.0 OTG PHY

因此对应的设备树配置,包括USB3.0/2.0 OTG(DWC3/xHCI)控制器设备树配置和USB3.0 Type-C PHYUSB2.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_S3VCCA1V8_S3VCC3V3_S3, 这个配置上面已经介绍了,不再重复介绍。

(2) USB3.0 Type-C PHY芯片三路电源和USB2.0 PHY芯片三路电源一样。

(3) USB3.0 Type-C接口电源VBUS_TYPECRT9724GQW提供的,其输入端为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的节点(tcphyu2phy)都要配置extcon属性;
  • 对应的USB控制器子节点(usbdrd_dwc3)的dr_mode属性要配置为otg
  1. 找到设备
    所有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
	...
  1. 找到接口
    进一步的,我们可以查看其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功能