科学的区分 USB-C/Thunderbolt 和各种相关协议

自 2015 年 USB-C 开始普及以来, 已经几乎一统 Android 手机, 并且大多数笔记本都拥有一个乃至更多的接口. USB 3.1 gen2 于 Kaby Lake 进入 Intel 芯片组的支持, 今年 Ice Lake 出现了 ULV 平台 PCH 原生集成的 Thunderbolt AIC.

然而目前这个协议所衍生的讨论, 包括 USB PD, Alt Mode, eGPU 和速率之类的讨论问题都不充分. 一个很简单的问题, 很多人至今都无法理解为什么 5gbps 的 USB 3.1 gen 1 居然也能传输 4K60 的 DP 视频信号, 又或是单纯的把 USB 3.0 和 USB 3.1 gen 1 的 5gbps 划等号. 今天我来具体讲一下到底是怎么一回事. 最古老的 USB 接口, 即是大家最熟的 Type-A 接口, 包含了四个引脚, 从左至右分别是:

  1. VBUS: 5V
  2. Data+
  3. Data-
  4. GND

可以看出中间两个引脚起到的是数据传输能力, 而两边则是负责供电的 5V 和地线. USB 的数据传输, 就依赖中间 2-3 组成的 差分对. 之所以说 USB 是串口, 就是因为他利用差分对抗干扰的特性, 极大的提升了可用的传输频率以提升带宽. 这就常见于外部总线的设计. 而内存作为并口线, 有着对于延迟特别敏感的线路和多达 260 根引脚, 典型的显卡显存提升带宽的方式也就是通过提升其位宽, 如当年 290X 高达 512bit 的位宽.

但是只有一个差分对意味着数据只能单向传输. USB 协议在设计的时候有着 Master(Host)-Slave 的概念, 即电脑通常是 Host, U 盘这样的外设是 Slave. 而传统 USB 协议并不能实现 Host-Host 的对等连接. 所以这种情况下 Host 起到的就是控制这组差分对传输方向的作用, 这块也叫做 BOT 协议. 这也就是为什么 USB 1.0/1.1/2.0 都被认为是单工协议. 而这也大幅度降低了 USB 传输的带宽. 就如 480Mbps 理论带宽的 USB 2.0 来算, 实际上我们都知道大概 U 盘能在 2.0 下最大跑到的速度也就 35MB/s(280Mbps). 而这里不得不提的就是对于 BOT 协议的优化, 部分 U 盘可能会带上特别的驱动去调整 BOT 的 Block Size, 从而减少相对无用的控制信号的传输量, 从而将传输速率提升到 40MB/s 以上.

而所谓的 OTG, 就是移动设备通过 Micro USB 的额外一根引脚的特殊阻抗配置从而让移动设备成为 Host, 这就是为什么需要特殊线缆才能让手机接 U 盘的原因. 此外 USB 2.0 时代也引入了 BC1.1/1.2, 这两个协议和 Apple 2.4A 协议一样, 都是在 5V 的框架下通过调整 D+D- 实现更大电流的输出请求.

后来 USB 3.0 打破了原有的半双工模式, 通过引入新的 5 根引脚实现了双向 5gbps 通信. 这五根引脚分别是 SSTX+/SSTX-/SSRX+/SSRX-/GND_DRAIN, 以通过增加两组 8b/10b 编码的高速差分对外加一根信号地提升抗干扰能力.

而 USB3.0 A 型接口通过特殊设计从而实现向下兼容 USB 2.0, 当然所谓的「USB 3.0 插入的慢变成 2.0 的隐患也由此而来」, 因为 2.0 的引脚会比 3.0 的更先接触.

另外 USB 3.0 要求 900mA 的电流承载能力, 相比 USB 2.0 时代的 500mA 有了提升. 但是对于移动设备来说「五福一安」还是很弱的, 而 2.0 时代的 BC1.2 也因为电压问题无法突破更大功率.

