1. USB驱动概述:USB体系结构、主机控制器与设备角色、Linux USB子系统层次
USB(Universal Serial Bus)自1996年问世以来,已成为嵌入式系统与PC外设最通用的互联标准。本章从体系结构、硬件角色和软件层次三个维度,为后续URB提交与批量传输端点配置打下理论基础。
1.1 USB体系结构:分层拓扑与主从通信
USB采用星形-菊花链混合拓扑,由主机(Host)统一管理总线调度,所有通信均由主机发起,设备(Device)只能被动响应。这种主从架构决定了驱动开发中URB(USB Request Block)必须由主机端提交。
核心特征: 分层的星形拓扑、主机驱动的轮询机制、最多127个设备地址(含Hub)、支持热插拔与即插即用。
1.2 主机控制器与设备角色
USB总线中存在两种核心角色:主机(Host)与设备(Device)。主机控制器(Host Controller)是主机侧硬件接口,负责总线协议调度;设备侧通过端点(Endpoint)与主机交换数据。
| 角色 | 硬件实体 | 职责 | 典型芯片/接口 |
|---|---|---|---|
| 主机控制器 | OHCI / UHCI / EHCI / xHCI | 帧调度、事务拆分、错误重试、电源管理 | Intel PCH、NXP i.MX、TI AM335x |
| 根Hub | 集成在主机控制器内部 | 端口状态检测、复位、连接/断开通知 | 与主机控制器集成 |
| USB设备 | 外设控制器(Peripheral Controller) | 暴露端点、响应主机请求、描述符上报 | STM32 USB FS/HS、CH340、FT232 |
| Hub | 专用Hub芯片 | 端口扩展、中继信号、电源管理 | GL850G、FE1.1s |
驱动开发提示: 在嵌入式Linux中,主机控制器驱动位于
drivers/usb/host/ 目录,设备驱动位于 drivers/usb/gadget/。编写USB设备驱动时,通常只与设备端点和URB交互,无需关心主机控制器细节。
1.3 Linux USB子系统层次
Linux内核将USB软件栈划分为三个清晰的层次,自底向上依次为:主机控制器驱动层(HCD)、USB核心层(USB Core)、设备驱动层(USB Device Driver)。
1.4 各层次核心数据结构与接口
理解USB驱动开发,必须掌握各层次的关键数据结构。下表列出最常用的核心对象:
| 层次 | 核心数据结构 | 头文件 | 主要用途 |
|---|---|---|---|
| 设备驱动层 | struct usb_driver |
<linux/usb.h> |
注册/注销USB设备驱动,绑定接口 |
| 设备驱动层 | struct usb_class_driver |
<linux/usb.h> |
创建字符设备节点,提供file_operations |
| USB核心层 | struct usb_device |
<linux/usb.h> |
代表一个USB设备,包含描述符、配置、端点信息 |
| USB核心层 | struct usb_interface |
<linux/usb.h> |
代表一个接口(功能单元),驱动绑定对象 |
| USB核心层 | struct urb |
<linux/usb.h> |
USB请求块,异步数据传输的核心载体 |
| HCD层 | struct usb_hcd |
<linux/usb/hcd.h> |
主机控制器实例,管理根Hub和总线调度 |
1.5 URB在层次中的位置
URB(USB Request Block) 是Linux USB子系统中最重要的数据传递对象,位于USB核心层。设备驱动通过URB向特定端点提交数据传输请求,USB核心层将URB递交给HCD,由主机控制器完成实际总线事务。
URB生命周期:
1. 设备驱动分配并初始化URB(
2. 填充URB:目标端点、传输方向、数据缓冲区、回调函数
3. 提交URB(
4. 硬件完成传输后,HCD调用URB回调函数通知驱动
5. 驱动在回调中处理数据,释放或重用URB
1. 设备驱动分配并初始化URB(
usb_alloc_urb)2. 填充URB:目标端点、传输方向、数据缓冲区、回调函数
3. 提交URB(
usb_submit_urb)→ USB Core → HCD → 硬件4. 硬件完成传输后,HCD调用URB回调函数通知驱动
5. 驱动在回调中处理数据,释放或重用URB
1.6 批量传输端点简介
USB定义了四种传输类型:控制传输、批量传输、中断传输、等时传输。其中批量传输(Bulk Transfer)具有以下特点:
- 非周期性:只在总线空闲时传输,不保证延迟
- 数据完整性:硬件CRC校验,出错自动重传
- 单向或双向:每个批量端点只支持一个方向(IN或OUT)
- 典型应用:U盘、USB摄像头数据流、打印机、串口适配器
批量端点通过端点描述符中的 bmAttributes 字段标识(值为0x02),其最大包长在高速模式下为512字节,在全速模式下为64字节。
常见误区: 批量传输虽然可靠,但不保证实时性。在USB总线繁忙时,批量传输可能被延迟。实时性要求高的场景(如音频、HID)应使用中断传输或等时传输。
1.7 本章小结
本章建立了USB驱动开发的整体知识框架:
- USB采用主机驱动的分层拓扑,所有通信由主机发起
- 主机控制器(HCD)负责总线调度,设备通过端点暴露功能
- Linux USB子系统分为设备驱动层 → USB核心层 → HCD层三层架构
- URB是跨层数据传输的核心对象,批量传输适用于大数据量、高可靠性的场景