USB系统架构:主机、设备与集线器的角色和拓扑

大家好,欢迎来到第二章。今天我们来聊聊USB系统的整体架构。说白了,就是搞清楚USB世界里谁说了算、谁干活、谁负责传话。

我刚入行那会儿,总觉得USB就是插个U盘这么简单。直到有一次调试一个嵌入式主机的枚举失败问题,折腾了整整三天,最后发现是集线器(Hub)的复位时序没处理好。嗯,从那以后我才真正重视起USB的拓扑结构。

一、USB的拓扑结构:树形分层

USB的拓扑结构,说白了就是一棵倒着长的树。树根是主机(Host),树枝是集线器(Hub),树叶是设备(Device)。

为什么会这样设计?我个人的理解是:USB从诞生之初就考虑到了扩展性。你想想看,一个电脑只有一个USB控制器,但你可以接几十个设备,靠的就是这种树形结构。

核心要点:USB拓扑是严格的树形结构,不允许有环路。每个USB系统中只有一个主机,最多支持127个设备(包括集线器)。

USB树形拓扑结构 USB主机 (Host) 根集线器 (Root Hub) 集线器 1 集线器 2 设备 A 设备 B 设备 C 设备 D 说明: • 主机位于拓扑顶层,通过根集线器连接下层 • 集线器可以级联,但最多不超过7层(包括根集线器) • 设备只能作为叶子节点,不能继续扩展

二、主机(Host):USB世界的统治者

主机是整个USB系统的核心。它负责调度所有事务、管理带宽、分配地址。我习惯把主机比作一个公司的CEO——所有决策都得经过它。

主机的内部结构其实挺复杂的,主要包括三个部分:

组件 功能 我踩过的坑
USB主机控制器 硬件层面处理USB协议,负责事务传输 不同厂商的控制器寄存器差异很大,移植时一定要仔细看手册
根集线器 提供物理端口,检测设备插拔 我曾经忽略根集线器的端口状态轮询,导致热插拔检测失败
主机软件栈 驱动层、协议层、类驱动层 中断传输的调度优先级搞反过,结果鼠标一卡一卡的

个人经验:在做嵌入式主机时,我建议优先选择支持EHCI或xHCI的控制器。OHCI和UHCI太老了,文档少,调试起来很痛苦。

三、设备(Device):听话的打工仔

设备在USB体系里是被动的。它不能主动发起通信,只能响应主机的请求。说白了,主机问一句,设备答一句,不问就不许说话。

每个USB设备都有一个设备描述符(Device Descriptor),里面包含了厂商ID、产品ID、设备版本等信息。主机通过枚举过程来获取这些信息。

我记得有一次调试一个自定义HID设备,枚举总是卡在第5步。后来发现是配置描述符的长度字段写错了。嗯,描述符这东西,一个字节都不能错。

设备的状态机

设备从插入到正常工作,要经历几个状态:

  1. 连接态(Attached):设备插入端口,集线器检测到信号
  2. 供电态(Powered):端口开始供电,设备上电复位
  3. 默认态(Default):设备响应默认地址0,等待主机分配地址
  4. 地址态(Address):主机分配唯一地址,设备用新地址通信
  5. 配置态(Configured):主机选择配置,设备进入工作模式

避坑指南:我曾经在设备端忘记处理复位信号,导致设备在默认态和地址态之间反复跳转。记住,任何时候收到复位信号,设备都要回到默认态。

四、集线器(Hub):USB世界的交通警察

集线器的作用是扩展端口。它负责检测下游端口的状态变化,转发主机和设备之间的数据。

集线器内部有两个关键组件:

  • 上游端口(Upstream Port):连接主机或上一级集线器
  • 下游端口(Downstream Port):连接设备或下一级集线器,通常有2-7个

集线器还有一个重要的功能——事务翻译(Transaction Translator, TT)。这个功能在USB 2.0集线器中特别关键。为什么?因为USB 2.0支持高速(480Mbps)和全速(12Mbps)两种速度,集线器需要在这两种速度之间做桥接。

集线器类型 TT数量 适用场景
单TT集线器 1个 所有低速/全速设备共享一个TT,性能较差
多TT集线器 每个端口1个 每个低速/全速设备独立TT,性能好

实战建议:如果你的系统需要同时接多个低速设备(比如键盘、鼠标、游戏手柄),我建议用多TT集线器。单TT集线器在多个低速设备同时工作时,延迟会明显增加。

五、拓扑的物理限制

USB拓扑虽然灵活,但有一些硬性限制:

  • 最大层级:包括根集线器在内,最多7层
  • 最大设备数:包括集线器在内,最多127个
  • 线缆长度:全速/低速最长5米,高速最长5米(但建议不超过3米)

为什么会有7层的限制?我个人的理解是:每一层都会引入延迟,层数太多会导致时序问题。USB 2.0的帧周期是1ms,如果层数太多,主机可能来不及在帧内完成所有事务。

小技巧:在实际布线时,我建议尽量让设备直接连到根集线器。每经过一级集线器,信号质量都会下降一点。特别是高速设备,对信号完整性要求很高。

六、总结一下

USB的系统架构其实不复杂。记住三点:

  • 主机是老大,所有通信由它发起
  • 设备是打工仔,老老实实响应请求
  • 集线器是传话筒,顺便管管端口状态

搞清楚了这三者的关系,后面讲枚举、传输、调度的时候,你就知道谁该干什么了。