USB2.0令牌、事务及传输抓包分析
+ -

USB2.0 IN/OUT事务ACK成功的数据翻转(DATA TOGGLE)

2021-12-06 3193 0

USB使用数据翻转(DATA TOGGLE)的同步机制,用来实现在USB主机和设备之间多个事务的数据传输同步。该同步机制原理是:

  • USB主机和设备各自维护一个数据包PID,根据PID来发送数据包
  • 数据接收方根据接收到的数据包情况来改变自身数据包PID
  • 数据发送方根据接收方的握手包来改变自身的数据包PID
  • 数据在主机和设备使用交替的包序列,如DATA0/DATA1之间进行切换,如果主机和设备端之间没有改变自身的PID,则认为数据传输失败,则当前数据包会被重转。

由于同步传输不存在握手包,所以同步传输不使用数据翻转机制。同步传输的数据发送方仅按照指定的PID序列发送数据包,接收方根据接收到的数据包PID序列来判断数据是否正确从而进行数据同步。

IN事务DATA0/DATA1 ACK的数据翻转

如我们有以下两次的IN事务,其事务编号分别为46680和46681事务。
IN事务

USB主机使用包10070包指示这是一个IN事务,并且USB设备使用DATA1包向USB主机返回数据,USB主机收到数据后将自己的数据包序列变为DATA0,并向USB设备返回ACK,这时USB设备切换自己的包序列为DATA0.这时在事务46681中,使用主机再次请求的IN事务则使用DATA0来进行数据传输。所以以上事务的数据翻转过程如下:

IN事务DATA0/1数据翻转

这里我们做一个说明:USB主机和USB设备经过很长一段时间数据通讯后,这时USB主机和设备的数据包序列PID为DATA1。所以在在启动IN事务46680时,USB设备使用DATA1包序列返回数据,USB设备确认数据无误后,将自己的包序列切换为一下包序列DATA0,并给USB设备返回ACK,USB设备接收到ACK后,切换自己的包序列为DATA0,即下一次进行数据传输的包序列。
事务46681类似,USB主机和设备使用此包序列进行数据传输,重复不止。

OUT事务DATA0/DATA1 ACK的数据翻转

对于OUT事务类似:
OUT事务
如上图所示,这里我们截取2个OUT事务分别为71539和71540事务。对于71539事务USB主机使用DATA0包发送数据给设备,而事务71540使用DATA1。

OUT事务DATA0/1数据翻转

