USB驱动实战:urb内存管理与批量传输超时处理 - 第1节
1.1 USB 子系统整体架构
USB(Universal Serial Bus)子系统是 Linux 内核中最为复杂的设备驱动框架之一,它采用分层的软件架构来管理从主机控制器到物理设备之间的完整通信链路。理解 USB 子系统的层次结构,是掌握 URB 内存管理与批量传输超时处理的基础。
核心要点:USB 子系统分为三层——主机控制器驱动层(HCD)、USB 核心层(USB Core)和设备驱动层(Client Driver)。URB(USB Request Block)是贯穿这三层的数据载体。
1.2 USB 主机控制器
USB 主机控制器(Host Controller)是连接 CPU 与 USB 总线的硬件单元,负责管理总线上的所有传输事务。Linux 内核通过不同的 HCD 驱动来支持多种主机控制器规范。
1.2.1 主机控制器规范对比
| 规范 | USB 版本 | 传输速率 | 特点 | Linux 驱动 |
|---|---|---|---|---|
| UHCI | USB 1.1 | 1.5 / 12 Mbps | 软件管理帧列表,CPU 负载较高 | uhci-hcd |
| OHCI | USB 1.1 | 1.5 / 12 Mbps | 硬件管理帧列表,CPU 负载较低 | ohci-hcd |
| EHCI | USB 2.0 | 480 Mbps | 高速模式,兼容 UHCI/OHCI | ehci-hcd |
| xHCI | USB 3.0 / 3.1 / 3.2 | 5 / 10 / 20 Gbps | 统一架构,支持所有速度等级 | xhci-hcd |
实战提示:在嵌入式系统中,xHCI 已成为主流选择。xHCI 使用 TRB(Transfer Request Block) 作为硬件层面的传输描述符,URB 在 HCD 层会被转换为一个或多个 TRB 提交给硬件。
1.3 USB 设备模型
Linux USB 设备模型采用树形拓扑结构,通过 usb_device、usb_interface、usb_host 等内核数据结构来描述物理设备和逻辑功能单元。
1.3.1 设备模型核心数据结构
- usb_device:代表一个物理 USB 设备,包含设备描述符、配置描述符、端点信息等。
- usb_interface:代表设备中的一个功能接口,一个设备可以有多个接口(如复合设备)。
- usb_host:代表主机控制器,管理根集线器(Root Hub)和总线拓扑。
- usb_endpoint_descriptor:描述端点的传输类型、方向、最大包大小等属性。
1.4 URB 在 USB 通信中的角色
URB(USB Request Block)是 Linux USB 子系统中最核心的数据抽象,它封装了一次 USB 传输所需的所有信息:目标端点、传输方向、数据缓冲区、传输长度、回调函数、超时时间等。
1.4.1 URB 的生命周期
- 创建:驱动通过
usb_alloc_urb()分配 URB 结构体。 - 初始化:填充 URB 的各个字段,包括端点、缓冲区、回调函数等。
- 提交:调用
usb_submit_urb()将 URB 提交给 USB Core。 - 调度:USB Core 将 URB 放入对应端点的队列,等待 HCD 处理。
- 传输:HCD 将 URB 转换为硬件事务,通过主机控制器发送到 USB 总线。
- 完成:传输结束后,HCD 回调 URB 的完成函数,驱动在回调中处理数据。
- 回收:驱动调用
usb_free_urb()释放 URB 内存。
1.4.2 URB 结构体关键字段
| 字段 | 类型 | 说明 |
|---|---|---|
dev |
struct usb_device * |
目标 USB 设备 |
pipe |
unsigned int |
管道标识,编码端点号、方向、传输类型 |
transfer_buffer |
void * |
数据缓冲区指针 |
transfer_buffer_length |
int |
缓冲区长度(字节) |
complete |
usb_complete_t |
传输完成回调函数 |
context |
void * |
回调上下文参数 |
timeout |
int |
超时时间(单位:jiffies),仅控制传输使用 |
status |
int |
传输状态,由 HCD 在完成时设置 |
actual_length |
int |
实际传输的字节数 |
常见陷阱:URB 的
transfer_buffer 必须使用 kmalloc() 或 usb_alloc_coherent() 分配,不能使用栈上变量。栈内存在 URB 异步完成时可能已被释放,导致内核崩溃。
1.4.3 URB 与传输类型的关系
USB 规范定义了四种传输类型,每种类型对应不同的 URB 使用模式:
- 控制传输(Control):用于设备枚举和命令发送,使用
usb_control_msg()或 URB 的setup_packet字段。 - 批量传输(Bulk):用于大块数据,如 U 盘读写,支持错误重试,无带宽保证。
- 中断传输(Interrupt):用于周期性小数据,如鼠标、键盘,保证最大延迟。
- 等时传输(Isochronous):用于实时数据流,如音频、视频,无错误重试。
1.5 本章小结
本章建立了 USB 子系统的整体视图:
- USB 子系统分为 设备驱动层 → USB Core → HCD 三层,URB 是跨层通信的唯一载体。
- 主机控制器规范(UHCI/OHCI/EHCI/xHCI)决定了 HCD 的实现方式,xHCI 是当前主流。
- 设备模型采用 usb_device → usb_interface 的树形结构,每个接口对应一个功能驱动。
- URB 封装了一次传输的全部信息,其生命周期包括创建、初始化、提交、调度、完成、回收六个阶段。
- 四种传输类型(控制、批量、中断、等时)对应不同的 URB 使用模式和性能特征。