USB 3.2 报文格式解析

1.简介

USB3.2定于了4种全新的报文格式,分别为链路管理包(Link Management Packets,LMP)、事务包(Transaction Packets,TP)、数据包(Data Packets,DP)、等时时间戳包(Isochronous Timestamp Packets,ITP)。如下图所示,这4种报文都在协议层生成、发送和接收。

USB3.2协议框架

  1. 链路管理包(LMP)主要用于管理链路,在两个直接连接的link对象之间传输。
  2. 事务包(TP):事务包会穿越主机和设备相连的所有链路,用于控制数据流、配置设备和Hub等。事务包不包含数据。
  3. 数据包(DP):数据包会穿越主机和设备相连的所有链路。数据包由两部分组成,分别是数据头(Data Packet Header,DPH)和数据包负载(Data Packet Payload,DPP)。
  4. 等时时间戳包(ITP):等时时间戳包以组播的形式在活跃的链路上传输。

2.通用报文头

下图是事务包的头,总共16字节。所有报文头由14字节头和2字节的Link Control Word组成。LMP、TP、DP和ITP报文头都有Type、CRC-16、Link Control Word字段。Type字段决定报文的类型,接收方根据该字段决定如何处理报文。CRC-16字段保存DWORD0 - DWORD2总共12字节的CRC校验值。Link Control Word字段用于链路和端到端流控。

通用报文头

2.1.Type

Type字段总共5bits,用来区分报文格式,具体定义如下图所示。

Type类型

2.2.Link Control Word

Link Control Word字段总共2字节。但SuperSpeed和SuperSpeedPlus定义的Link Control Word字段有所不同,如下图所示,SuperSpeed的Header Sequence Number占3bits,而SuperSpeedPlus的Header Sequence Number占4bits。

Link_Control_Word

Width/(bits)Offset/(DW:bit)Description
SuperSpeed:3 SuperSpeedPlus:43:16Header Sequence Number(HSN)。 标记数据包序号,链路层使用 HSN 用于报文的确认和重传。 默认从 0 开始,到最大值后又从 0 开始。
SuperSpeed:3 SuperSpeedPlus:23:19Reserved。
33:22Hub Depth。 当 Deferred 设置后,Hub Depth 才有效,有效数据范围 0-4。 用于向主机标识在延迟的 TP 或延迟的 DPH 中,集线器所处 USB 层次结构的位置。 这向主机表明,原本应当转发报文的端口目前处于低功耗状态(U1 或 U2)。
13:25Delayed (DL)。 当报文重新发送或者延迟传输的时候设置该位。 当该位设置以后,不会被后续经过的 Hub 清除。
13:26Deferred (DF)。 只有 Hub 会设置 Deferred 位。 当需要发送报文的下行端口处于低功耗状态时,需要设置此位。 当该位设置以后,不会被后续经过的 Hub 清除。
53:27CRC-5。 保存前 11bit 的 CRC 校验值。

3.Link Management Packet (LMP)

LMP报文用于管理单个link,LMP报文不携带地址信息,不会被路由,只在直接连接的两个link对象之间传输。LMP报文的格式如下图所示。

LMP

3.1.Type

Type的取值为00000b,表示该报文为LMP。

3.2.SubType

Subtype定义LMP报文的子类型。

Width/(bits)Offset/(DW:bit)Description
40:5Subtype:定义 LMP 报文的子类型。
0000b Reserved
0001b Set Link Function
0010b U2 Inactivity Timeout
0011b Vendor Device Test
0100b Port Capability
0101b Port Configuration
0110b Port Configuration Response
0111b Precision Ti
163:0CRC-16
3.2.1.Set Link Function

Set Link Function的LMP报文用于在不退出U0状态时改变链路某些功能。

Set_Link_Function

Set Link Function位域的取值如下图所示。当USB端口接收到带有Force_LinkPM_Accept asserted LMP时,这意味着强制链路电源管理接受模式被激活。在这种模式下,USB端口应接受所有LGO_U1和LGO_U2链路命令。LGO_U1和LGO_U2命令即请求USB端口从U0(正常工作状态)过渡到U1(节能模式)或U2(更深层次的休眠模式)。端口在接收到带有Force_LinkPM_Accept asserted LMP后,需要无条件接受这些电源状态变化,一旦接收到Force_LinkPM_Accept de-asserted LMP时,USB端口将恢复到正常工作模式(U0)。简而言之,端口是根据接收到的LMP中的Force_LinkPM_Accept位De-assert与Assert,来强制接受或停止强制接受进入U1和U2低功耗状态的要求。

当Hub收到一个针对某特定端口的SettPortFeature(FORCE_LINKPM_ACCEPT)命令时,会向连接在该端口的设备发送此LMP。

