1. USB协议概述:从USB 1.0到USB4的演进之路
大家好,我是老张,做USB系统架构这块有十几年了。今天咱们开始聊USB协议栈,第一讲先搭个框架——把USB的来龙去脉、物理特性、拓扑结构、分层架构理清楚。这些东西看着基础,但我在项目里见过太多人因为底层概念模糊,调试时走了大弯路。
1.1 USB的发展历史:从1.0到4.0
USB这玩意儿,说白了就是想让电脑外设的插拔变得简单。1996年USB 1.0刚出来时,速度只有1.5Mbps,连个鼠标键盘都嫌慢。我记得那时候大家还在用串口和并口,插个打印机得关机重启,别提多折腾了。
真正让USB火起来的是1.1版本,12Mbps的全速模式。嗯,这个速度现在看来很寒酸,但在当时已经能跑U盘和摄像头了。我入行那会儿,正好赶上USB 2.0的普及——480Mbps的高速模式,一下子把外设带宽拉高了一个量级。
到了2008年,USB 3.0发布,5Gbps的速率,用的是新的差分信号对和双总线架构。你想想看,从480Mbps跳到5Gbps,这跨度有多大?我当年调试第一块USB 3.0板卡时,信号完整性搞得我头大,后来才发现是阻抗匹配没做好。
再往后就是USB 3.1(10Gbps)、USB 3.2(20Gbps),直到现在的USB4,最高能到40Gbps。USB4有个有意思的地方——它融合了Thunderbolt 3的协议,说白了就是USB和雷电走到一起了。
| 版本 | 发布时间 | 最高速率 | 编码方式 |
|---|---|---|---|
| USB 1.0/1.1 | 1996/1998 | 12 Mbps | NRZI |
| USB 2.0 | 2000 | 480 Mbps | NRZI + 位填充 |
| USB 3.0 | 2008 | 5 Gbps | 8b/10b |
| USB 3.1 | 2013 | 10 Gbps | 128b/132b |
| USB 3.2 | 2017 | 20 Gbps | 128b/132b |
| USB4 | 2019 | 40 Gbps | 基于Thunderbolt 3 |
1.2 USB物理层与电气特性
物理层这块,说白了就是信号怎么在线上跑。USB 2.0及以下用的是差分信号对——D+和D-,两根线拧在一起传输。为什么用差分?抗干扰能力强啊。你想想看,外界噪声同时耦合到两根线上,一减就抵消了。
USB 3.0以后就复杂了,多了SSTX+/-和SSRX+/-两组差分对,分别负责发送和接收。再加上原来的D+/D-,总共得8根线。嗯,这也是为什么USB 3.0的线比2.0粗一圈。
电压方面,VBUS是5V供电,但允许有±5%的波动。我遇到过最坑的一次,客户说设备老是掉线,查了半天发现是USB口电压掉到了4.3V——线缆太长,压降太大了。
1.3 USB拓扑结构:Host、Hub、Device
USB的拓扑结构是个树形,根节点是Host(主机),叶子节点是Device(设备),中间可以挂Hub(集线器)。为什么这么设计?说白了就是为了扩展端口数量。
一个Host最多可以挂127个设备,但实际没人这么干。我见过最夸张的也就挂了十几个,再多了带宽就不够了。Hub的作用不仅仅是分叉,它还负责转发事务、管理电源、检测设备插拔。
这里有个关键点:USB是主从架构,所有通信都由Host发起。Device只能被动响应,不能主动发数据。你想想看,如果设备能主动发,那多个设备同时说话不就乱套了?
1.4 USB协议栈分层架构
USB协议栈分四层,从上到下依次是:应用层、驱动层、总线层、物理层。每一层各司其职,上层只管调用接口,不用管底层怎么传数据。
- 应用层: 就是你的应用程序,比如读U盘、打印文档。它通过操作系统提供的API跟USB设备打交道。
- 驱动层: 包括USB核心驱动和功能驱动。核心驱动负责枚举、地址分配、管道管理;功能驱动负责具体设备类型,比如HID、Mass Storage。
- 总线层: 也叫USB控制器驱动,负责管理事务处理、调度传输、处理中断。这一层直接跟硬件寄存器打交道。
- 物理层: 就是咱们刚才说的差分信号、电气特性、连接器这些硬件实体。
我个人习惯把协议栈想象成快递系统:应用层是寄件人,驱动层是快递单,总线层是分拣中心,物理层是卡车和公路。每一层只关心自己的事,出了问题也好定位。
1.5 USB协议栈与LTSSM的关系
说到LTSSM(Link Training and Status State Machine),这是USB 3.0以后才有的东西。它负责管理USB链路的训练、电源状态切换、错误恢复等。说白了,就是让高速链路能稳定工作。
LTSSM有十几个状态,比如U0(正常工作)、U1/U2/U3(低功耗)、Rx.Detect(检测接收端)、Polling(训练)等。我调试USB 3.0设备时,最常看的就是LTSSM状态机——卡在哪个状态,基本就能判断问题出在哪。
举个例子,如果设备一直卡在Polling状态,说明链路训练没通过。这时候我会先检查信号质量,再看阻抗匹配,最后查电源纹波。嗯,十有八九是信号完整性问题。
这张图把协议栈的四层结构和LTSSM的位置画清楚了。你注意看,LTSSM横跨总线层和物理层,因为它既要管硬件信号,又要管状态机逻辑。我调试时经常需要同时看这两层的日志,才能定位问题。