USB 3.0 link command 定义
USB链路层的包比较难进入大家的关注,今天把都揪出来认识一遍:
LGOOD_n
n:Header Sequence Number(头部序列号)
当满足以下所有条件时,接收端端口会发送 LGOOD_n:
接收到的头部包(Header Packet)结构有效,接收端能够识别。
CRC-5 和 CRC-16 校验均有效。
接收到的头部包中的 Header Sequence Number 与接收端预期的 Rx Header Sequence Number 匹配。
接收端有可用的 Rx Header Buffer 来存储接收到的头部包。
如果接收到的头部包中的 Header Sequence Number 与预期的 Rx Header Sequence Number 不匹配,端口将进入 Recovery 状态。
对于发送端口,接收到 LGOOD_n 表示链路伙伴已正确接收到序列号为 “n” 的头部包,这是一个确认信号。 如果接收到的 LGOOD_n 与预期的 ACK Tx Header Sequence Number 不匹配,端口也会进入 Recovery 状态。
此外,当端口进入 U0 状态时,会发送 LGOOD_n 作为 Header Sequence Number 广播,用于初始化两端口的 ACK Tx Header Sequence Number。
LBAD
当接收端口接收到 无效头部包 时,会发送 LBAD。 无效头部包指接收到的数据包 CRC-5 和/或 CRC-16 校验出错。
接收到 LBAD 后,发送端口会 从最后一个被 LGOOD_n 确认的头部包开始,重发所有后续头部包。
LCRD_x
LCRD1_x
LCRD2_x
LCRD_x、LCRD1_x、LCRD2_x(Rx Buffer Credit 指示)
LCRD_x:针对所有 SuperSpeed 头部包(Header Packet)的接收缓冲区信用索引,用于表示 一个 Rx Header Buffer Credit 已经可用。
LCRD1_x:针对所有 SuperSpeedPlus Type 1 流量类别的接收缓冲区信用索引,用于表示 一个 Type 1 Rx Buffer Credit 已经可用。
LCRD2_x:针对所有 SuperSpeedPlus Type 2 流量类别的接收缓冲区信用索引,用于表示 一个 Type 2 Rx Buffer Credit 已经可用。
x(A、B、C、D、E、F、G):表示 Rx Header Buffer Credit 的索引。
发送条件:
对于 SuperSpeed USB,端口在接收到符合以下条件的头部包后发送 LCRD_x:
LGOOD_n 已发送或将要发送。
头部包已被处理,并且有可用的 Rx Header Buffer Credit。
对于 SuperSpeedPlus USB:
LCRD1_x 在接收到 Type 1 数据包(HP 或 DP)且符合以下条件后发送:
LGOOD_n 已发送或将要发送。
数据包已被处理,并且有可用的 Type 1 Rx Buffer Credit。
LCRD2_x 在接收到 Type 2 数据包(DP)且符合以下条件后发送:
LGOOD_n 已发送或将要发送。
数据包已被处理,并且有可用的 Type 2 Rx Buffer Credit。
发送顺序:
LCRD_x 或 LCRD1_x/LCRD2_x 必须按字母顺序发送(A、B、C、D,然后回到 A),不得跳过。
在 Gen 2x2 模式下,顺序为 A、B、C、D、E、F、G,然后回到 A。
如果缺失 LCRD_x 或 LCRD1_x/LCRD2_x,将导致链路进入 Recovery 状态。
LRTY
在收到 LBAD 后,为重发第一个头部包而由端口发送
LGO_U1
端口请求进入 U1 低功耗状态时发送
LGO_U2
端口请求进入 U2 低功耗状态时发送
LGO_U3
下行端口请求进入 U3(最深低功耗状态)时发送。上行端口应接受该请求
LAU
端口接受进入 U1、U2 或 U3 请求时发送,用于确认链路状态切换
LXU
端口拒绝进入 U1 或 U2 请求时发送,用于拒绝链路低功耗切换
LPMA
端口在收到 LAU 后发送。与 LGO_Ux 和 LAU 的握手配合使用,确保链路两端端口进入相同状态
LDN
下行端口处于 U0 活动状态时发送。下行端口在每 10 µs 发送一次,当没有数据包或其他链路命令需要传输时发送
LUP
设备处于 U0 活动状态时发送。上行端口在每 10 µs 发送一次,当没有数据包或其他链路命令需要传输时发送