USB 协议层数据格式

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 握手包跑包

各位好 又见面了 我是曹操 今天给大家带来一篇新的教程

希望各位细心学习 低调用网

握手包的文件格式握手包的文件格式握手包的文件格式握手包的文件格式

  1. 在软件开发过程中,我们可以忽略 Hub 的存在,简化硬件拓扑图如下:一个物理设备里面可能有多个逻辑设备,Host 可以外接多个逻辑设备,硬件拓扑图如下:

  2. 要理解协议层、理解数据如何传输,带着这几个问题去学习:提前罗列出来:

数据阶段:结果如何?有握手包

2.1 字节/位传输顺序:先传输最低位(LSB)。描述数据时按照传输顺序从左到右列出来。

2.2 SYNC 域:Host 发出 SOP 信号后,就会发出 SYNC 信号:它是一系列的、最大传输频率的脉冲,接收方使用它来同步数据。对于低速/全速设备,SYNC 信号是 8 位数据(从做到右是 00000001);对于高速设备,SYNC 信号是 32 位数据(从左到右是00000000000000000000000000000001)。使用 NRZI 编码时,前面每个 “0” 都对应一个跳变。在很多文档里,把 SOP 和 SYNC 统一称为”SYNC”,它的意思是 “SYNC” 中含有 “SOP”。

2.3 包格式

握手包的文件格式

USB 总线上传输的数据以包为单位。USB 包里含有哪些内容(“域”)?

帧号、数据等跟 PID 相关的内容

CRC 校验码

发起一次完整的传输,可能涉及多个包。那么,第 1 个包里含有【设备地址、端点号】,后续的包就没必要包含设备地址、端点号。

2.3.1 PID 域

注意:所有的 USB 文档提到的”输入”、”输出”,都是基于 Host 的角度,”输出”表示从 Host 输出到设备,”输入”表示 Host 从设备得到数据。

有哪些 USB 包?根据包数据里的 PID 的 bit1, bit0 可以分为4类:PID 有 4 位,使用 bit1,bit0 确定分类,使用 bit3,bit2 进一步细分。如下表(来自《圈圈教你玩USB》)所示:

握手包的文件格式握手包的文件格式

在 USB 包中,PID 域使用 8 位来表示,格式如下:前 4 位表示 PID,后 4 位是对应位的取反。接收方发现后 4 位不是前 4 位的取反的话,就认为发生了错误。

2.3.2 令牌包(Token)

令牌类的 PID,起”通知作用”,通知谁?SOF 令牌包被用来通知所有设备,OUT/IN/SETUP 令牌包被用来通知某个设备。

对于 OUT、IN、SETUP 令牌包,它们都是要通知到具体的设备,格式如下:

握手包的文件格式握手包的文件格式握手包的文件格式

USB 设备的地址有 7 位,格式如下:

USB 设备的端点号有 4 位,格式如下:

对于 SOF 包,英文名为”Start-of-Frame marker and frame number”。对于 USB 全速设备,Host 每 1ms 产生一个帧;对于高速设备,每 125us 产生一个微帧,1 帧里有 8 个微帧。Host 会对当前帧号进行累加计数,在每帧或每微帧开始时,通过 SOF 令牌包发送帧号。对于高速设备,每 1 毫秒里有 8 个微帧,这 8 个微帧的帧号是一样的,每 125us 发送一个 SOF 令牌包。SOF 令牌包格式如下:

握手包的文件格式

2.3.3 数据包

Host 使用 OUT、IN、SETUP 来通知设备:我要传输数据了。数据通过”数据包”进行传输。

数据包也有 4 种类型:DATA0、DATA1、DATA2、MDATA。其中 DATA2、MDATA 在高速设备中使用。对软件开发人员来说,我们暂时仅需了解 DATA0、DATA1。

为什么要引入 DATA0、DATA1 这些不同类型的数据包?【为了纠错】。

Host 和设备都会维护自己的数据包切换机制,当数据包成功发送或者接收时,数据包类型切换。当检测到对方使用的数据包类型不对时,USB 系统认为发生了错误。

比如:数据包大小在不同传输模式下有不同规定,格式如下:

握手包的文件格式

最大数据有效载荷:低速设备为 8 字节,全速设备是 1023 字节,高速设备为 1024 字节。