Width/(bits)Offset/(DW:bit)Description
40:5Subtype 取值为 0001b,表示Set Link Function
70:9Set Link Function
Bits   Description
0    Reserved
1    Force_LinkPM_Accept
     Value   Meaning
     0     De-assert
     1      Assert
     6:2     Reserved
3.2.2.U2 Inactivity Timeout

U2 Inactivity Timeout的LMP报文用于定义U1状态切换到U2状态的超时时间。

U2_Inactivity_Timeout
U2 Inactivity Timeout的值使用SettPortFeature(PORT_U2_TIMEOUT)命令发送。

Width/(bits)Offset/(DW:bit)Description
40:5Subtype 取值为 0010b U2 Inactivity Timeout
80:9U2 Inactivity Timeout

U2 Inactivity Timeout的取值和时间的对应关系如下:

U2_Inactivity_Timeout

3.2.3.Port Capabilities

Port Capabilities LMP报文在完成链路训练和链路均衡之后的两个link port之间发送,用于描述每个port的link能力。Port从Polling状态进入U0后,一旦完成链路初始化之后,在tPortConfiguration时间段内,需要发送Port Capabilities LMP报文。

Port_Capabilities

Width/(bits)Offset/(DW:bit)Description
40:5Subtype 取值为 0100b,表示Port Capabilities
70:9Link speed
Bits   Description
0    设置为1 时表示为 Gen 1x1 speed
6:1   Reserved
160:16Reserved
81:0Num HP Buffers。当处于 Gen 1x1 speed 时,表示设备支持的发送和接收方向上 header packet buffers 的数量,其他速度为 0
81:8Reserved
21:16Direction (D)
Bits   Description
0     downstream port
1     upstream port
11:18USB 3. 0 OTG Capable (OTG)。为 1 表示支持 OTG Capability
11:19Reserved
41:20Tiebreaker。Direction (D) 为 0 或者 1 时有效。当两个直接连接的 port 都为 downstream 或者 upstream,Tiebreaker 将决定这两个 port 的类型。
401:24Reserved

4.Transaction Packet (TP)

事务报文在host和device之间传输,用于控制数据流和管理点对点的连接。TP报文的子类型的如下表所示。

Width/(bits)Offset/(DW:bit)Description
41:0Subtype:定义 TP 报文的子类型。
0000b Reserved
0001b ACK
0010b NRDY
0011b ERDY
0100b STATUS
0101b STALL
0110b DEV_NOTIFICATION
0111b PING
1000b PING_RESPON

4.1.ACK

ACK(Acknowledgement)报文的格式如下图所示,ACK报文有两个作用:

  1. 对于IN端点,Host发送ACK报文向Device请求数据,以及应答之前接收的Device发送的数据。
  2. 对于OUT端点,Device发送ACK报文应答之前Host发送的的数据,以及通知Host,Device接收完当前数据包后剩余的缓冲区数量。

ACK

Width/(bits)Offset/(DW:bit)Description
200:5Route String/Reserved。 当 ACK 由 Host 发送时,该字段为 Hub 的 depth 组成,Hub 使用该字段将 ACK 报文路由到对应的下行口。 当 ACK 由 Device 发送时,由于 Host 只有一个,且位置固定,因此无需路由信息,该字段保留。
70:25Device Address。 设备地址。 表示接收 ACK 或者发送 ACK 的 USB 设备地址,取值范围为 1-127。
41:0SubType。 值为 0001b,表示 TP 的子类型报文为 ACK。
21:4Reserved。
11:6Retry Data Packet (rty)。 标记 Host 或者 Device 没有接收到数据或者接收到了错误的数据包,需要发送方根据序列号 Seq Num 重新发送一包或多包。
11:7Direction (D)。 该字段定义了设备内端点的方向,该端点是该 ACK 的源或接收方。
Value    Direction of Data Flow
0b     Host to Device
1b     Device to Host
41:8Endpoint Number (Ept Num)。 端点的编号,取值范围为 0-15。
31:12Transfer Type (TT)。 SuperSpeed 时 Reserved,值为 0。 SuperSpeedPlus 取值如下:
Value   Meaning
100b    Control Transfer Type
101b    Isochronous Transfer Type
110b    Bulk Transfer Type
111b    Interrupt Transfer Type
001b    Reserved
010b    Reserved
011b    Reserved
000b    Unknown for ACKs and deferred DPs originating from SuperSpeed bus instances. Reserved for all other ACKs and DPs.
11:15Host Error (HE)。 当 ACK 报文由 Host 发向 Device 时有效。 由于主机内部原因,导致主机没有接收到有效的数据包,则会设置 HE,同时也会设置 Retry Data Packet(non-isochronous 事务)。
51:16Number of Packets (NumP)。 该字段用于指示接收方空闲缓冲区的数量。 该字段的值应小于或等于端点支持的最大突发传输值,该值由端点伴随描述符中的 bMaxBurst 值决定
51:21Sequence Number (Seq Num)。 标记下一步预期接收数据包的序列号。
51:26Reserved。
11:31TP Follows (TPF)。 SuperSpeed 保留。 SuperSpeedPlus 时,如果 Device 要在改 ACK 之后发送一个 Device Notification TP,则需要设置该位。
162:0Stream ID/Reserved。如果 ACKTP

