用协议分析仪直观理解USB传输的核心概念
本文内容是基于 USB 2.0 。在讲述USB传输前,有必要先了解下USB的几个基本概念。
几个基本概念
本文内容是基于USB 2.0。在讲述USB传输前,有必要先了解下USB的几个基本概念。
USB主机(Host)
每一次传输都是主机发起的,不管是发送数据还是接收数据。
USB设备(Device)
设备会响应主机的请求,每个设备的内部固件中都会存有设备描述符来表明设备的基本信息,比如厂家ID、产品ID、配置数目、接口和端点信息等。
USB枚举
主机识别到有设备接入后,会发起枚举,读取设备的描述符信息后配置设备。
USB配置(Configuration)
一个设备有一个或者多个配置,主机可以通知设备选用哪个配置,但一个设备当前只能有一种生效的配置。
USB接口(Interface)
简单地说,一个接口表示一种功能,比如说这个设备既有虚拟串口功能,也有虚拟网口功能,可能还有大容量存储(U盘)功能。当然一个功能并不都是严格对应一个接口,有些功能可能需要两个以上的接口,这里为了简化描述,暂不深究。
USB端点(Endpoint)
端点简称EP,一个接口配置有一个或者多个端点。端点是主机和设备之间通信的部件,数据是从某个端点发送出去或者接收进来的。端点是有方向的,方向是基于主机侧来定义的,OUT方向是指从主机传出,IN是指传入主机。
USB传输、USB事务与USB包
USB传输由主机发起,任何时刻整个USB体系内仅允许一个数据包在传输。
USB传输有4种类型,控制传输、中断传输、批量传输和同步传输,每种传输有不同的适用场景。
传输由事务构成,事务类型有SETUP事务、DATA IN事务、DATA OUT事务,SETUP事务主要往设备发送控制命令,DATA IN事务主要从设备读取数据,DATA OUT事务主要往设备发送数据。每个事务采用“令牌包”-“数据包”-“握手包”的三段式传输机制(同步传输没有握手包)。
包是USB总线上数据传输的最小单位,其中的PID字段指明了包的类型。令牌包有IN/OUT/SETUP/SOF四种。前三种“令牌包”都含有指定数据包去向或者来源的设备地址和端点,从而保证了只有一个设备对总线上的数据包/令牌包作出响应。“握手包”表示了传输的成功与否。“数据包”承载实际数据。
USB传输、事务、包是从不同层次上去说明一次数据交互的三个概念。一次传输包含多个事务,一个事务包含多个包。直接看一下USB协议分析仪的抓包示例,可能更清楚一些:
控制传输
控制传输是一种可靠的传输,所有USB设备都必须支持的一种传输方式,主机在枚举设备的过程中就是通过端点0进行控制传输。一次控制传输可分为三个阶段:
第一阶段为建立阶段,通过SETUP事务指定了此次控制传输的请求类型;
第二阶段为数据阶段,也有些请求没有数据阶段;
第三阶段为状态阶段,通过一次IN/OUT事务表明请求是否成功完成。
下图是通过USB协议分析仪抓取U盘的某次控制传输,对应的是枚举阶段获取设备描述符:
Control SETUP事务展开图:
Control IN事务展开图:
Control OUT事务展开图:
中断传输
中断传输是一种可靠的传输,主机通过固定的间隔对中断端点进行查询,如果设备有数据则往主机回送数据,否则回送NAK。同样的,如果主机要发送数据,设备没有准备好接收,也会回送NAK。
下图是通过USB协议分析仪抓取的USB camera的某次中断传输(control数据,非图像数据):
Interrupt IN事务展开图:
批量传输
批量传输是一种可靠的传输,但延迟没有保证,它尽量利用可以利用的带宽来完成传输,适合数据量比较大的传输。高速批量端点的最大包长度为 512。
对于批量输出,如果设备收到的数据包正确,并有足够的空间保存数据,那么设备会返回ACK握手包或NYET握手包(只有高速模式才有NYET握手包,它表示本次数据接收成功,但是没有能力接收下一次传输)。如果设备收到的数据包正确,但是没有足够的空间保存数据:设备返回NAK握手包。主机收到NAK,延时一段时间后,再重新进行批量输出。
对于批量输入,如果设备没有准备好数据,则回送NAK,否则回送数据包。
批量传输由一个或者多个IN / OUT事务组成,下图是抓取的U盘某次批量传输:
Bulk OUT事务展开图:
同步传输
同步传输是一种实时的、不可靠的传输,不支持错误重发机制。高速同步端点的最大包长度为1024。
常规情况下,一个微帧内仅允许一次同步事务传输;但是,高速高带宽端点最多可以在一个微帧内进行三次同步事务传输,传输高达3072字节的数据,这个特性对数据量较大的设备比如USB camera的性能表现有很重要的影响。
下图是抓取的USB Camera的某次同步传输:
Isoch IN事务展开图:
USB包
USB包由SOP(包起始域)、SYNC(同步域)、Packet Content(包内容)、EOP(包结束域)四部分组成,其中SOP、SYNC、EOP为所有包共有的域,Packet Content由PID、地址、帧号、数据、CRC组成,注意这只是一个通用构成,不同类型的包,Packet Content的构成会有一些区别。
USB包按大类分为令牌包、数据包、握手包和帧首包,每个大类里面还有具体类型,比如令牌类有OUT/IN/SETUP等,数据类有DATA0/DATA1等,包的类型由Packet Content中的PID指定。这里不罗列所有类型的包,只抓取几个有代表性的包来看看。
下图是抓取的某个SETUP包的Packet Content:
下图是抓取的某个SOF包的Packet Content:
下图是抓取的某个DATA1包的Packet Content:
USB帧与微帧
USB帧与微帧属于USB传输中时间基准的概念。低速和全速下每个帧时长为1ms,高速下每个帧又分为8个微帧,每个微帧时长为125us。USB 2.0 规范上有详细描述,如下图所示。
在每一个帧(微帧)的起始点,会发送一个SOF包(帧起始包),帧起始包之后可以是输出(OUT)、输入(IN)、建立(SETUP)等令牌包,或者没有包。数据的传输在每个帧(微帧)内进行,如果没有数据要传输,则SOF包发送完毕之后,总线进入空闲状态。