首页 > 其他分享 >Rockchip RK3399 - USB基础

Rockchip RK3399 - USB基础

时间:2023-09-14 19:35:09浏览次数:50  
标签:Type USB Rockchip USB3.0 PHY RK3399 USB2.0 usb

一、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功能

标签:Type,USB,Rockchip,USB3.0,PHY,RK3399,USB2.0,usb
From: https://www.cnblogs.com/zyly/p/17701211.html

相关文章

  • 《安富莱嵌入式周报》第322期:自制10KV电子负载,史上最详细的电池系列资料,创意洞洞板任
    周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版:https://www.bilibili.com/video/BV1M8411q7dw/ 1、史上最详细的电池管理资料网站这些教程评估了各种电池化学成分的优势和局限性,就最佳选择提出了建议,并提出了延......
  • USB-CDC虚拟串口实现printf功能
    本篇文章介绍如何使用CH32来实现USB虚拟串口打印功能,代替传统中的串口打印。相比传统串口优势点: 1,速度快,一包大概也就几十us,而传统的大概要用到几ms。 2,节省了一个USB转串口芯片的成本。 3,在没有USB转串口工具的情况下,可以很方便调试。下面就介绍怎么配置USB-FS口一,在US......
  • Intel正式发布雷电5:120Gbps带宽、240W充电逆天!玩法远胜USB4 2.0
    Intel正式发布了全新一代的Thunderbolt5接口标准,也就是雷电5,无论传输速度还是连接能力,都实现了一次巨大的飞跃,更是展示了基于雷电5的新一代笔记本、扩展坞原型。这里,我们就看看雷电5到底带来了哪些变化,可以如何改变我们的工作、生活和娱乐方式,以及Intel在背后有怎样的思考,做出了......
  • 迅为RK3399开发板创建android工程
    打开 AndroidStudio 软件,点击“StartanewAndroidStudioproject”新建一个 NativeC++工程(因为我们要调用本地库,所以要创建这个 C++实例工程),点击“Next”2.填写创建信息,如下图所示。最后点击“finish”,等待几分钟,创建工程完成。3.在开始写代码前先编译一下刚刚创建的工程,确......
  • linux系统下禁用usb口
    当用户不需要使用usb口时可在系统下通过以下方式禁用usb口:首先执行lsusb查看识别到的usb设备: root@localhost:~#lsusbBus003Device002:ID0000:3825  USBOPTICALMOUSEBus003Device001:ID1d6b:0002LinuxFoundation2.0roothubBus002Device002:ID1c4f:00......
  • Lattice下载器高速编程器HW-USBN-2B fpga仿真器ispdown烧录器
    1.概述       HW-USBN-2B编程烧录Lattice所有芯片,速度非常快。支持LatticeFPGA芯片在线稳定仿真、烧录、加密,支持LatticeCPLD烧录。支持外部配置FLASH、PROM配置烧录。    HW-USBN-2B,特点是很快的速度,30Mb/s,是HW-USBN-2A的下载速度10速度。并且支持I2C接口......
  • USB适配器应用芯片 国产GP232RL软硬件兼容替代FT232RL DPU02直接替代CP2102
    USB适配器,是英文UniversalSerialBus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术,移动PC由于没有电池,电源适配器对其尤为重要。今天来讲讲USB适配器的国产适用芯片。一、GP232RL,直接软硬件......
  • Android USB开发1—开发环境搭建
    通过Genymotion与VirtualBox可以实现将电脑中的USB设备转接到Android模拟器中进行通信。Genymotion配置首先从https://www.genymotion.com/download/下载GenymotionwithVirtualBox在完成模拟器的创建后,无论是否启动模拟器都可以在OracleVMVirtualBox中进行USB的配......
  • Android USB开发—USB通信
    USB通信两端分别称为:HOST(USB主机)与Device(USB从机/USB配件),常见的主机就是我们的计算机。而Android可以支持USB主机模式与USB配件模式,意思就是Android既可以是主机也可以是配件。Android作为配件与其通信的主机必须设计为与Android设备兼容,即遵循Android配件通信协议(AOA协......
  • 在 Java 应用程序中访问 USB 设备
    介绍USB、jUSB和JSR-80Java平台一直都以其平台无关性自豪。虽然这种无关性有许多好处,但是它也使得编写与硬件交互的Java应用程序的过程变得相当复杂。在本文中,研究科学家蒋清野讨论了两个项目,它们通过提供使Java应用程序可以使用USB设备的API而使这个过程变得更容易。......