目录
一、概述
标准描述符有:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符
设备描述符:唯一,决定该设备有几种配置
配置描述符:每种配置都有一个配置描述符,每个配置描述符中定义了该配置里有多少个接口
接口描述符:每个接口都有一个接口描述符,接口描述符中定义了该接口有多少个端点
端点描述符:每个端点都有一个端点描述符,端点描述符定义了端点的大小、类型等。
如果有类特殊描述符,它跟在相应的接口描述符之后。
控制传输(USB的一种传输模式)(在设备的枚举过程中都是使用控制传输)有三个过程:建立过程、可选的数据过程、状态过程
USB总线上传输数据是以包为基本单位的
其中PID是用来标识一个包的类型的,它总共有8位,其中USB协议使用的只有4位(0-3),另外4位是0-3的取反,用来校验PID,它分为4类:令牌包、数据包、握手包、特殊包
二、令牌包
令牌包有4种,分别是:
输出(OUT):用来通知设备将要输出一个数据包
输入(IN):用来通知设备返回一个数据包
建立(SETUP):只用在控制传输中,它跟输出令牌包的作用一样,也是通知设备将要输出一个数据包,两者的区别在于:SETUP令牌包只使用DATA0数据包,且只能发到设备的控制端点,并且设备必须要接收,而OUT令牌包没有这些限制
帧起始(SOF Start Of Frame):在每帧(或微帧)开始发送,它以广播的形式发送,所有USB全速设备和高速设备都可以接收到SOF包。
在4个令牌包中,只有SOF令牌包之后不跟随数据传输,其他的都有数据传输。
每个令牌包,最后都有一个CRC5的校验,它只校验PID之后的数据,不包括PID本身,因为PID本身已经有4个取反的位进行校验了。
三、数据包
数据包就是用来传输数据的。在USB1.1中,只有两种数据包:DATA0包和DATA1包。在USB2.0中又增加了DATA2和MDATA包,主要用在高速分裂事务和高速高带宽同步传输中。
之所以有不同类型的数据包,是用在当握手包出错时纠错。
四、握手包
握手包用来表示一个传输是否被对方确认。握手包只有同步域、PID和EOP,是最简单的一种数据包。其有以下四种:
ACK:表示正确接收数据,并且有足够空间来容纳数据。主机和设备都可以用
NAK:表示没有数据需要返回,或者数据正确接收但是没有足够的空间来容纳它们。当主机收到NAK时,知道设备还未准备好,主机会在以后合适的时机进行重新传输。设备可以用
STALL:表示设备无法执行这个请求,或者端点已经被挂起了,它表示一种错误的状态。设备返回STALL后,需要主机进行干预才能解除这种STALL状态。设备可以用
NYET:只在USB2.0的高速设备输出事务中使用,它表示设备本次数据成功接收,但是没有足够的空间来接收下一次数据。主机在下一次输出数据时,将先使用PING令牌包来试探设备是否有空间接收下一次数据,以避免不必要的带宽浪费。设备可以用
需要注意的是,返回NAK并不表示数据出错,只是说明设备暂时没有数据传输或者暂时没有能力接收数据。当USB主机或者设备检测到数据出错时(如CRC校验错、PID校验错、位填充错等),将什么都不返回。这时等待接收握手包的一方就会收不到握手包从而等待超时。
五、特殊包
特殊包是一些在特殊场合使用的包。总共有4种:
PRE:通知集线器打开其低速端口的一种前导包,PRE只使用在全速模式中。
ERR:在分裂事务中表示错误使用
SPLIT:是高速事务分裂令牌包,通知集线器将高速数据包转化为全速或者低速数据包发送给其下面的端口
PING:PING令牌包与OUT令牌包具有一样的结构,但是PING令牌包后并不发送数据,而是等待设备返回ACK或者NAK,以判断设备是否能够传送数据
六、如何处理数据包
一般的USB接口芯片会完成如CRC校验、位填充、PID识别、数据包切换、握手等协议的处理
收到输入请求时,如果有数据需要发送,则发送数据,并等待接收ACK。只有当数据成功发送出去(即接收到应答信号ACK)之后,它才设置标志,表示数据已成功发送,如果无数据需要发送,则它自动返回NAK。
七、什么是USB事务
虽然USB定义了数据在总线上传输的基本单位是包,但是我们还不能随意地使用包来传输数据,必须按照一定的关系把这些不同的包组织成事务才能传输数据。事务通常由两个或者三个包组成:令牌包、数据包、握手包
八、USB的四种传输类型
USB协议规定了4种传输类型:批量传输、等时传输(同步传输)、中断传输、控制传输。其中,批量传输、等时传输、中断传输每传输一次数据都是一个事务,控制传输包括三个过程,其中建立过程、状态过程分别是一个事务,数据过程可能包含多个事务。
1、批量传输
批量传输使用批量事务传输数据。分为三个阶段:令牌包阶段、数据包阶段、握手包阶段。
批量传输没有规定数据包中数据的意义和结构,具体的数据结构要由设备自己定义。
批量传输通常用在数据量大、对数据的实时性要求不高的场合,例如USB打印机、扫描仪、大容量存储设备等。
2、中断传输
中断传输是一种保证查询频率的传输。中断端点在端点描述符中要报告它的查询间隔,主机会保证在小于这个时间间隔的范围内安排一次传输。
中断传输通常用在数据量不大,但是对时间要求较严格的设备中,例如人机接口设备(HID)设备中的鼠标、键盘、轨迹球等。
3、等时传输(同步传输)
等时传输(同步传输)用在数据量大、对实时性要求高的场合,例如音频设备、视频设备等,这些设备对数据延迟很敏感。
等时传输不保证数据百分百正确,当数据错误时,并不进行重传操作,因此等时传输也就没有应答包,数据是否正确,可以由数据包的CRC校验来确认。
4、控制传输
控制传输分为三个过程:建立过程、可选的数据过程、状态过程
控制传输之所以复杂,是因为要保证数据传输过程中数据的完整性,如枚举。
九、端点类型与传输类型的关系
一个具体的端点,只能工作在一种传输模式下。通常,把工作在什么模式下的端点,就叫做什么端点,如控制端点、批量端点等。
端点0是每个USB设备都必须具备的默认控制端点,它一上电就存在并可用。设备的各种描述符以及主机发送的一些命令,都是通过端点0传输的。其他端点是可选的,需要根据具体的设备来决定。非0端点只有在Set Config之后才能使用。