USB外部总线

USB总线

258aea76-4c17-420c-8d6c-858509c34a04

df311860-26cc-490b-ae44-a6b4948cf186

显卡等高速设备是十分适合通过PCI/PCIe连入计算机的。但对于键盘、鼠标等设备而言,如果每个设备都占用1个PCI/PCIe的“席位”,那么代价就会较昂贵。于是IBM、Intel、微软等公司联手设计了一种将低速设备连入计算机的方案,于1998年正式发布,称为通用串行总线(USB)。USB设备无需复杂的跳线和插槽、安装设备无需重启,单机可接入127个设备(采用7位的设备地址),设备直接由数据线供电。USB经过多年的版本迭代,从USB1.0时的1.5Mbps带宽发展到目前USB3.2 Gen2的10Gbps带宽。

USB由接入系统总线(PCI/PCIe)的USB根集线器实现,根集线器可接入设备或扩展集线器,扩展集线器可提供更多接口用于接入设备,故其拓扑结构类似于以根集线器为根的树结构,具体如上图所示。

USB电缆包含4个导线,1个地线,1个5V电源,2个数据线。USB作为串行总线与PCIe总线有些共同点,比如USB电缆中的2个数据线实际上是1对差分信号线(类似于PCIe中的1个信道)。USB和PCIe一样使用了编码和时钟恢复技术,USB使用的编码称为NRZI编码,其编码规则为输入比特为0时电平翻转,为1时电平不翻转。并且为了能够有足够多的电平变化来实现时钟恢复,NRZI编码要求待传输数据中如果有连续7个1,则发送前会在第6个1后追加一个0,保证信号出现翻转。另外USB能和PCIe一样提供类似“逻辑信道”的能力,即每个设备有多个端点,每个端点可以看作是一个“逻辑设备”。

USB设备在接入计算机时,根集线器会检测到并发出中断信号给操作系统,操作系统会查询识别这个设备,得到其所需带宽,如操作系统判断还有足够剩余带宽用于接入该设备,就会赋予其唯一的7位设备地址(1-127),并将这个地址和一些其他配置信息存入设备自己的寄存器中。USB设备间通信时,必须要经过主机,而不会直接互相通信。

 

USB协议栈

7580a36e-336b-456f-a2e5-245c2f61dc65

 

一、域

域是研究数据的最小单位,可分为如下7种:

同步域(SYNC):八位,值固定为00000001,用于本地时钟与输入同步;

标识域(PID):4位标识符+4位标识符反码,表明包的类型和格式;

地址域(ADDR):7位,地址0000000为零地址,是设备第一次连接到主机时,被主机配置、枚举前的默认地址,零地址以外的地址就是被主机配置后的设备地址,刚好是1-127,即127个设备;

端点域(ENDP):4位,由此可知一个USB设备有的端点数量最大为16个;

帧号域(FRAM):11位,每个帧都有特定的帧号,帧号域最大容量0x800,对同步传输有重要意义;

数据域(DATA):0~1023字节,在不同传输类型中,数据域长度不相同,但必须为整数个字节;

校验域(CRC):对令牌包和数据包中的非PID域进行CRC校验;

 

二、包

包由多个域构成,共如下4类(每类又可进一步分为好多种,共十几种):

令牌包:可分为输入包IN、输出包OUT、设置包SETUP和帧起始包SOF,注意这里的输入/输出包是用于设置输入/输出命令的,而不是用于存放数据本身;

数据包:分DATA0和DATA1两种。当一次发送的数据长度大于相应端点的容量时,会把数据拆成多个包,分批交替发送,即前一个数据包是DATA0,那下一个就是DATA1。但也有例外,比如同步传输的所有数据包都是DATA0。格式SYNC+PID+0~1023字节+CRC16

握手包:结构最简单的包,格式SYNC+PID

特殊包:PRE等;

 

三、事务

事务由多个包构成。事务按顺序包含令牌包阶段数据包阶段握手包阶段。事务有如下3种:

IN事务

令牌包阶段:主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据。

数据包阶段:分为如下3种情况:

1) 设备端点正常,设备往入主机里面发出数据包(DATA0与DATA1交替);

2) 设备正在忙,无法往主机发出数据包就发送无效包NAK,事务提前结束,到下一个IN事务才继续;

3) 相应设备端点被禁止,发送错误包STALL,事务提前结束,总线进入空闲状态;

握手包阶段:主机正确接收到数据之后就会向设备发送ACK包;

OUT事务

令牌包阶段:主机发送一个PID为OUT的输出包给设备,通知设备要接收数据。

数据包阶段:主机向设备发送数据包(DATA0与DATA1交替);

握手包阶段:分为如下3种情况:

1) 设备端点接收正确,返回ACK,通知主机可发送新数据,如数据包CRC错误,将不返回握手信息;

2) 设备正在忙,无法接收主机发出数据包就发送NAK无效包,通知主机再次发送数据;

3) 相应设备端点被禁止,发送错误包STALL包,事务提前结束,总线直接进入空闲状态;

SETUP事务

令牌包阶段:主机发送一个PID为SETUP的输出包给设备,通知设备要接收数据;

数据包阶段:主机向设备发送数据包,这里只有一个固定8字节的DATA0包,是标准的USB设备请求命令;

握手包阶段:设备返回ACK,此后总线进入空闲状态,并准备下个传输(SETUP事务后通常是一个IN或OUT事务构成的传输);

 

四、传输

传输由多个事务组成。有如下的4种类型,其中同步传输最简单,控制传输最重要和复杂。

中断传输:适用于数据量小,不连续,对实时性要求高的场合,比如USB键盘。由于USB不支持中断,中断传输实际是主机定时轮询设备检查是否有待传输数据,比如USB键盘的每次中断传输为1个IN事务,主机轮询的发送IN令牌(发起IN事务)给键盘,键盘有数据返回ACK,无数据返回NAK或STALL。

批量传输:由多个IN或OUT事务组成,批量传输主要是利用USB总线的空闲带宽进行数据传输的,适合于数据量大,而对时间和传输速率要求不高的场合,只有全速与高速设备,才支持批量传输。通常打印机、扫描仪、USB硬盘、等设备都使用批量传输模式。

同步传输:这种传输是四大传输中唯一不可靠的传输方式,但是好处就是可以保证带宽,并且没有延迟,而且因为是不可靠的传输,所以没有握手包,也不支持 PID 翻转,主机在安排这些传输事务时,同步传输拥有最高的优先级。这种传输用于摄像头、USB音响等,因为它们对实时性要求比较高,但可以容忍错误(摄像头偶尔出现了一帧错误画面,下一帧画面马上就会恢复)。

控制传输:一种可靠的双向传输,所有USB设备必须支持的传输,其一般发生在端点0,发生在USB的枚举、配置(也可能进行其他数据传输)等阶段。当设备插入主机后,主机通过端点0进行控制传输,通过一系列的数据交互,主机可以了解设备有多少个接口,有多少可用的端点等各种设备信息。设备能否被主机正确识别,取决于控制传输能否正常进行。

 

五、帧

帧是以时间为主线的概念,全速USB传输中1帧为1ms,高速USB传输中1帧为0.125ms。一个帧可包含多个事务,而事务是不允许跨帧的(传输包含多个事务是可以跨帧的)。帧可以起到一个所有USB设备的基准时间的作用,因为每帧除了包含事务外,每帧还会在最开始加入一个特殊的令牌包SOF,为帧起始的标识,这个SOF包是由主机USB根集线器以广播的形式发出给每个设备的。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部