USB Hub 枚举与初始化完整流程
2026-04-20
本文链接为:http://www.usbzh.com/article/detail-1613.html ,欢迎转载,转载请附上本文链接。
集线器本身就是一个普通 USB 设备,所以先按普通设备枚举,再执行 Hub 专属步骤。
阶段1:标准 USB 设备枚举(所有设备通用)
- 复位端口
- 主机下发端口复位,等待设备稳定
- 获取设备描述符(Device Descriptor)
- 地址 0,端点 0
- 读取前 8 字节,获取 bMaxPacketSize0
- 设置设备地址(Set Address)
- 分配一个非 0 地址(如 2~127)
- 重新获取完整设备描述符
- 获取配置描述符(Configuration Descriptor)
- 先读 9 字节总长度
- 再读全部配置(含接口、端点)
- 选择配置(Set Configuration)
- 选择 bConfigurationValue=1
集线器一定有:
- 接口 class = 0x09(Hub 类)
- 一个中断 IN 端点,用于上报端口状态变化
阶段2:Hub 专属初始化
步骤 1:获取 Hub 描述符(Class Request)
- 请求类型:
0xA0(设备到主机、类、接收者为设备) - bRequest:
GET_DESCRIPTOR= 6 - wValue:
(0x29 << 8) | 0(Hub 描述符类型 0x29) - wIndex:0
- 读取到 Hub Descriptor
从中得到:
- bNbrPorts:集线器下行端口数量
- 供电方式、过流特性、端口上电延时等
步骤 2:设置集线器特性(可选)
根据需要设置:
- 集线器供电
- 过流保护
步骤 3:为每个下行端口初始化
对 端口 1 ~ bNbrPorts 依次执行:
3.1 关闭端口电源(可选)
- SET_FEATURE
- PORT_POWER
3.2 开启端口电源
- SET_FEATURE
- PORT_POWER
- 等待上电稳定时间(Hub 描述符中的 bPwrOn2PwrGood × 2ms)
3.3 轮询/等待端口连接
两种方式:
- 中断端点查询(推荐)
- 读取中断 IN 端点,得到位图:哪个端口状态变化
- 轮询端口状态
- GET_STATUS(port)
3.4 检测到连接后
- 复位端口
- SET_FEATURE(PORT_RESET)
- 等待复位完成
- 读取端口状态
- GET_STATUS(port)
获取: - 是否连接
- 端口使能
- 速度(低速/全速/高速)
- GET_STATUS(port)
- 清除状态变化位
- CLEAR_FEATURE(PORT_CONNECTION)
- CLEAR_FEATURE(PORT_ENABLE)
等变化标志
3.5 根据端口速度进入子设备枚举
阶段3:Hub 正常运行逻辑
1. 持续监听中断端点
中断 IN 端点返回一个 位图(bitmap)
每一位对应一个端口:=1 表示端口状态变化(连接/断开/过流等)
2. 状态变化处理流程
- 收到中断数据
- 对每个变化的端口:
- GET_STATUS(port)
- 识别事件:连接 / 断开 / 过流 / 复位完成
- CLEAR_FEATURE 清除对应变化位
- 连接 → 复位 → 枚举新设备
- 断开 → 注销对应设备
阶段4:TT(Transaction Translator)相关(USB2.0 必须)
如果集线器支持 FS/LS 设备,内部有 TT:
- 用于 EHCI 拆分事务(Split Transaction)
驱动需要:
- RESET_TT
- CLEAR_TT_BUFFER
在端口速度切换或异常时使用
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936 USB技术交流3:1031974172
USB2.0集线器HUB





