第一章 USB协议概述:从诞生到Type-C的演进之路
大家好,我是你们这门课的老朋友。做嵌入式这些年,我调试过的USB设备少说也有上百种了。从最早的USB 1.1鼠标,到如今动不动就40Gbps的雷电3硬盘盒,USB协议几乎贯穿了我整个职业生涯。
这一章,咱们不急着写代码。先把USB的来龙去脉理清楚。你想想看,一个1996年诞生的接口标准,能活到现在还越来越强,背后一定有它的道理。
1.1 USB的发展历史:为什么会有USB?
90年代初,电脑外设的接口那叫一个乱。串口、并口、PS/2、SCSI……每个接口都有自己的物理规格和协议。插个打印机要关机,接个鼠标要分清圆口还是方口。我当时给客户做一套工控系统,光整理线缆就花了一整天。
1994年,Intel、微软、IBM等七家公司坐到了一起。他们想做一个通用的、支持热插拔的、能自动配置的接口。这就是USB——Universal Serial Bus,通用串行总线。
USB的核心设计目标:
- 易用性:热插拔,即插即用,不用关机
- 扩展性:一个主机最多支持127个设备
- 标准化:统一接口,告别各种专用线缆
- 低成本:适合大规模普及
1996年,USB 1.0正式发布。速度只有1.5Mbps(低速)和12Mbps(全速)。说实话,当时这个速度并不惊艳。但它的热插拔和自动配置能力,让用户和开发者都眼前一亮。
1.2 USB 2.0 / 3.x / 4.0 标准演进
USB的发展史,其实就是一部速度与功能的进化史。我把它整理成了一张表,方便你对照着看。
| 标准版本 | 发布年份 | 理论带宽 | 编码方式 | 关键特性 |
|---|---|---|---|---|
| USB 1.0/1.1 | 1996/1998 | 1.5 Mbps / 12 Mbps | NRZI | 热插拔、总线供电 |
| USB 2.0 | 2000 | 480 Mbps | NRZI | 微帧、高速模式、OTG |
| USB 3.2 Gen 1 | 2013 | 5 Gbps | 8b/10b | 双总线架构、全双工 |
| USB 3.2 Gen 2 | 2013 | 10 Gbps | 128b/132b | SuperSpeed+、Type-C |
| USB 3.2 Gen 2x2 | 2017 | 20 Gbps | 128b/132b | 双通道、Type-C独占 |
| USB4 Gen 3x2 | 2019 | 40 Gbps | 128b/132b | 基于Thunderbolt 3、隧道协议 |
| USB4 2.0 | 2022 | 80 Gbps | PAM3 | 非对称模式、新物理层 |
这里有几个关键节点,我单独拎出来说说。
USB 2.0:真正的普及者
2000年发布的USB 2.0,把速度拉到了480Mbps。虽然实际有效吞吐大概在35-40MB/s,但已经足够满足当时的U盘、移动硬盘和摄像头了。我记得2003年给一家公司做U盘固件,用的就是NXP的ISP1161控制器。那时候调试USB 2.0的微帧调度,一个帧1ms,拆成8个微帧,每个125μs。稍微算错一点时间,设备就掉线了。
避坑指南:USB 2.0的高速模式(480Mbps)并不是所有设备都能跑满。我曾经遇到过一批U盘,在Windows下读写正常,但在Linux下只能跑全速(12Mbps)。最后发现是设备描述符里的bcdUSB字段写错了,系统没识别出它支持高速模式。这个坑,后来我在课程里反复强调。
USB 3.x:双总线架构的革命
USB 3.0最大的变化,是引入了独立的SuperSpeed总线。原来的USB 2.0那四根线(VBUS、D+、D-、GND)保留不动,额外增加了五根线(SSTX+、SSTX-、SSRX+、SSRX-、GND)。
这意味着什么?USB 3.0设备内部其实有两套独立的收发器。一套跑USB 2.0,一套跑SuperSpeed。两者可以同时工作,互不干扰。我刚开始做USB 3.0固件时,总觉得这设计有点浪费。后来发现,这种向后兼容的思路,恰恰是USB能活到今天的关键。
USB4:融合与隧道
USB4直接基于Intel的Thunderbolt 3协议。它不再只是传输数据,而是把PCIe、DisplayPort、USB 3.2全部封装成隧道,在一条物理链路上跑。说白了,USB4就是一条高速公路,上面可以同时跑数据、视频和总线事务。
我个人觉得,USB4的固件复杂度比之前高了不止一个量级。因为你要同时管理多个协议隧道,还要做带宽分配和QoS。后面我们会专门用两章来拆解USB4的隧道机制。
1.3 USB Type-C与PD协议简介
Type-C接口的出现,解决了USB历史上最大的痛点——插不准。正反随便插,24个引脚,支持最高240W的充电功率。我当年第一次拿到Type-C的样机时,第一反应是:这玩意儿引脚间距这么小,焊接起来不得要命?后来发现,Type-C的CC(Configuration Channel)引脚才是真正的灵魂。
Type-C的核心:CC逻辑
Type-C的CC引脚负责三件事:
- 检测插入方向:通过CC1/CC2上的下拉电阻,判断正反插
- 协商供电能力:通过CC线上的电压,确定Source和Sink的角色
- 发现替代模式:比如DP Alt Mode、Thunderbolt Alt Mode
我建议你在做Type-C固件时,先把CC逻辑吃透。因为很多诡异的兼容性问题,最后都出在CC的时序上。比如,有些充电器在CC线上加了过大的电容,导致检测时间变长,设备误判为无连接。
USB PD:不止是快充
USB Power Delivery(PD)协议,很多人以为它只是用来快充的。其实PD能干的事多着呢:
- 电压协商:从5V到48V,步进20mV
- 电流协商:最高5A(配合EPR可达240W)
- 角色互换:Source和Sink可以在线切换
- 数据角色交换:DFP和UFP也能动态改变
我记得有一次做车载充电器,客户要求支持PD 3.0 PPS(可编程电源)。PPS允许以20mV为步进调整电压,用来给手机电池做恒压恒流充电。调试时发现,手机端每次请求电压变化,我们的PD控制器都会产生一个短暂的电压过冲。后来在固件里加了软启动和电压斜坡,才算搞定。
注意:PD协议是基于Type-C的CC线进行通信的,物理层用的是BMC编码。PD消息有严格的超时要求——SenderResponseTimer是24-30ms。如果你在固件里处理其他中断导致PD响应超时,设备会被认为不兼容。这个坑,我踩过不止一次。
1.4 本章知识体系总览
下面这张图,把USB协议栈的层次结构和本章涉及的核心概念串了起来。你可以把它当作整个课程的地图。
这张图从下往上,展示了USB协议栈的五个层次。物理层负责电气信号和连接检测;协议层处理包结构和事务;传输层管理四种传输类型;设备层处理枚举和类协议;功能层就是我们固件工程师的主战场。
嗯,第一章的内容就到这里。USB的历史和演进,说白了就是一部「既要兼容老设备,又要跑出新速度」的妥协史。后面的章节,我们会一层一层地往下拆,从枚举流程到描述符,从传输类型到性能调优。准备好了吗?