USB系统架构:主机、设备与集线器的角色和拓扑
大家好,欢迎来到第二章。今天我们来聊聊USB系统的整体架构。说白了,就是搞清楚USB世界里谁说了算、谁干活、谁负责传话。
我刚入行那会儿,总觉得USB就是插个U盘这么简单。直到有一次调试一个嵌入式主机的枚举失败问题,折腾了整整三天,最后发现是集线器(Hub)的复位时序没处理好。嗯,从那以后我才真正重视起USB的拓扑结构。
一、USB的拓扑结构:树形分层
USB的拓扑结构,说白了就是一棵倒着长的树。树根是主机(Host),树枝是集线器(Hub),树叶是设备(Device)。
为什么会这样设计?我个人的理解是:USB从诞生之初就考虑到了扩展性。你想想看,一个电脑只有一个USB控制器,但你可以接几十个设备,靠的就是这种树形结构。
核心要点:USB拓扑是严格的树形结构,不允许有环路。每个USB系统中只有一个主机,最多支持127个设备(包括集线器)。
二、主机(Host):USB世界的统治者
主机是整个USB系统的核心。它负责调度所有事务、管理带宽、分配地址。我习惯把主机比作一个公司的CEO——所有决策都得经过它。
主机的内部结构其实挺复杂的,主要包括三个部分:
| 组件 | 功能 | 我踩过的坑 |
|---|---|---|
| USB主机控制器 | 硬件层面处理USB协议,负责事务传输 | 不同厂商的控制器寄存器差异很大,移植时一定要仔细看手册 |
| 根集线器 | 提供物理端口,检测设备插拔 | 我曾经忽略根集线器的端口状态轮询,导致热插拔检测失败 |
| 主机软件栈 | 驱动层、协议层、类驱动层 | 中断传输的调度优先级搞反过,结果鼠标一卡一卡的 |
个人经验:在做嵌入式主机时,我建议优先选择支持EHCI或xHCI的控制器。OHCI和UHCI太老了,文档少,调试起来很痛苦。
三、设备(Device):听话的打工仔
设备在USB体系里是被动的。它不能主动发起通信,只能响应主机的请求。说白了,主机问一句,设备答一句,不问就不许说话。
每个USB设备都有一个设备描述符(Device Descriptor),里面包含了厂商ID、产品ID、设备版本等信息。主机通过枚举过程来获取这些信息。
我记得有一次调试一个自定义HID设备,枚举总是卡在第5步。后来发现是配置描述符的长度字段写错了。嗯,描述符这东西,一个字节都不能错。
设备的状态机
设备从插入到正常工作,要经历几个状态:
- 连接态(Attached):设备插入端口,集线器检测到信号
- 供电态(Powered):端口开始供电,设备上电复位
- 默认态(Default):设备响应默认地址0,等待主机分配地址
- 地址态(Address):主机分配唯一地址,设备用新地址通信
- 配置态(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的系统架构其实不复杂。记住三点:
- 主机是老大,所有通信由它发起
- 设备是打工仔,老老实实响应请求
- 集线器是传话筒,顺便管管端口状态
搞清楚了这三者的关系,后面讲枚举、传输、调度的时候,你就知道谁该干什么了。