2.3.4 握手包

握手包有 4 类:ACK、NAK、STALL、NYET

2.4 传输细节

2.4.1 传输(Transfer)和事务(Transaction)

USB 传输的基本单位是包(Packet),包的类型由 PID 表示。一个单纯的包,是无法传输完整的数据。

为什么?比如想输出数据,可以发出 OUT 令牌包,OUT 令牌包可以指定目的地。但是数据如何传输呢?还需要发出 DATA0 或 DATA1 数据包。设备收到数据后,还要回复一个 ACK 握手包。

所以,完整的数据传输,需要涉及多个包:令牌包、数据包、握手包。这个【完整的数据传输过程,被称为事务(Transaction)】

有些事务需要握手包,有些事务不需要握手包,有些事务可以传输很大的数据,有些事务只能传输小量数据。

有四类事务:

有四类传输(Transfer):

暂时记住这个关系:

2.4.2 过程(stage)和阶段(phase)

事务由多个包组成,比如 Host 要发送数据给设备,这就会涉及很多个包:

这个完整的事务涉及 3 个包(Packet),分为 3 个阶段(Phase):

事务由包组成,这些包分别处于 3 个阶段(phase):令牌阶段,数据阶段,握手阶段。

对于批量传输、中断传输、实时传输,它们分别由一个事务组成,不再细分为若干个过程。

【但是】控制传输由多个事务组成,这些事务分别处于 3 个过程:建立过程(stage)、数据过程(stage)、状态过程(stage)。

总结起来就是:

2.4.3 批量传输

批量传输用批量事务来实现,用于传输大量的数据,数据的正确性有保证,时效没有保证。

批量事务由 3 个阶段(phase)组成:令牌阶段、数据阶段、握手阶段。每个阶段都是一个完整的包,含有 SOP、SYNC、PID、EOP。

2.4.4 中断传输

中断传输用中断事务来实现,用于传输小量的、周期性的数据,数据的正确性和时效都有保证。

中断事务由 3 个阶段(phase)组成:令牌阶段、数据阶段、握手阶段。每个阶段都是一个完整的包,含有 SOP、SYNC、PID、EOP。

中断事务跟批量事务非常类似,Host 使用它来周期性地读数据、写数据。

以鼠标为例,我们需要及时获得鼠标的数据,不及时的话你会感觉鼠标很迟钝。但是 USB 协议中并没有中断功能,它使用”周期性的读、写”来实现及时性。具体过程如下:

中断事务的【优先级】比批量事务更高,它要求实时性,而批量事务不要求实时性。

2.4.5 实时传输

实时传输用实时事务来实现,用于传输实时数据,对数据的正确性没有要求。

实时事务由 2 个阶段(phase)组成:令牌阶段、数据阶段。每个阶段都是一个完整的包,含有 SOP、SYNC、PID、EOP。

实时事务不需要握手阶段,一个示例的场景是:为了传输摄像头的实时数据,偶尔的数据错误是可以忍受的,大不了出现短暂的花屏。如果为了解决花屏而重传数据,那就会导致后续画面被推迟,实时性无法得到保证。

2.4.6 控制传输

在使用批量传输时,使用 IN 令牌包或 OUT 令牌包表示数据传输方向。

控制传输的令牌包永远是 SETUP,怎么分辨是读数据,还是写数据?发出 SETUP 令牌包后,还要发出 DATA0 数据包,根据数据的内容来确定后续是读数据,还是写数据。这个过程称为”建立事务”(SETUP Transaction)

但是控制传输由多个事务组成,这些事务分别处于 3 个过程:建立过程(stage)、数据过程(stage)、状态过程(stage)。

状态过程(stage),使用批量事务:

上图中的每一个方框,都是一个完整的事务,含有:Token Packet、Data Packet、Handshake Packet。

  1. 使用工具体验数据格式

LeCroy(力科)成立于 1964 年,是一家专业生产示波器厂家。旗下生产有数字示波器、SDA 系列数字示波器、混合信号示波器、模块化仪器、任意波形发生器。可以在搜索引擎里搜”usbprotocolsuite” 下载 USB 抓包工具。

安装”usbprotocolsuite”后,可以在文档目录里找打很多示程序(后缀名为usb):

握手包的文件格式

赞(0)