1. USB子系统概述
USB(Universal Serial Bus)自1996年诞生以来,已成为嵌入式系统和PC领域最通用的外设连接标准。在Linux内核中,USB子系统是一个高度模块化、分层设计的核心组件,负责管理从主机控制器到终端设备的完整通信链路。理解USB总线架构、主机控制器角色、设备角色以及Linux内核中的层次结构,是掌握USB驱动开发与枚举流程的基础。
1.1 USB总线架构
USB采用树形拓扑结构,由主机(Host)、集线器(Hub)和设备(Device)三类节点构成。主机控制器位于根节点,通过根集线器(Root Hub)向下扩展,最多支持7层拓扑深度(包括根集线器层)。
1.2 主机控制器角色
主机控制器(Host Controller, HC)是USB总线的大脑,负责物理层信号处理、事务调度、数据传输和错误恢复。Linux内核支持多种主机控制器接口标准,每种标准对应不同的硬件实现和软件栈。
| 主机控制器标准 | 对应USB版本 | 传输速率 | Linux驱动 |
|---|---|---|---|
| UHCI (Universal Host Controller Interface) | USB 1.1 | 1.5 Mbps (低速) / 12 Mbps (全速) | uhci-hcd |
| OHCI (Open Host Controller Interface) | USB 1.1 | 1.5 Mbps / 12 Mbps | ohci-hcd |
| EHCI (Enhanced Host Controller Interface) | USB 2.0 | 480 Mbps (高速) | ehci-hcd |
| xHCI (eXtensible Host Controller Interface) | USB 3.x / 2.0 / 1.1 | 5 Gbps (SuperSpeed) / 10 Gbps (SuperSpeed+) | xhci-hcd |
1.3 设备角色
USB设备在总线上扮演两种角色:功能设备(Function)和集线器(Hub)。功能设备提供具体的外设功能(如存储、键盘、摄像头),集线器负责总线扩展和端口管理。此外,USB OTG(On-The-Go)规范引入了双角色设备(Dual-Role Device, DRD),允许设备在主机和设备角色之间切换。
- 功能设备:包含一个或多个接口(Interface),每个接口对应一个逻辑功能。例如,一个USB摄像头可能包含视频接口和音频接口。
- 集线器:负责端口状态检测、电源管理、速度协商和信号中继。每个集线器必须支持至少一个上游端口和最多7个下游端口。
- 复合设备(Composite Device):一个物理设备包含多个独立的功能接口,每个接口由不同的驱动程序管理。
- 双角色设备(DRD):通过ID引脚或硬件寄存器动态切换角色,常见于移动设备和嵌入式系统。
1.4 Linux USB子系统层次结构
Linux内核的USB子系统采用三层架构:主机控制器驱动层(HCD)、USB核心层(USB Core)和设备驱动层(USB Device Drivers)。这种分层设计实现了硬件抽象与驱动复用。
- 主机控制器驱动层(HCD):直接与硬件寄存器交互,处理中断、DMA和帧调度。每个主机控制器标准(UHCI/OHCI/EHCI/xHCI)对应一个HCD模块。
- USB核心层(USB Core):提供总线管理、设备枚举、配置解析、电源管理和通用API。核心层维护设备树、分配地址、加载驱动程序。
- 设备驱动层:实现具体设备的功能逻辑,如USB存储驱动(
usb-storage)、HID驱动(usbhid)、CDC ACM驱动等。
1.5 关键数据结构与模块关系
在Linux内核源码中,USB子系统的核心数据结构定义在 include/linux/usb.h 和 drivers/usb/core/usb.h 中。以下表格列出了最重要的几个结构体及其作用:
| 数据结构 | 定义位置 | 作用描述 |
|---|---|---|
usb_device |
include/linux/usb.h |
代表一个USB设备,包含设备描述符、配置列表、端点信息、父集线器指针等 |
usb_interface |
include/linux/usb.h |
代表设备中的一个接口(功能单元),是驱动绑定的基本对象 |
usb_host_config |
drivers/usb/core/usb.h |
描述设备的某个配置(Configuration),包含接口数组和配置描述符 |
urb (USB Request Block) |
include/linux/usb.h |
USB请求块,是主机与设备之间数据传输的基本单元 |
usb_hcd |
include/linux/usb/hcd.h |
主机控制器驱动实例,包含硬件操作函数集、根集线器状态、DMA池等 |
usb_submit_urb()、usb_control_msg())与设备通信,无需关心底层主机控制器的具体实现。这种抽象是Linux USB驱动可移植性的基石。
1.6 本章小结
USB子系统的概述为后续深入学习枚举流程和驱动初始化奠定了概念基础。关键要点包括:
- USB总线采用树形拓扑,主机控制器是唯一的主控节点。
- Linux支持四种主机控制器标准(UHCI/OHCI/EHCI/xHCI),其中xHCI是当前主流。
- 设备角色分为功能设备、集线器和双角色设备,复合设备在Linux中表现为多个接口。
- Linux USB子系统采用三层架构:HCD层、USB Core层和设备驱动层,层间通过标准API交互。
- 核心数据结构
usb_device、usb_interface和urb是驱动开发中频繁操作的对象。