1. USB体系结构概述:USB主机、设备、集线器、物理拓扑与逻辑拓扑
USB(Universal Serial Bus,通用串行总线)体系结构采用主从式通信模型,由USB主机(Host)、USB设备(Device)和USB集线器(Hub)三类角色构成。理解其物理拓扑与逻辑拓扑是开发USB Host驱动、处理热插拔检测与中断传输的基础。
核心要点:USB物理拓扑是严格的树形结构,根节点为USB主机控制器;逻辑拓扑则是星形结构,主机与每个设备之间建立点对点逻辑连接。集线器在物理上扩展端口,在逻辑上透明转发数据。
1.1 USB体系结构的三类角色
| 角色 | 功能描述 | 典型实例 | 驱动职责 |
|---|---|---|---|
| USB主机(Host) | 总线主控者,发起所有数据传输,管理总线枚举、电源、带宽分配 | PC、嵌入式开发板、智能手机OTG | 主机控制器驱动(HCD)、USB核心层 |
| USB设备(Device) | 响应主机请求,实现特定功能(存储、HID、音频等) | U盘、鼠标、键盘、摄像头 | 设备功能驱动(如usb-storage、usbhid) |
| USB集线器(Hub) | 端口扩展器,检测设备连接/断开,管理端口电源与复位 | USB Hub芯片(如GL850G、FE1.1s) | Hub驱动(usbcore内置) |
驱动开发视角:在Linux内核中,USB子系统分为三层:主机控制器驱动层(HCD) → USB核心层(Core) → 设备驱动层(Driver)。热插拔检测由Hub驱动在核心层完成,中断传输处理则涉及设备驱动与HCD的配合。
1.2 物理拓扑:树形结构
USB物理拓扑是分层的树形结构,根节点是根集线器(Root Hub),集成在主机控制器内部。每个集线器提供若干下行端口(Downstream Port),可连接设备或下级集线器。物理拓扑的深度最多为7层(含根集线器),最多支持127个设备(含集线器)。
热插拔关键:集线器每个下行端口都有独立的端口状态寄存器,当设备插入或拔出时,端口状态变化(如连接状态改变位置位),集线器通过中断传输向主机报告变化。这是热插拔检测的硬件基础。
1.3 逻辑拓扑:星形结构
从逻辑通信角度看,USB采用星形拓扑。主机作为唯一的主控制器(Master),所有设备作为从设备(Slave),任何通信都必须由主机发起。集线器在逻辑上表现为透明转发器,不参与数据内容解析,仅负责信号中继和端口管理。
- 主机→设备:主机通过默认管道(Default Pipe)发送控制传输,完成设备枚举和配置。
- 设备→主机:设备不能主动发送数据,只能通过中断传输(Interrupt Transfer)或批量传输(Bulk Transfer)等待主机轮询(Polling)。
- 集线器角色:集线器在逻辑上是一个特殊的USB设备,拥有自己的端点(Endpoint 0用于控制,Endpoint 1用于中断状态报告)。
中断传输与热插拔:集线器的中断端点(Interrupt Endpoint)以固定间隔(如每32ms)向主机报告端口状态变化。当设备插入时,集线器中断传输的数据中包含端口状态变化位图,主机据此启动枚举流程。这是USB热插拔检测的核心机制。
1.4 物理拓扑与逻辑拓扑的对比
| 对比维度 | 物理拓扑 | 逻辑拓扑 |
|---|---|---|
| 结构形态 | 树形(分层级联) | 星形(主机为中心) |
| 节点关系 | 父子关系(Host→Hub→Device) | 主从关系(Master→Slave) |
| 集线器角色 | 物理扩展端口,信号中继 | 透明转发,不参与数据解析 |
| 通信方向 | 下行广播,上行汇聚 | 点对点,主机与设备直接逻辑连接 |
| 热插拔检测 | 集线器端口状态寄存器变化 | 集线器中断传输上报状态变化 |
| 驱动模型 | 设备树(Device Tree)层级枚举 | USB核心层统一管理设备地址与管道 |
1.5 Linux内核USB子系统软件架构
在Linux内核中,USB子系统的软件架构清晰地映射了物理与逻辑拓扑。理解这一架构是编写USB Host驱动的基础。
驱动开发提示:在Linux内核中,USB热插拔检测的入口是
hub_irq()函数(位于drivers/usb/core/hub.c),它处理集线器中断传输返回的端口状态变化位图。中断传输的初始化在hub_configure()中完成,通过usb_fill_int_urb()设置URB(USB Request Block)。
1.6 本章小结
- USB体系结构由主机、设备、集线器三类角色组成,物理拓扑为树形,逻辑拓扑为星形。
- 集线器是热插拔检测的关键硬件,其端口状态寄存器和中断端点是驱动层检测设备插入/拔出的基础。
- Linux USB子系统软件架构分为设备驱动层 → USB核心层 → HCD层 → 硬件,热插拔检测在核心层由Hub驱动完成。
- 中断传输是集线器上报端口状态变化的唯一机制,也是后续章节深入讲解的重点。