USB协议
USB协议中多个域组成包多个包组成事务多个事务组成不同类型的传输。包是USB系统中信息传输的基本单元不能被打断和干扰包只能在帧内传输。若干包组成一个事务传输一次事务传输也不能打断属于一次事务传输的几个包必须连续不能跨帧完成。一次传输由一次到多次事务传输构成可以跨帧完成帧的起始由一个特定的SOF包表示帧尾为EOF一种电平状态。EOF期间不准传输数据。USB包由五部分域组成同步字段SYNC 包标识字段PID 地址域(74 bits)、Frame Number(11 bits)、数据字段DATA(0-1024字节) 校验字段CRC 包结尾字段EOPPID域不同的PID(8 bits)标记了不同类型的USB包。四位标识符 四位标识符反码构成PID将USB包分为4类1.令牌包0x01启动一个OUT(主机到设备)的传输并包含设备地址和标号0x09启动一个IN(设备到主机)的传输并包含设备地址和标号包是USB总线上数据传输的最小单位不能被打断或干扰否则会引发错误。若干个数据包组成一次事务传输一次事务传输也不能打断属于一次事务传输的几个包必须连续不能跨帧完成。一次传输由一次到多次事务传输构成可以跨帧完成。0x05帧起始(SOF)表示一个帧的开始并且包含相应的帧号0x0d设置(SETUP)启动一个控制传输用于主机初始化2.数据包0x03偶数据包(DATA0)0x0b奇数据包(DATA1)0x07高速设备的PID同步包0x0f高数设备分离包高带宽的同步事务3.握手包0x02确认接收无误的数据包(ACK)0x0a无效(NACK)接收端(发送端)在忙无法接受(发送)设备0x0e错误(STALL)端点被禁止活不支持控制管道请求0x06无响应(NYET)4.特殊类前导包错误包分裂事务和Ping测试地址域地址域ADDR 由两部分组成7bits的设备地址addr 4bits的端点地址ENDPaddr(7 bits) ENDP(4 bits)所以可以知道USB设备最大支持127个设备每个设备最多16个端点这个ENDP只用在IN/OUT/SETUP中帧号域当USB令牌包的PID为SOF时其数据字段必须为11bits的帧序列号Frame Number主机每发出一个帧帧号自动加1当达到0x7FF时归零重新开始计数对同步传输有重要意义。数据域只存在于DATA信息包根据不同的传输类型拥有不同小大的字节(0-1023字节)CRC域用于数据的CRC校验包类型根据PID域的同分为4类包1.令牌包也有四种OUT通知设备将要输出一个数据包IN通知设备返回一个数据包SETUP只用在控制传输中也是通知设备将要输出一个数据包与OUT令牌的区别是只使用DATA0数据包且只能发到device的控制端点SOF在每帧开始时以广播的形式发送针对USB全速设备主机每1ms/125us产生一个帧USB主机会对当前帧号进行统计每次帧开始时通过SOF包发送帧号。输入包IN输出包OUT设置包SETUP 的格式都是一样的SYNC PID ADDR(7 bits) ENDP(4bits) CRC5(五位的校验码)帧起始包SOF的格式SYNC PID Frame Number CRC52.数据包分为DATA0和DATA1数据包当USB发送数据的时候如果一次发送的数据长度大于相应端点的容量时就需要把数据包分为好几个包分批发送DATA0包和DATA1包交替发送同步传输中(四类传输类型中之一)所有的数据包都是为DATA0。SYNC PID DATA CRC163.握手包SYNC PIDACK、NACK、STALL、NYET/ERR事务在USB上数据信息的一次接收或发送的处理过程称为事务处理事务有三种SETUP事务主机用来向设备发送控制命令SETUP令牌包 DATA包 ACKIN事务主机用来从设备读取数据IN令牌包 DATA包 ACKOUT事务主机用来从设备读取数据OUT令牌包 DATA包 ACK传输传输包括四种控制传输、中断传输、同步传输、批量传输1.控制传输由三个阶段组成1.建立阶段2.数据阶段3.状态阶段用来表示整个传输的过程已完全结束。以usb设备枚举为例SETUP令牌包 DATA数据包 ACK ------》 建立阶段DATA数据包中存放了GET_DESCRIPTORIN令牌包 DATA数据包 ACK ------》 数据阶段DATA数据包大小八字节存放的设备描述符前八字节OUT令牌包 DATA数据包 ACK ------》状态阶段主机确认收到// 驱动里的典型同步控制传输usb_control_msg(dev, usb_sndctrlpipe(dev, 0),request, requesttype, value, index,data, size, timeout);底层拆成 SETUP DATA STATUS 三个阶段事务。2.批量传输USB 允许连续 3次以下的传输错误会重试该传输 -----》“重传”DATA0-DATA1-DATA0翻转PID ------》“错误检测”上面两个机制保证数据准确[OUT] [DATA0: 512字节] [ACK][OUT] [DATA1: 512字节] [ACK][OUT] [DATA0: 200字节] [ACK] ← 短包传输结束usb2.0是512字节3.0是1024字节驱动里的典型批量传输// U 盘驱动 (usb-storage)usb_bulk_msg(dev, usb_sndbulkpipe(dev, endpoint_out), buf, len, actual, timeout);usb_bulk_msg(dev, usb_rcvbulkpipe(dev, endpoint_in), buf, len, actual, timeout);底层就是组装 OUT/IN 事务发出去。3.中断传输事务结构和批量相同。批量是有空就发中断是主机周期轮旋4.同步传输没有ACK时间轴: SOF#0 SOF#1 SOF#2 SOF#3│ │ │ │主机: ├──[OUT1024]─┼──[OUT1024]─┼──[OUT1024]─┼──...│ │ │ │└── 每帧/微帧固定发送SOF提供时间基准传输类型 是否依赖 SOF 说明控制 间接 在帧内调度不严格依赖批量 间接 帧剩余带宽传输不严格依赖中断 ✅ 直接 按 bInterval以帧为单位轮询同步 ✅ 直接 每帧/微帧固定时隙严格依赖