1. USB驱动概述:USB体系结构、主机控制器与设备角色、Linux USB子系统层次

USB(Universal Serial Bus)自1996年问世以来,已成为嵌入式系统与PC外设最通用的互联标准。本章从体系结构、硬件角色和软件层次三个维度,为后续URB提交与批量传输端点配置打下理论基础。

1.1 USB体系结构:分层拓扑与主从通信

USB采用星形-菊花链混合拓扑,由主机(Host)统一管理总线调度,所有通信均由主机发起,设备(Device)只能被动响应。这种主从架构决定了驱动开发中URB(USB Request Block)必须由主机端提交。

核心特征: 分层的星形拓扑、主机驱动的轮询机制、最多127个设备地址(含Hub)、支持热插拔与即插即用。
USB分层拓扑结构图 USB分层拓扑结构 主机控制器(Host Controller) 根Hub(Root Hub) Hub 1 Hub 2 设备 A 设备 B 设备 C 设备 D 说明: 主机控制器 → 根Hub → 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)。

Linux USB子系统软件架构 Linux USB子系统软件架构 用户空间(User Space) — 应用程序 / libusb / udev 内核空间 USB设备驱动层(USB Device Driver) usb_driver / usb_class_driver / usb_serial_driver USB核心层(USB Core) usb_bus_type / usb_device / usb_interface / URB管理 / 描述符解析 主机控制器驱动层(HCD) ohci-hcd / uhci-hcd / ehci-hcd / xhci-hcd 硬件层(Hardware) — USB Host Controller / Root Hub / USB Device 数据流向:用户空间 → 设备驱动 → USB Core → HCD → 硬件

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(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是跨层数据传输的核心对象,批量传输适用于大数据量、高可靠性的场景