NumP和Burst Size有紧密的联系。Burst Size表示一次突发传输发送的数据包数量。对于IN传输,该值表示当Host用TP_ACK发起IN传输时,Device尝试突发传输的最大值。对于OUT传输,该值表示来自Device控制器的响应TP_ACK中使用的NumP值。NumP值(对Host)表示Device期望的突发传输的最大值。NumP值通常小于等于端点的Burst Size值。

4.1.1.Route String

Route String由Hub的port编号组成,0表示Hub的上行port,也即目标设备为Hub本身,非0表示Hub的下行口,port最大编号为15。最多保存5个Hub级联时的port编号。

Route String

4.2.NRDY

NRDY(Not Ready)报文由Device的non-isochronous端点发送。对于OUT端点发送的NRDY报文,意味着Device没有空闲的缓冲区接收Host发送的DP报文。对于IN端点发送的NRDY报文,意味着Device无法使用ACK报文响应Host发送的DP报文。NRDY报文的格式如下图所示,有效字段意义和ACK报文相同。

NRDY

4.3.ERDY

ERDY(Endpoint Ready)报文由Device的non-isochronous端点发送。用于通知Host,Device的端点准备好发送或者接收DP数据包了。ERDY报文的格式如下图所示,有效字段意义和ACK报文相同。

ERDY

4.4.STATUS

STATUS报文只能由Host发送到Device的控制端点,用于通知Device,Host已经启动控制传输的状态阶段。STATUS报文的格式如下图所示,有效字段意义和ACK报文相同。

STATUS

4.5.STALL

STALL报文只能由Device的端点发出,用于通知主机,端点处于halted状态或者接收到了无效的控制请求。STALL报文的格式如下图所示,有效字段意义和ACK报文相同。

STALL

4.6.DEV_NOTIFICATION

DEV_NOTIFICATION(Device Notification)报文只能由Device发出,用于通知Host,设备或接口状态发生了异步变化,比如用于设备的远程唤醒功能。DEV_NOTIFICATION报文的格式如下图所示,Notification Type表示Device通知的事件类型。

DEV_NOTIFICATION
Notification Type的定义如下:

Width/(bits)Offset/(DW:bit)Description
41:4Notification Type:定义Notification的类型。
Value      Type of Notification Packet
0000b      Reserved
0001b      FUNCTION_WAKE
0010b      LATENCY_TOLERANCE_MESSAGE
0011b      BUS_INTERVAL_ADJUSTMENT_MESSAGE
0100b      HOST_ROLE_REQUEST
0101b      SUBLINK_SPEED(SuperSpeedPlus)
0110b - 1111b  Reserved

4.7.PING

PING报文只能由Host发出,用于在启动同步传输之前通知路径上的所有设备切换到U0状态。Device收到PING报文后,需要在tPingResponse时间段内使用PING_RESPONSE进行回复。需要注意的是,Device不会校验PING报文中的EP_NUM和Direction,只是将他们拷贝到PING_RESPONSE报文中。PING报文的格式如下图所示。

PING

4.8.PING_RESPONSE

PING_RESPONSE报文用于响应PING报文。EP_NUM和Direction拷贝自PING报文。PING_RESPONSE报文的格式如下图所示。

PING_RESPONSE

5.Data Packet (DP)

USB3.2 4种报文种,只有DP报文携带数据负载。Host使用DP报文向Device发送数据,Device使用DP报文响应Host发送的ACK报文。DP报文由数据包头DPH和数据包负载DPP组成,其中数据负载DPP的长度可以为0,但CRC-32校验必须保留。DP报文的格式如下图所示。

DP
DP报文的字段定义如下:

