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

USB2.0 SPLIT事务

2021-12-02 2443 105

当一个低速或全速的USB设备连接到高速的HUB时,高速USB主机使用SPLIT事务来解决从高速模式到全速模式的转换。
SPLIT事务分为SSplit(Start Split)事务和CSplit(Complete Split)事务两种。

  • 如果高速HUB无法处理SPLIT事务,高速HUB会向USB主机返回一个NYET包。
  • 如果低速或者全速设备和高速HUB之间的事务一直没有完成,高速HUB也会向主机返回一个NYET包。
  • 当高速HUB端口下的低速或者全速设备出现错误时,高速HUB会向USB主机发送一个ERR包。

SPLIT事务的格式

SPLIT事务:
SSplit

CSplit格式:
CSplit

SPLIT事务的HUB与设备之间的接力过程

  • 中断输入SPLIT事务
    中断输入SPLIT事务

  • 中断输出SPLIT事务
    中断输出SPLIT事务

SPLIT事务示例1

这说明了一个典型的拆分交易序列;在这种情况下,拆分中断 IN
SPLIT事务示例

SPLIT事务示例2

SPLIT事务示例

SPLIT BULK OUT事务

对于拆分批量 OUT 事务,主机发送一个 Start Split 数据包,指定集线器地址和端口号以及速度(全速),并将“端点类型”设置为“批量”。

然后它发送一个 OUT 令牌包来识别全速事务类型、设备和端点地址,然后发送数据包以向前传输到目标端点。

如果 Transaction Translator 正确接收到这些数据包并且有可用的缓冲区,它将以 ACK 数据包响应,否则它将以 NAK 数据包响应。

此时,事务转换器继续将此事务发送到指定的全速端点,并获得响应,并将其存储,准备好在完成拆分事务期间传递回主机。

当主机控制器决定它是合适的时,它通过发出一个完整的拆分事务来检查结果。Complete Split 数据包和 OUT 令牌数据包与 Start Split 事务相同,但数据包的 Start/Complete 位除外。这允许集线器验证它将呈现哪个事务的结果。

如果全速事务尚未完成,集线器将以 NYET 数据包响应,主机将在稍后的某个时间尝试竞争拆分事务。如果完成,则将包含实际结果(ACKNAKSTALL)的数据包发送到主机。

SPLIT BULK OUT事务

SPLIT BULK IN事务

拆分批量 IN 事务类似于拆分批量 OUT,只是 DATA0/1 数据包发生在 Complete Split 阶段,因为它现在是响应的一部分。如果返回了数据,则数据包将代替握手包出现。

全速事务的实际 ACK 由事务转换器在接收到来自设备的 DATA0 或 DATA1 数据包时发送到设备,主机将跟踪它接收到的数据。如果它未能接收到有效的数据包,它将重试 Complete Split Transaction。

SPLIT BULK IN事务

周期SPLIT事务-中断传输同步传输

拆分中断和同步事务需要特殊处理,因为它们提供了带宽保证。每个使用这些端点类型的全速/低速设备添加到总线上,都会在全速/低速总线上得到保证分配,这也必须在高速总线上传送。该机制很复杂,在 USB 规范的第 11 章中有完整的描述。

这种机制的结果是,全速或低速总线上的周期性事务以最多 188 字节的数据包进行传输。

因此,对于同步端点而言,较长的事务(最长可达 1023 字节)将在 OUT 传输的多个 Start Split 事务或 IN 传输的多个 Complete Split 事务中传输。

此外,在周期性 IN 事务中,集线器在给定微帧内从设备接收到的数据是响应完全拆分而发送的,即使它仅代表全速或低速数据包的一部分。一个跨越两个微帧的全速中断 IN 数据包,例如 64 字节,将在最多两个完整拆分中传送。第一部分中的数据包将使用一个 MDATA PID 来指示它不完整。

等时 IN 事务类似,但最多可跨越 6 个微帧。

拆分中断 OUT 事务

对于中断 OUT 事务,最大数据大小为 64 字节,因此这些始终在单个开始拆分事务中传输。不需要来自集线器的握手包,因为如果错过了中断,则不会在同一帧中重试中断。
与批量事务一样,完整拆分将在设备自身响应时从设备引发握手数据包,或在全速或低速总线上出现错误时使用 ERR,或在事务转换器未完成其时使用 NYET任务。
153645413651

分割中断 IN 事务

对于拆分中断 IN,我们发出 Start Split(不期望来自集线器的握手)。

Complete Split 可能会导致返回完整的数据包(DATA0 / DATA1),但也有可能在微帧期间,到目前为止仅收集了部分数据,在这种情况下,使用 MDATA PID 来指示在下一个微帧中将需要进一步的完全拆分。

握手数据包 NAKSTALL 将指示设备使用此数据包进行响应。ERR 表示全速或低速总线上存在错误。NYET 表示事务翻译器尚未完成其任务。

153705597914

拆分同步 OUT 事务

从表面上看,这是最简单的拆分交易。没有来自集线器的握手,也没有完全拆分,因为不检查同步事务的交付。

复杂的事实是,单个全速同步事务被分成单独的开始拆分事务,每个事务最多 188 字节,每微帧发送一个。

Start Split 数据包设置了其 Start和 End位,以识别正在传输的有效负载的哪一部分。
153726822935

拆分同步 IN 事务

