上一篇《骁龙820A汽车与智能设备间进行USB音频分享方案介绍》仅仅是方案的概要描述,接下来会将涉及到的技术关键细节作进一步的详细分析,这一篇是涉及到的USB协议篇。
一、USB带宽分析
USB是通用串行总线的意思,本质上并不是专门用来传输音频数据的。它是主从模式的总线,Host控制器决定它下面所有设备一切事务的发送/接收时机。全速下,Host每1ms±500μs生成一个“帧” (frame)。高速下,每125us±0.0625μs生成一个“帧”[2]。一个“帧”以SOF包打头,包含发送给同一个Host控制器下的不同设备 的若干个USB数据包。因此同一个控制器下的USB设备带宽共享,这里引用上一篇《骁龙820A汽车与智能设备间进行USB音频分享方案介绍》中的图例:
在上图中,在同一个USB控制器上的全速设备(FullSpeed/FS)、低速设备(LowSpeed/LS)设备之间共享带宽。高速设备(HighSpeed /HS)之间共享带宽,不与全速/低速设备共享。
这种共享带宽,在下行中是这样实现的:Host设备发给 高速设备 H1的数据包,高速设备H2同样会收到相同的数据包,但是因为接收地址与自身地址不符,H2设备会无视该数据包。同样的,Host发给F1全速设备的数据 包,F2全速设备和L1/L2慢速设备也会收到同样的包,但是会将其无视。上行带宽共享则是由主机控制:除非主机在“帧”中发送了IN包告诉这个设备准许发送数据,否则设备不允许发送数据。这样就避免了冲突产生。
二、USB传输类型和特点
USB有四种传输通道类型(Endpoint):控制(Control)、中断(Interrupt)、批量(Bulk)、同步(Isochronous)。
Control用于USB总线控制等(所有设备都有),Interrupt多用于鼠标键盘的数据传输(其实在USB令牌轮询的特性下这是个伪Interrupt),Bulk多用于U盘数据传输。
前三种类型都有重传,各有特点这里略过。但USB音频类(USB Audio Class,简称UAC)采用的音频数据传输是第四种端口,也就是Isochronous,拥有错误检测机制,但是没有重传。
为何没有重传呢。
一是音频/视频是很讲究“实时性”的,否则会音画不同步,带来的用户体验就会很差。因此音频/视频设备本质上都需要与主机同步,重传会打乱同步。
二是同步(Isochronous)类型因为要求低延迟,不像别的传输类型有握手过程,同一个"传输端口"内数据包是单向移动的(要么入要么出),Host不会给一个OUT方向的同步传输通道发送IN包,没有办法引入重传机制(发生错误时无法通知主机)。
另外还有一点,为了“同步”,每个“帧”中的每个同步(Isochronous)通道只会传送一次数据。
这里有人要问了 用一个IN和一个OUT的Isochronous通道不就可以解决错误处理了?
事实上,不可能。Host在一个Frame中轮询各个Endpoint的顺序是不可知的,很可能Host在一个Frame中先轮询了你的IN通道,但此时Host还没给你的OUT通道传送数据。这样就产生了:数据还没发送 怎么能确认数据收到了呢。
由于USB自身抗干扰特性(双绞线/屏蔽层)使得正常/正确使用的情况下,产生错误的概率非常非常低。真产生错误了,设备因为CRC校验失败,会将错误的USB数据包丢弃,从而导致导致短暂静音/爆音而已,所以对于没有重传机制不必过分担忧
上述就是和USB音频传输相关的一些USB协议基础知识,如有兴趣,可深入的研究USB完整协议。