写在前面
各位好久不见,由于平时工作繁忙,我已经很久没有来更新博客了。这个专题我会抽空一直更新下去的,希望能给想要学习USB协议的朋友一些帮助!
1.USB协议版本演进
USB协议目前已经出到了USB4 v2.0版本,但是我建议的学习路线仍然是USB2.0—>USB3.0/3.1/3.2—>USB4。
这里简单科普一下,USB2.0和USB3.x和USB4完全可以当作3个协议来看待,虽然usb协会实现了向下兼容,但兼容的方式是非常地与众不同(goushi):
USB2.0->USB3.0
USB3.0在USB2.0的基础上增加了两对超高速差分线SSTX+/SSTX-和SSRX+/SSRX-,所有USB3.0的数据包都是走的这两对超高速差分线传输(TX+RX=一个通道=1Lane),原有的USB2.0的D+/D-仍然只传输USB2.0数据包。USB3.0将速度提升到5Gbps,物理层是标准的Serdes电路,使用8b10b编码的高速串行传输方式,在接收端再利用CDR电路将时钟和数据恢复出来。
USB3.0->USB3.1
协议层没有大的变化,主要是链路层和物理层有更新。USB3.1在USB3.0的基础上新增了10Gbps的档位,称之为Gen2,编码为128b/132b,原有的5Gbps档位仍保留,并称之为Gen1。(也就是从这个版本开始命名开始混乱)
USB3.1->USB3.2
USB3.2在USB3.1的基础上增加了双通道模式,即故技重施地增加了一组差分线从而和原来的通道组成两个通道,两个通道可以同时传输。由于Type-A物理接口没有这么多pin,双通道模式只能使用标准Type-C接口。USB协会使用USB3.2Gen1来代替命名USB3.1Gen1,使用USB3.2Gen2来代替命名USB3.1Gen2,使用USB3.2Gen1x2和USB3.2Gen2x2来表示新增的双通道模式。
(PS:由于USB协会这一屎一样的命名方式,导致很多无良商家趁虚而入,纷纷将USB3.1接口标为USB3.2接口,但他们可能根本不支持USB3.2Gen2x2(20Gbps)的速度)
USB3.2->USB4
在USB4版本上,usb协会继续发扬他们的传统艺能,把雷电3缝合进了USB里面。除此之外,顺应时代潮流在USB3.2的基础上进一步提升了物理层的速度,现在市面上能买到的设备的USB4接口速度上限基本是单通道 20Gbps,双通道 40Gbps。并且USB协会也发现了命名太混乱的问题,统一将Gen X的说法去掉,不再对消费者暴露Gen X,而是直接用速度贴标签。
由于USB协议的演进方式,以及USB接口的广泛使用,使得目前市面上仍有大量的USB2.0和USB3.0设备,并且短期内这些设备仍不可能被淘汰,所以即使是在2024年,USB2.0协议和USB3.x协议仍然具有学习的价值。
关于协议版本详情可以参考:USB WIKI百科
2.一些关于USB协议的有用Notes
1.USB拓扑结构是一个以host为根结点,hub作为延伸,peripheral作为树叶的树形结构。其中hub和peripheral都被囊括在device的范畴内。在USB2.0/USB3.x中,同一时刻整个USB拓扑结构里只能有一个host
2.USB协议中描述的IN和OUT的方向都是以host的视角定义,IN是指的数据从device流向host,OUT是指的数据从host流向device(这一点刚开始看协议特别容易混淆)
3.USB总线是host驱动模型。USB协议中描述的IN Transaction比如Bulk IN/Interrupt IN,本质其实都是host向device索取数据。每次IN传输之前,host都需要先发送ACK(USB3.x)或者IN令牌(USB2.0)给Device,Device才能根据自身的情况选择返回数据或者NAK/NRDY等握手包,Device并不能主动地给Host发送数据。
4.USB2.0 FS中将时间戳分为了帧(1ms)为单位,在HS中又将帧分为了微帧(125us)为单位,在每一帧/微帧开头会有SOF(Start of Frame)包,由host广播给device,Control、Interrupt、Isochronous 、Bulk四种传输方式按照带宽分配优先级使用这一微帧的带宽传输。
5.USB2.0握手的过程就是Host和Device进行速度协商的过程,USB2.0协议里规定HS Device默认为FS速度,然后再切换到HS速度。协议里的Chirp信号就是用于HS握手的。
6.枚举是一个软件行为,很多互联网资料里将它和链路握手、链路训练等硬件行为混淆在一起。实际上是物理层上先完成握手或者链路训练,能够正常传输数据包了才能开始枚举。枚举的本质是USB Host通过control transfer读取Device的各种描述符,并对Device进行配置。
7.USB3.x加入了链路训练,原因是速度快了过后对信号质量要求很高,底层PHY的电路复杂了很多,链路训练的对象是接收端的CDR电路和均衡电路。TX端的FEE协议中没有提到对它进行训练(和PCIE不同)。
8.USB3.x LTSSM就是管理链路训练过程以及控制链路状态的状态机,比如低功耗切换,关于LTSSM可以查看我的另一篇文章:【USB3.0协议学习】Topic2·USB3.0的LTSSM分析
9.USB免驱不是不需要驱动,而是操作系统已经内置了USB Class Driver,在枚举阶段Host读取到Devcie对应的设备类型直接加载对应驱动。比如鼠标、键盘、USB网卡、网络摄像头、打印机等等类型都在标准usb class类中定义好了,device厂商出厂会设置好vendor id和product id,windows/linux中维护了一个查找表,根据product id查找对应的设备类型和驱动。(因此每个usb接口芯片供应商都需要给usb协会交钱注册)
10.Type-C是物理接口,不是通信协议。它提供了host和device的线缆连接的物理机械结构。相比传统Type-A物理接口,Type-C除了体积小巧,还有引脚数量多、可以正反插等优势,由于有12对引脚,该接口可以满足许多通信协议的要求,比如雷电、DP等。所以USB协会增加了Type-C Alt mode,简单的说就是除了USB使用到的引脚,其他的引脚可以根据协议自行定义。其中使用最广泛的就是TypeC-DP-ALT模式,利用Type-C来传输DP信号,现在绝大部分笔记本都支持这个模式,可以直接使用type-c接口外接type-c接口的显示器,或者type-c接扩展hub将type-c接口转成标准DP接口,再接标准DP接口的外接显示器,或者有些hub带dp信号转hdmi的功能,那么可以通过这个hub外接hdmi显示器。
11.USB3.x和DP的关系:DP协议来自于Vesa组织,用于图像传输,和HDMI形成直接竞争关系,它和USB协议无关。DP协议物理层使用的也是serdes传输,8b/10b编码,和USB的物理层相似(不完全相同),所以很多厂商比如Synopsys就将USB3.1和DP的phy做在了一起,称之为combo phy(组合phy),并且将type-c模式的切换也做进去了。这样的PHY一般就有多种工作模式可以切换,可以在USB only/DP only/USB+DP之间切换。一个典型的使用场景就是笔记本的USB3.x Type-C接口外接了一个扩展坞扩展出了一个DP口+多个USB接口(Type-A or Type-C)。此时笔记本外接显示器的同时可以使用U盘、外接键盘等。如果扩展坞上的U盘、外接键盘是USB2.0,那么没有关系,他们的数据传输走的是2.0的通道和3.1无关。如果U盘、键盘是USB3.1设备,那么存在和DP抢带宽的情况,DP降速运行的带宽不足以传输4K60视频信号,所以很多USB Hub厂商干脆干掉USB3.x接口,在Hub上只留下USB2.0接口+DP视频接口。如果笔记本是雷电接口的Type-C,其工作原理和Type-C DP ALT Mode就不太一样了,雷电的物理带宽更大,雷电扩展坞基本都有3.1接口➕DP。
12.理解USB协议里的四种传输:
- bulk最常使用,该传输有协议重传机制来保证无差错地传输。一般用于U盘、SSD等
- interrupt是中断传输。interrupt in是host通过轮训的方式等时间地访问device,device有数据就上车,没数据就继续等着。这种传输方式有别于其他传统总线的slaver拉起中断,master响应中断的模式。interrupt传输一般用于鼠标、键盘等,带有协议重传机制
- isochronous是同步传输,用于视频、音频如网络摄像头等、要求实时性很高,对错误不敏感,因此也没有协议重传机制
- control是控制传输,是所有device都必须支持的传输,枚举阶段会用到
13.关于重传(这个非常容易混淆!):
USB3.x有两种重传机制,一种是协议重传,又称之为端到端重传,通过判断Payload的CRC32是否正确来决定要不要重传。需要重传则将ACK的Retry bit设置为1。这个过程一般是控制器的MAC自动完成的。另一种是链路级别的重传,这个机制是USB3.x才加入的功能,目的是保证Header是正确的。USB3.x的包结构是Header+Payload的方式,Header中包含了目标设备的地址、端点等信息,Header中也有CRC,如果该CRC出错,直接在链路层就重传了,都到不了协议层解析这一步。
3.关于USB控制器
4.关于xhci接口
未完待续ing