这里就不得不提 USB 在系统层面的驱动设计了. USB 之所以通用, 是因为其协议很大程度依赖 CPU 层面去做的主动通信而非 USB 设备发起通信. 这里举一个例子, USB HID 键盘一个广为人知的特性是只能六个按键同时按下, 而更古老的 PS/2 键盘却可以支持全键无冲. 这里的原因是 USB 算是一个轮询协议, 操作系统内核比如说集成了 USB HID 驱动, 就会定期去问「键盘, 你哪几个按键按了」,键盘只能回答「按下的六个按键」; 而 PS/2 和一些串口键盘则是当用户按下的时候主动通知系统有按键被按了, 并且这里产生的是一个硬中断. 那么这里带来的结果就是 USB 很大程度不是一个实时性的协议. 我们知道内存有严苛的时序要求, 在 USB 这里其实是不存在的. 而 USB 另外一个特性是没有 DMA 能力, 即不能像 PCIe 设备那样通过共享内存的方式和 CPU 通信, 或者是实现 PCIe 和 PCIe 设备之间的通信. 同样 Hub 之下的 USB 设备之间也是不能通信的.
然而这也为设计 USB 驱动降低了复杂度, 这就是为什么 USB 能够通过用户态库 libusb 实现诸如自己写个 python 程序黑 iPhone, 或者是用 libusb 转发本地的 USB 设备包通过套接字接口穿透到虚拟机/其他网络上的设备. 而 PCIe 若是要实现穿透则需要 CPU 的 IOMMU 单元实现所谓 vt-d 的虚拟化, 让 PCIe 设备访问 VM 的内存空间. 因为这种原因, USB 如果要输出画面, 比如说当初的 DisplayLink 协议, 就需要一种特殊闭源驱动才能工作. 这种驱动由于需要 CPU 主动去渲染(因为常见驱动无法欺骗物理显卡产生屏幕)、采集画面然后发送到设备上输出画面, 所以通常画质不佳而且 CPU 占用大. 另外就是一个充电的老大难问题, 毕竟不能提升电压. 而 QC 之类的协议也并非 USB-IF 认可. 此外就是经典的插拔问题, 已经是 MEME 级别的老大难问题. 于是 USB-C 以 Intel 为中心, 联合 Google Apple 等厂商完成了标准化. 可以看到这是 USB-C 的插头定义, 可以看到 USB-C 几乎是斜向对称, 而中间的 D- D+ 则是保留了对 USB 2.0 的兼容. 新增加的 CC/VCONN 则是为 PD 通信握手提供了支持. 而 SS 的差分对提升到了四对. 在通常的情况下有两个差分对结合 8b/10b 编码就可以实现 5gbps 双工传输, 这就是 USB 3.1 gen1 的速率. 而 USB-C 新增加的 ALT 模式, 允许两个至四个差分对用于 DP/TDMS(HDMI/DVI) 的信号传输. 而一个典型 DP 接口包含了四组差分对, 在有两组差分对+DP1.2(HBR2)的情况下就能实现 1080P120Hz 的传输, 而四组则可以满足 4K60 10bit的传输. 而 HDMI 则显得坑很多. HDMI1.4 只有三组差分对, 最高也就只能实现 4K30, 而且因为协议问题不适合做类似 DP 的单线多屏幕. 因为三组差分对的问题, 理论上做 HDMI 1.4 原生的转接头会导致无法提供足够的 USB SS 差分对. 所以实际上很多转接头采用的是利用两组 HBR2 差分对传输, 利用 MST 分成两块屏幕并通过芯片转化为 HDMI 1.4 和 VGA. 剩下还能有两组 SS 差分对用于 USB 传输. 而 3.1 gen2 引入了 128b/132b 编码, 从而将单个差分对的速度提升到了 10gbps. 然而这样带来的是明名的混乱. 很多人就以为 USB 3.1 gen1 5gbps 本质和 USB 3.0 一样, 有的人把 USB 3.1 gen 2 当作 Type—C 相关的特性. 所以 USB IF 推出了 USB 3.2 明名规范, 把 USB 3.2 Gen 1x1 当作 3.1 gen1 和 3.0 的并集, 然后引入 3.1gen1x2 实现双通道上下行; 3.1 gen2 变成 3.2gen2, 并且引入双通道实现 3.1gen2x2 实现 20gbps 双工... 但是实际上大家都抱怨这样进一步加剧了命名的混乱程度.

而这里就出现了一个问题, 由于 DP1.2 需要四组差分对才能实现 4K60 传输, 那么 USB 高速传输怎么办? 那低端的 DP 转接头确实只有 USB 2.0 了. 而高端的则有两种四路, 一种是通过将 USB 2.0 两个差分对变成 SSTX/RX, 这种思路出现在 VirtualLink 上, 即 Nvidia 的显卡上的 USB-C 接口支持这种操作; 疑似 Apple 似乎也实现了这种程度的复用. 另外一种是通过更先进的 HBR3, HBR3 相比 HBR2 速度翻倍, 这样就能实现单线双 4K 屏, Dell 的 DA300 就是这种思路. 然而 Intel 的集成显卡并不支持 DP1.3, 所以这个需要独立显卡的支持, 外加 USB-C/Thunderbolt 控制器需要支持. 同时可以注意到这种模式下 SBU 变成了音频信道, 而 USB-C 也为那些去掉了 3.5mm 耳机的手机设计了一个音频模式, 即把 USB 2.0 的引脚当作左右声道, 一个 SBU 变成麦克风, 并提供了独立的信号地线. 最后一个介绍的就是 USB 3.0 时代引入的一个调试模式. 传统的内核调试通常会依赖 CPU IRQ 上的 Serial 进行数据交互, 而现在可以通过 USB 实现 JTAG/Console 上与内核交互.

而 USB 4.0, 本质上就是 Thunderbolt. Thunderbolt 在 1/2 时代广为人知的是和 DisplayPort 的互通性; 但到了 3 时代就让人感觉到迷惑, 一个典型的例子是 Apple 发售的 TB2-TB3 转换器, 很多人以为能输出 DP 但是实际上不行. 而这个却可以接 Thunderbolt Display. 这就说明 TB 传输 DP 信号和类似 USB-C ALT 引脚复用是两个层面的技术.

Thunderbolt 另外一个特性就是可以连接 PCIe 设备. 实际上所谓的 40gbps 的理论速度是双工对等状态下的, 实际 Thunderbolt 可以按需调整两边带宽, 比如可以实现 60gbps 的 TX 和 20gbps 的 RX, 这就为像是塞入两个 DP1.2 信号带来了可能; 同样现在已经支持 DP1.4. 并且 Thunderbolt 内可以承载 USB 信号.

Luv Letter

變幻莫測之物, 未曾改變之物.

Subscribe to Luv's Shelf

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!