USB主机和设备经过一段时间的数据发送后,当前的数据包PID为DATA0,USB主机需要向USB设备发送数据,使用事务71539。USB主机首先向USB设备发送OUT包,然后使用DATA1发送数据,USB设备收到数据后确认无误后将自己的包PID从DATA0变成DATA1,并向主机返回ACK,主机收到ACK后装饰自己的包ID从DATA0变为DATA1.
而对于事务71540,USB主机首先发送OUT包,然后使用DATA1发送数据给设备,USB设备收到数据无误后将自己的包ID从DATA1变为DATA0,并返回ACK给主机,主机收到ACK后将自己的包ID从DATA1变为DATA0.

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB2.0 数据包DATA0,DATA1,DATA2
数据包是用于传输数据的,由8位的包标识PID,数据字段和16位的循环冗余校验字段CRC组成。PID字段:用于指明不同的数据包类型。支持 4 种数据包,分别为: DATA0DATA1 、DATA2 和MDATA。 在介绍的数据触发机制中,使用 DATA0DATA1。SPLIT 令牌事......
UAC Feedback端点
下面转一段对USB feedback的理解:这段时间一直在做USB Audio Device(UAC)设备的开发工作。由于UAC采用的是isochronous endpoint来传输数据,对时钟的要求较高。但无奈我们的嵌入式平台的时钟并不准,数据同步就成了问题。经过研究,发现只能使用异步模式来解决这......
USB超高速设备描述符的bMaxPacketSize0为0x09
USB3的设备中,其USB设备描述符和2.0的结构一致,不过在含义上有的字段稍有区别。比如说在USB3.2的版本中,其设备描述符中的bMaxPacketSize0和USB2.0有就所不同。在USB2.0中bMaxPacketSize0代表的是USB设备默认端点0的最大包的大小,一般为0x40即64字......
USB2.0 ACK握手包
ACK握手包用于当USB数据传输的接收方正确接收到数据包时,接收方将返回 ACK 握手包。 ACK 握手包表征了一次正确的数据传输,之后才可以进行下一次事务处理。ACK广泛用于通读协议中,一般用于确认从接收方接收到数据正确无误,特别是在TCP/IP协议栈中,ACK的使用更加让人理解深入。我们嘴里......
Windows系统HidD_GetPreparsedData数据结构PHIDP_PREPARSED_DATA研究
上天开了一个玩笑,研究了REACTOS的HidD_GetPreparsedData函数的数据结构(http://www.usbzh.com/article/detail-980.html ),竟然发现这和Windows体统的不兼容。所以这一节我们来研究一下Windows下的HidD_GetPrepa......
USB2.0包Packet的组成
USB包由SOP,SYNC,Packet内容和EOP组成.SOP起始包起始包SOP(Start Of Packet),通过将D +和D-线从空闲状态驱动到相反的逻辑电平(K状态),由始发端口发信号通知分组的开始(SOP)。 此开关级别表示SYNC字段的第一位。 当重新传输到小于±5 ns时,集线器......
Windows10下开发虚拟USB鼠标之枚举子设备失败(STATUS_DEVICE_DATA_ERROR)
之前发过一篇文章:Win10使用虚拟USB鼠标实现自动挂机测试功能(文章地址:http://www.usbzh.com/article/detail-476.html ) 使用的是虚拟驱动实现的一个虚拟USB鼠标,实现了产品的自动测试功能。生成的设备在设备管理器中如下:但在开发过程中,并不是一帆......
USB数据长度为0的DATA/IN事务
前言使用BUSHOUND是抓不到这种包的。而且一些令牌包如SOF等这些是统计不到的。BUSHOUND是一个基本windows过滤驱动的,所以抓到的是数据已经传输的并且已经在主机方面的,所以USB总线上的一些状态是统计不到的。其实关于控制传输的0字节长度,可详见:USB2.0 控制传输数据包PID序......
USB 高速高带宽端点wMaxPacketSize
USB的端点可以设置为高速高带宽端点。我们知道,USB的数据传输类型有4种,分别为控制传输,中断传输,批量传输和同步传输。而端点类型与之要对应。除过控制传输外,其余三种传输使用于应用的数据传输。USB使用端点描述符的wMaxPacketSize来配置端点为高速高带宽端点,主要表现在bit11-12,......
USB2.0 Setup事务
Setup事务是由SETUP令牌,数据包和握手包组成的。一个成功的Setup事务保证了Setup令牌和数据包传输的可靠传输。Setup事务是由主机到设备的,并且如果Setup事务含有数据包,必须使用DATA0包。有数据包的SETUP事务可见下图。此SETUP事务使用SETUP令牌包(0xB4)......
USB传输的事物拆分和ACK机制
USB的事务拆分USB每次传输的数据包大小不得超过端点的最大包大小,如果需要传输超过端点的最大包大小,是需要进行事务传输的,即一个事务无法完成的数据长度,会拆分成多个事务,并且提几个事务必须按最大端点大小进行数据传输,最后一个事务按实际剩余数据大小传输。这个我们在USB2.0 事务 一切我们有详细的......
USB2.0 IN/OUT事务ACK成功的数据翻转(DATA TOGGLE)
USB使用数据翻转DATA TOGGLE)的同步机制,用来实现在USB主机和设备之间多个事务的数据传输同步。该同步机制原理是:USB主机和设备各自维护一个数据包PID,根据PID来发送数据包数据接收方根据接收到的数据包情况来改变自身数据包PID数据发送方根据接收方的握手包来改变自身的数据包PI......
USB2.0 IN/OUT事务NAK的数据翻转(DATA TOGGLE)
NAK由USB设备发送,用于表示设备当前无法接收数据或者无数据发送给主机。USB设备返回NAK握手包给主机后,USB主机会重传该事务,而对于高速OUT事务,会使用PING令牌来PING设备是否可以接收数据。USB主机不会发送NAK握手包给设备。IN事务DATA0/DATA1 NAK的数据翻转......
USB2.0 IN/OUT事务ACK错误或丢失的数据翻转(DATA TOGGLE)
前面一节我们讨论了当ACK成功发送并被接收时的数据包PID翻转,但在实际的数据传输过程中,也会出现ACK丢失或者错误的情况,这节我们来讨论这种情况。同样的,对于IN事务和OUT事务,我们分别进行讨论。IN事务ACK错误或丢失的数据翻转(DATA TOGGLE)IN事务ACK错误或丢失的数据翻转(......
USB2.0 控制传输数据包PID序列
USB数据包的PID序列指的不是数据包的PID序列,特指DATA0,DATA1,DATA2和MDATA的PID序列,即USB在数据传输过程中这些数据包的顺序。USB的数据传输分为四种,分别为控制传输、同步传输、批量传输和中断传输。这四种数据传输方式除过控制传输,其余数据的传输过程都是通过IN事务或者......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!