对于拆分同步 IN,我们发出 Start Split(不期望来自集线器的握手)。

Complete Split 可能会导致返回完整的数据包(DATA0),但也有可能在微帧期间,到目前为止仅收集了部分数据,在这种情况下,使用 MDATA PID 来指示进一步的 Complete在下一个微帧中将需要拆分。

ERR 表示全速或低速总线上存在错误。NYET 表示事务翻译器尚未完成其任务。

153741624908

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设备枚举-主机设置设备地址事务
USB主机在首次获取设备描述符后,知道了设备的默认端点大小。后续一个重要的操作是对设备分配地址。对USB设备分配地址是通过标准请求SetAddress来完成后。其具体的过程如下图所示:SetAddress包括2个事务。第一个事务是对主机设置地址,第二个事务是主机对设备返加一个0字节的数据包,用于确......
USB2.0设备枚举-获取设备描述符事务
USB设备与主机进行数据传输或进行设备配置时,有一些常见的术语如事务,令牌,包等。USB设备在枚举过程中有2次获取设备描述符的过程,这里分别标识为首次获取设备描述符和分配地址后的获取描述符。两次获取描述符的过程基本类似,惟一的区别是首次首次获取描述符由于设备尚未分配地址,故使用地址0与主机进行通......
USB数据长度为0的DATA/IN事务
前言使用BUSHOUND是抓不到这种包的。而且一些令牌包如SOF等这些是统计不到的。BUSHOUND是一个基本windows过滤驱动的,所以抓到的是数据已经传输的并且已经在主机方面的,所以USB总线上的一些状态是统计不到的。其实关于控制传输的0字节长度,可详见:USB2.0 控制传输数据包PID序......
USB 高速设备微帧计算及事务构成
从USB2.0规范协议中可以知道,高速设备在1ms内会有8个微帧,所以每个微帧约125us,而一个微帧内可以有多个事务。一个微帧是由起始帧SOF开始的,到下一个起始帧SOF结束或该微帧内的结速帧EOF结束。对于一个微帧内的SOF,SYNC和EOF,此为数据链路层的,一般我们关注的是里面的包内容,协议......
USB2.0 设备配置SET_CONFIGURATION传输及事务分析
USB2.0 设备配置SET_CONFIGURATION传输包含两个事务事务38由SETUP令牌,DATA0数据和ACK事务组成。可以看到该SETUP事务由主机发送给设备,设备返回ACK表示接收成功。对于事务39,有一个IN事务,分别为IN令牌,DATA1和ACK,用于对上一个事务的数据确认。......
USB2.0 SET_FEATURE传输及事务
SET_FEATURE传输及事务包含两个事务:......
USB2.0 SET_FEATURE传输及事务(二)
SET_FEATURE传输也包含两个事务:......
USB2.0 CLEAR_FEATURE传输及事务
USB2.0 CLEAR_FEATURE传输及事务,更多详见CLEAR_FEATURE标准请求......
USB2.0协议 传输包、事务和传输
USB总线上传递的数据流是USB主机和USB设备通讯的基础。USB数据流包括3个阶段:令牌阶段 :定义了本次传输的类型,表示一次传输的开始。令牌阶段由同步字段,令牌包和EOP组成。数据阶段 :包括了本次传输的数据。数据的大小根据端点大小和传输类型决定,一般最大的数据量为1024字节。数据阶段由同......
USB2.0 事务
一个USB事务一般包含三个包:令牌包,指名了该事务的传输的类型,包括目标设备的地址和端点。数据包,有些事务可以没有数据,数据的长度不得超过该端点的最大包大小。握手包,对有数据或无数据传输的结果进行反馈,如SET_ADDRESS请求就无数据包。从以上的解释可以看到,一个USB事务是一次数据的可靠......
USB2.0 Setup事务
Setup事务是由SETUP令牌,数据包和握手包组成的。一个成功的Setup事务保证了Setup令牌和数据包传输的可靠传输。Setup事务是由主机到设备的,并且如果Setup事务含有数据包,必须使用DATA0包。有数据包的SETUP事务可见下图。此SETUP事务使用SETUP令牌包(0xB4)......
USB2.0 OUT事务
OUT事务和其它事务一样,也包含三个包,分别为OUT令牌包,数据包(输出)和握手包(成功时为ACK)。OUT事务用于由USB主机发送数据,所以在数据包之前发送为的OUT令牌包,如果USB设备确认数据正确无误的接收时,给主机返回ACK握手包。如果USB设备由于其自身资源不足(如内存)等自身原因无法......
USB2.0 IN事务
IN事务的数据方向和OUT事务的数据方向相反,IN是用于向主机输入数据,OUT事务用于主机向设备发送数据。IN事务和其它事务一样,也包含三个包,分别为IN令牌包,数据包和握手包。IN事务的处理机制当IN令牌或数据包发生错误或者超时,USB设备丢弃该包,并且不向主机返回任何握手包。当主机收到数据......
USB2.0 PING事务
PING事务只适用于USB2.0高速模式,全速和低速设备不支持PING事务。PING事务由PING令牌和握手包组成。PING事务适用于主机探测USB设备是否可以接收数据。在USB数据传输过程中,USB主机会向USB设备发送数据,如果USB设备无法接收数据,会向主机返回NAK握手包,告诉USB主机自......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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