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),事务是数据传输的基本单元。
USB总线树形拓扑结构 主机控制器 (HC) 根集线器 (Root Hub) 集线器 1 集线器 2 集线器 3 设备 A 设备 B 设备 C 设备 D 设备 E 说明:USB采用树形拓扑,主机控制器为根节点,集线器扩展端口,设备作为叶子节点。最多支持127个设备。

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)。每一层都有明确的职责划分。

Linux USB子系统分层架构 用户空间 (User Space) 设备驱动层 (Device Driver) usb_driver / usb_class_driver / usb_interface USB核心层 (USB Core / usbcore) 设备枚举 / 配置管理 / URB 路由 / 带宽管理 主机控制器驱动层 (HCD) ehci-hcd / ohci-hcd / uhci-hcd / xhci-hcd USB 硬件 (Host Controller + Bus) 说明:数据流从上到下:用户空间 -> 设备驱动 -> usbcore -> HCD -> 硬件。URB 是各层间传递数据的核心结构。

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() 回调。

枚举的关键步骤:

  1. 设备连接检测:集线器检测端口状态变化(D+ 或 D- 线电平变化)。
  2. 复位设备:主机向端口发送复位信号,设备地址恢复为默认地址 0。
  3. 分配地址:主机通过控制传输(默认端点 0)发送 SET_ADDRESS 请求。
  4. 读取设备描述符:获取设备基本信息(VID、PID、设备类等)。
  5. 读取配置描述符:获取接口、端点、备用设置等完整配置信息。
  6. 选择配置:主机发送 SET_CONFIGURATION 请求,激活设备。
  7. 加载驱动:USB 核心根据 VID/PID 或设备类匹配驱动,调用 probe()。
枚举时间参考:USB 2.0 高速设备完整枚举通常需要 100ms~500ms,USB 3.0 设备由于链路训练时间更长,可能需要 1s~2s。枚举时间受集线器、线缆质量、主机控制器性能影响。
USB设备枚举流程 1. 设备连接检测 2. 复位设备 3. 分配地址 (SET_ADDRESS) 4. 读取设备描述符 5. 读取配置描述符 6. 选择配置 (SET_CONFIG) 7. 加载驱动 (probe) 枚举关键信息 • 默认端点:端点 0 (控制传输) • 默认地址:0 • 最大包长:8/16/32/64 字节

1.6 本章小结

USB 子系统是 Linux 内核中结构最清晰、分层最完善的子系统之一。理解总线架构、主机控制器与设备角色、以及三层软件分层,是后续深入学习 URB 传输和枚举流程的基础。