Width/(bits)Offset/(DW:bit)Description
200:5Route String/Arbitration Weight/Reserved。
1. SuperSpeed:定义与ACK报文的意义相同。
2. SuperSpeedPlus:数据流为Host到Device时,此字段解析为Route String,定义与ACK报文的意义相同。 数据流为Device到Host时,且传输的是asynchronous数据包,低16位表示仲裁的权重,其他位为0。
51:0Sequence Number (Seq Num)。 DP报文的序列号。
11:5Reserved。
11:6End Of Burst (EOB)/Last Packet Flag (LPF)。 对于non-isochronous端点,此字段为EOB,对于isochronous端点,此字段为LPF。
1. 对于non-isochronous IN端点,EOB用于确认该DP为burst传输的最后一包数据。 当Device准备好新一轮burst传输时,需要先给Host发送ERDY报文,此时EOB也会重新计算。 EOB设置的条件为Device返回的DP数量小于最近一次ACK中请求DP的数量NumP,且包含EOB的数据包不是short packet。
2. 对于non-isochronous OUT端点和控制端点,该域为0。
3. 对于isochronous端点,此字段用于标识这是当前服务间隔中最后一个突发的最后一个数据包。
41:8Endpoint Number (Ept Num)。 设备端点编号。
11:15Setup (S)。 Host使用该字段指出DP为Setup data报文。
161:16Data Length。 数据负载DPP的长度,不包含CRC-32校验的长度。
12:27Packets Pending (PP)。 该字段只能由Host设置。 如果设置了此字段,则表明Host有一个或多个DP待传输到端点或流。 其中端点由Ept Num和D决定,流由Stream ID定义。 如果该字段被清除,则表明这是Host传输到端点或流的最后一个DP。 如果该Device的端点上没有数据要传输,则Device可以使用此信息对其上游链路进行电源管理,如使上游链路进入U1或U2的低功耗状态。
xx4:0Data Block。 数据负载,长度由Data Length指定。
324:0 + xxCRC-32。 Data Block的CRC校验值。

6.Isochronous Timestamp Packet (ITP)

ITP报文会在完成Port Configuration且处于U0状态的链路上进行广播传输。Host使用ITP报文向所有活跃的Device分发时间戳,以便于Host和Device进行同步。ITP报文没有地址和路由信息,其会被Hub广播到下游的所有端口(完成Port Configuration且处于U0状态)。Device不需要响应ITP报文。如果Root Port处于U0状态,则Host应在tTimestampWindow内的每个总线间隔内从总线间隔边界发送一个ITP报文。当Host Root Port链路从polling状态切换到U0状态后,需要在tIsochronousTimestampStart周期内开始发送ITP报文。如果Device接收的ITP报文在link control word设置了delayed flag (DL)字段,表明该ITP携带的时间戳不准确,则此ITP报文被Device忽略。

ITP

Width/(bits)Offset/(DW:bit)Description
270:5Isochronous Timestamp (ITS)。 Host 发送此 ITP 时的时间戳
Bits    Description
13:0    Bus interval counter: 总线微帧(125 微秒)计数器。 取值范围为 0-0x3FFF。
26:14   Delta: Host 发送此 ITP 的时刻距上一个总线周期边界的时间差,单位为 tIsochTimestampGranularity,如果 Host 发送此 ITP 时就处于总线周期边界上,则 Delta 为 0。
71:0Bus Interval Adjustment Control。 最新的规范中弃用。
141:7Correction。 该字段以 tIsochTimestampGranularity 单位指定 ITP 通过拥有 PTM 能力的 Hub 时累积的负延迟。 这个字段应该被主机设置为 0。
431:21Reserved。

7.流控状态

本小节描述当端点返回流控制响应时Host和Device之间的交互。只有Host和Device端点之间才会进行流控。对于传输来说,只有bulk、control和interrupt端点会发送流控响应,isochronous端点则不会。
如果一个IN端点对一个ACK TP返回下列响应之一,则认为它处于流量控制状态:

  1. 返回NRDY TP报文,表述端点还没准备好。需要注意的是,端点在发送NRDY TP之前,必须等待,直到接收到它发送的最后一个DP的ACK TP报文。
  2. 发送的DP报文的DPH部分EOB=1(EOB用于确认该DP为burst传输的最后一包数据)。
    如果一个OUT端点对一个DP返回下列响应之一,则认为它处于流量控制状态:
  3. 返回NRDY TP。
  4. 发送的ACK TP报文NumP=0。
    Packets Pending字段只有在Host设置时才有效,并且不影响端点是否进入流控状态。当端点进入流控状态后,必须发送ERDY TP报文后,才能返回到正常的活跃状态。进一步的,对于IN端点, 必须等待,直到收到最后一个其发送的DP报文的ACK TP,才能发送ERDY TP,当端点不处于流控状态时,无需发送ERDY TP,除非该端点是支持流传输的bulk端点。Host可以在任何端点上恢复事务——即使端点在返回流控制响应后没有返回ERDY TP。为了确保Host和Device正常运行,Host应忽略来自未处于流量控制状态端点的ERDY TPs。

参考资料

  1. https://www.usbzh.com/article/detail-201.html
  2. https://www.usbzh.com/article/detail-691.html
  3. Universal Serial Bus 3.2 Specification
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值