1. USB子系统概述:USB总线架构、主机控制器与设备角色、Linux USB子系统分层结构
1.1 USB总线架构概览
USB(Universal Serial Bus)是一种主从架构的总线系统,采用树形拓扑结构。整个系统由一个主机控制器(Host Controller)作为根节点,通过集线器(Hub)向下扩展,最多支持127个设备(包括集线器本身)。
USB总线架构的核心特征:
- 主从通信:所有数据传输必须由主机发起,设备不能主动发送数据。
- 轮询机制:主机控制器按帧/微帧周期轮询各设备端点。
- 即插即用:设备热插拔时,主机通过集线器检测状态变化并启动枚举。
- 电源管理:支持挂起/唤醒,主机可控制设备电源状态。
关键概念:USB 2.0 帧周期为 1ms,USB 3.0 微帧周期为 125μs。每个帧内主机可发起多个事务(Transaction),事务是数据传输的基本单元。
1.2 主机控制器与设备角色
USB总线中,主机控制器(Host Controller)是总线的核心管理者,负责调度所有总线事务。设备则根据功能分为不同的设备类(Device Class)。
| 角色 | 功能描述 | 典型硬件/软件 |
|---|---|---|
| 主机控制器 | 管理总线事务调度、帧/微帧生成、错误检测与重试 | EHCI(USB 2.0)、xHCI(USB 3.x) |
| 根集线器 | 集成在主机控制器内部,提供物理端口,检测设备连接/断开 | HC 内部逻辑 + 端口状态寄存器 |
| 集线器 | 扩展端口数量,转发事务,管理下游设备电源 | TT(Transaction Translator)用于 USB 2.0 全速/低速兼容 |
| 功能设备 | 实现具体功能(存储、HID、音频、视频等) | U 盘、鼠标、摄像头、网卡 |
开发者视角:在 Linux 内核中,主机控制器驱动负责与硬件寄存器交互,而 USB 核心层(usbcore)提供统一的设备管理接口。设备驱动开发者通常只需要关注与 usbcore 的交互,无需直接操作主机控制器硬件。
1.3 Linux USB子系统分层结构
Linux USB 子系统采用分层架构,从上到下依次为:设备驱动层、USB核心层(usbcore)、主机控制器驱动层(HCD)。每一层都有明确的职责划分。
1.4 各层职责详解
1.4.1 设备驱动层
设备驱动层是开发者最常接触的层次。每个 USB 设备驱动对应一个 usb_driver 结构体,通过 usb_register() 注册到 USB 核心。驱动需要实现 probe() 和 disconnect() 回调,分别处理设备插入和拔出事件。
// USB 设备驱动结构体示例
static struct usb_driver my_usb_driver = {
.name = "my_usb_device",
.id_table = my_usb_id_table, // 支持的设备 VID/PID 列表
.probe = my_usb_probe, // 设备插入时调用
.disconnect = my_usb_disconnect, // 设备拔出时调用
};
// 注册驱动
module_usb_driver(my_usb_driver);
1.4.2 USB核心层(usbcore)
USB 核心层是 Linux USB 子系统的中枢神经,负责以下关键功能:
- 设备枚举:读取设备描述符、配置描述符、接口描述符、端点描述符。
- URB 管理:分配、提交、取消 URB(USB Request Block),管理传输生命周期。
- 带宽管理:为等时传输和中断传输分配总线带宽。
- 电源管理:处理设备挂起/唤醒、选择性挂起。
- 设备模型集成:将 USB 设备、接口、端点映射到 Linux 设备模型(kobject/uevent)。
1.4.3 主机控制器驱动层(HCD)
HCD 是直接与硬件交互的底层驱动,不同 USB 规范对应不同的 HCD:
| HCD 名称 | 对应规范 | 传输速度 | 特点 |
|---|---|---|---|
| UHCI | USB 1.1 | 1.5 Mbps (低速) / 12 Mbps (全速) | Intel 主导,软件复杂度高,硬件简单 |
| OHCI | USB 1.1 | 1.5 Mbps / 12 Mbps | Compaq/Microsoft 主导,硬件复杂度高 |
| EHCI | USB 2.0 | 480 Mbps (高速) | 兼容全速/低速需配合 Companion Controller |
| xHCI | USB 3.x | 5 Gbps (USB 3.0) / 10 Gbps (USB 3.1) | 统一所有速度,原生支持 USB 2.0/3.0 |
兼容性注意:在 USB 2.0 系统中,EHCI 控制器通常与 UHCI/OHCI 控制器配对(称为 Companion Controller)。当高速设备插入时由 EHCI 处理,全速/低速设备由 Companion Controller 处理。xHCI 则统一处理所有速度,无需 Companion Controller。
1.5 USB设备枚举流程概述
设备枚举是 USB 子系统中最核心的流程之一,发生在设备物理插入之后。枚举过程由 USB 核心层自动完成,设备驱动开发者需要理解其步骤以正确实现 probe() 回调。
枚举的关键步骤:
- 设备连接检测:集线器检测端口状态变化(D+ 或 D- 线电平变化)。
- 复位设备:主机向端口发送复位信号,设备地址恢复为默认地址 0。
- 分配地址:主机通过控制传输(默认端点 0)发送
SET_ADDRESS请求。 - 读取设备描述符:获取设备基本信息(VID、PID、设备类等)。
- 读取配置描述符:获取接口、端点、备用设置等完整配置信息。
- 选择配置:主机发送
SET_CONFIGURATION请求,激活设备。 - 加载驱动:USB 核心根据 VID/PID 或设备类匹配驱动,调用
probe()。
枚举时间参考:USB 2.0 高速设备完整枚举通常需要 100ms~500ms,USB 3.0 设备由于链路训练时间更长,可能需要 1s~2s。枚举时间受集线器、线缆质量、主机控制器性能影响。
1.6 本章小结
USB 子系统是 Linux 内核中结构最清晰、分层最完善的子系统之一。理解总线架构、主机控制器与设备角色、以及三层软件分层,是后续深入学习 URB 传输和枚举流程的基础。