一、导读
本文主要描述linux的usb子系统,此子系统较为庞大,且usb本身也比较复杂,本文姑且跳过这些复杂的话题,首先对usb做一个简单描述,接着会基于linux从硬件和软件视角描述usb结构和框图。
(1-1)USB简介
USB( Universal Serial Bus)是通用串行总线,用于计算机与外部设备的连接和通信。现如今USB接口可以说是随处可见,得到了大范围的应用。
从USB发展史来看,出现了几个版本:USAB1.0、USB2.0、USB3.0、USB4.0
USB1.0:USB 规范于 1995 年第一次发布,由 Intel、IBM、Microsoft 等公司组成的 USB-IF(USB Implement Forum)组织提出。USB-IF 与 1996 年正式发布 USB1.0,理论速度为 1.5Mbps。1998 年 USBIF 在 USB1.0 的基础上提出了 USB1.1 规范。
USB2.0:USB2.0 依然由 Intel、IBM、Microsoft 等公司提出并发布,USB2.0 分为两个版 本:Full-Speed 和 High-Speed,也就是全速(FS)和高速(HS)。USB2.0 FS 的速度为 12Mbps,USB2.0 HS 速度为 480Mbps。目前大多数单片机以及低端 Cortex-A 芯片配置的都是 USB2.0 接口。
USB3.0:最大理论传输速度为 5.0Gbps,USB3.0引入了全双工数据传输,USB2.0 的 480Mbps 为半双工。USB3.0 中有两根线用于发送数据,另外两根用于接收数据。除此之外,在USB3.0的基础上又提出了USB3.1、USB3.2等规范。
USB4.0:USB4 1.0规范于2019年8月发布,速度提升到了 40Gbps。
二、USB硬件视角
(2-1)各式各样的USB接口
USB接口经过近20年的演化过程,产生了非常多的分支,常见接口总结如下:
- USB A

USB B
Micro USB / Mini USB

- USB TypeC

- USB规范

- 接头类型

(2-2)USB硬件方案
小生对比了目前常见的一些处理器,发现对USB硬件部分IP大多遵循以下结构:
- 直接连接

- 使用Hub扩展多个USB物理接口,例如
GL850G
USB2.0 Hub芯片,结构框图总结如下:
例如瑞芯微rk3568处理器的USB部分:

UTMI是USB的PHY协议,英文全称USB 2.0 Transceiver Macrocell Interace。UTMI+则是由UTMI发展而来,为USB系统增加了主机和OTG功能。协议升级到UTMI+之后UTMI就被定义为UTMI LEVEL0,如下图所示:

三、Linux-USB软件视角
从软件视角看linux-usb子系统,可总结出下图所示结构:
- USB Core核心
USB核心由一系列基础代码组成,这些基础代码包括了用于描述USB子系统的结构体和相关函数实现,这些函数供主机控制器驱动(HCD)和USB客户驱动程序使用,还用于导出相关的接口到用户空间,例如usbfs
文件系统。
- HOST控制器驱动
对于常见、主流的USB HOST控制器驱动,在linux内核中都提供有对应的驱动程序,例如:UHCI
、OHCI
、EHCI
、xHCI
。如果处理器的USB HOST控制器符合标准的控制器规范,则可以直接使用内核提供的标准HOST控制器驱动。
- HUB驱动
在USB主机控制器中一般内嵌了一个叫根集线器的硬件,HUB驱动则用于驱动这个硬件。
linux内核USB子系统下提供了基础设施或者辅助线程用于监测USB端口状态变化和配置热插拔设备,通常情况下该线程处于睡眠状态,当Hub驱动程序检测到USB端口状态变化后,该内核线程被立马唤醒执行对应的操作。
- 客户端驱动程序
客户端驱动程序是用于操作具体USB设备的驱动程序。
对于USB端到端的操作,往往需要USB子系统配合其他的内核层来共同完成。例如:一个USB-蓝牙键盘,则需要USB子系统、蓝牙层、input子系统和tty层来共同完成。
