2. 事务翻译器(TT)基础
2.1 TT 在 USB 2.0 Hub 中的位置与作用
USB 2.0 Hub 是 USB 拓扑结构中的关键节点,负责将主机的一个上行端口扩展为多个下行端口。当全速(Full-Speed, 12 Mbps)或低速(Low-Speed, 1.5 Mbps)设备连接到 USB 2.0 Hub 时,Hub 必须解决高速(High-Speed, 480 Mbps)总线与全速/低速设备之间的速率鸿沟。这一任务由 事务翻译器(Transaction Translator, TT) 完成。
TT 在 Hub 中的位置如下图所示:
TT 的核心作用可归纳为以下三点:
| 作用维度 | 说明 |
|---|---|
| 速率适配 | 将高速总线上的 480 Mbps 微帧(125 µs)转换为全速/低速设备可理解的帧(1 ms)或低频信号。 |
| 协议转换 | 将高速 Split Transaction(拆分事务)拆分为全速/低速的完整事务(Setup/IN/OUT/Handshake)。 |
| 缓冲管理 | 在 TT 内部使用 FIFO 暂存数据,解决高速与全速/低速之间的瞬时带宽差异。 |
关键概念:TT 不是简单的速率降频器,而是一个完整的协议代理。它代表全速/低速设备与主机进行高速通信,同时向下行端口呈现标准的全速/低速信号时序。
2.2 全速/低速事务与高速事务的转换机制
USB 2.0 规范定义了 拆分事务(Split Transaction) 协议来实现速率转换。主机在高速总线上发起一个拆分事务,TT 将其拆分为两个阶段:开始拆分(SSPLIT) 和 完成拆分(CSPLIT)。
转换流程如下图所示:
转换机制涉及三个关键时序参数:
| 参数 | 高速侧 | 全速/低速侧 | TT 处理方式 |
|---|---|---|---|
| 帧周期 | 125 µs(微帧) | 1 ms(帧) | TT 将 8 个微帧映射到 1 个全速帧 |
| 数据包大小 | 最大 512 字节(Bulk) | 最大 64 字节(全速 Bulk) | TT 自动分片/重组 |
| 握手延迟 | 立即响应 | 最长 16 位时间 | TT 缓冲握手状态,延迟返回 |
实践要点:TT 的 FIFO 深度直接影响全速设备的吞吐量。若 FIFO 过小,高速总线上的 CSPLIT 轮询间隔会变长,导致全速设备实际带宽下降。建议在 Hub 选型时关注 TT 的 FIFO 大小(通常为 64~256 字节)。
2.3 TT 的两种实现模式
USB 2.0 Hub 规范允许两种 TT 实现方式:
- 单 TT(Single TT):所有下行端口共享一个 TT 实例。适用于端口数较少(≤4)的 Hub,成本低,但全速/低速设备之间会竞争 TT 资源。
- 多 TT(Multiple TT, MTT):每个下行端口拥有独立的 TT 实例。适用于端口数较多(≥4)的 Hub,每个全速/低速设备获得独立的转换通道,性能更优。
两种模式的对比:
| 特性 | 单 TT(STT) | 多 TT(MTT) |
|---|---|---|
| TT 实例数 | 1 个 | 每个下行端口 1 个 |
| 资源竞争 | 所有全速/低速设备共享 | 端口间完全隔离 |
| 最大全速带宽 | 受限于单个 TT 的处理能力 | 每个端口独立达到全速带宽 |
| 典型应用 | 低成本 Hub、嵌入式 Hub | 高性能 Hub、扩展坞 |
性能陷阱:在单 TT Hub 上同时连接多个全速摄像头或音频设备时,TT 可能成为瓶颈,导致丢帧或同步失败。此时应优先使用多 TT Hub,或将部分设备迁移到高速端口。
2.4 TT 与 USB 2.0 协议栈的交互
从软件角度看,TT 对主机驱动是透明的。主机通过 Hub 类请求 配置 TT 的行为:
- Set Port Feature(PORT_RESET):复位下行端口,TT 重新初始化。
- Set Port Feature(PORT_SUSPEND):暂停下行端口,TT 停止转换。
- Get Port Status:读取端口状态,TT 返回当前转换状态。
TT 内部维护一个 事务状态机,用于跟踪每个端口的拆分事务进度:
TT 事务状态机(简化)
┌─────────────┐
│ IDLE │ ← 等待 SSPLIT
└──────┬──────┘
│ 收到 SSPLIT
▼
┌─────────────┐
│ SSPLIT_RCVD │ → 在全速/低速总线上发起事务
└──────┬──────┘
│ 事务完成
▼
┌─────────────┐
│ DATA_READY │ → 数据存入 FIFO,等待 CSPLIT
└──────┬──────┘
│ 收到 CSPLIT
▼
┌─────────────┐
│ CSPLIT_DONE │ → 返回数据/握手,回到 IDLE
└─────────────┘