USB3.2 摘录(三)(上):https://developer.aliyun.com/article/1598604
8.5 事务包(TP,Transaction Packet)
事务包在主机和设备间的直接路径上传输,TP 用来控制数据流和管理端到端连接。类型域的值应该被设置为 TransactionPacket 。路由字符被集线器用来路由选择将一个呈现在其上游端口的包传递到正确的下游端口。TP 包中的路由字符被设备设置为 0 发送给主机(设备发给主机 TP 包,集线器由下游端口传递到上游端口,不需路由选择)。当主机发送一个 TP 时,设备地址域(Device Address)包含接收方的地址。当设备发送 TP 给主机,那么它设置设备地址域为它自己的地址,这个域被主机用来确认TP 的来源。TP 的子类型域被接收方用来决定 TP 的格式和使用。
TP 结构上也是一个头包结构。同 LMP 类似,TP 有多种 SubType,一个典型的 ACK SubType 的 TP 包格式如图 8-12 所示:
规范对每种 SubType 的 TP 作了详细解释。
8.5.1 确认应答事务包
Acknowledgement (ACK) Transaction Packet 。主机和设备端点都能发送。
TP 用来两个目的:
- 对 IN 端点,这个 ACK TP 被主机发送以请求设备的数据(包含下一个包顺序号)和应答前一次收到的数据包。
- 对于 OUT 端点,此 ACK TP 由设备发送,以确认收到主机发送的上一个数据包,并在收到此数据包后通知主机它可用的数据包缓冲区数量(告诉主机,传完这个包后,设备自己还能接收多少数据包)。
8.5.2 没准备好(NRDY)事务包(只由设备端点发送)
Not Ready (NRDY) Transaction Packet。
此 TP 只能由设备的非同步端点发送。如果 OUT 端点没有可用的数据包缓冲区空间来接受主机发送的 DP,则该端点会将此 NRDYTP 发送到主机。如果 IN 端点无法返回 DP 以响应主机发送的 ACK TP,则该端点会将此 NRDYTP 发送到主机。
只有跟 ACKTP 不同的区域在下面描述:
8.5.3 端点就绪 (ERDY) 事务数据包
Endpoint Ready (ERDY) Transaction Packet 。
此 TP 只能由设备为非同步端点发送。它用于通知主机端点已准备好发送或接收数据包。本节仅介绍与 ACK TP 不同的字段。
8.5.4 状态事务包(statusTP,只能被主机发送给控制端点)
STATUS Transaction Packet 。
这个 TP 只能被主机发送。它用来告知控制端点,主机已经初始化一次控制传输的状态阶段。这个 TP 应该只被主机发送给控制端点。只与 ACKTP 不同的区域在下面描述:
8.5.5 停止事务包(STALLTP,只由设备端点发送)
STALL Transaction Packet 。
这个 TP 只能被设备端点发送给主机,用来通知主机端点被停止或者控制传输无效。只有与 ACKTP 不同的区域在下面描述:
8.5.6 设备通知(DEV_NOTIFICATION) TP (只能被设备发送)
Device Notification (DEV_NOTIFICATION) Transaction Packet 。
这个 TP 只能被设备发送。它被设备用来通知主机设备状态或者接口状态发生了一次异步改变,即确定引起设备唤醒远程操作的设备功能。这个 TP 不是从特殊端点发送,而是从一般设备发送出来。只有与 ACK TP 不同的区域在下面描述:
8.5.6.1 唤醒设备功能的通知(Function Wake Device Notification)
8.5.6.2 延迟容忍消息(LTM)设备通知
Latency Tolerance Message (LTM) Device Notification 。
LTM 设备通知是一个能使更多电源有效操作的可选标准特性。
LatencyValue (ns)—— 容忍值(ns)
LatencyScale —— 延迟容忍级别
00b —— Reserved
01b —— LatencyValue 乘以 1024
10b —— LatencyValue 乘以 32,768
11b —— LatencyValue 乘以 1,048,576
8.5.6.3 总线轮询周期调整消息设备通知
Bus Interval Adjustment Message Device Notification 。
Bus Interval Adjustment:这个域是一个二进制补码值(范围为 -32768 到 +32767 )。
8.5.6.4 功能唤醒通知(Function Wake Notification)
如果使能了远程唤醒功能,则设备可以通过发送功能唤醒设备通知给主机告知它想要从设备挂起(在转变链路为 U0 之后)或功能挂起中退出。详情参考 9.2.5 章。
8.5.6.5 延时容忍消息(LTM)
Latency Tolerance Messaging 。
容忍度消息是一种利用记录的 BELT(Best Effort Latency Tolerance)值来使能更多电源有效平台操作的标准 USB 电源管理特性(最大可能的更节省电源?)。BELT 值是设备没有获得主机服务的最大时间(作为所有配置了的端点的服务需要因素),尤其,BELT 值是在主机接收到来于设备的 ERDY 和主机发送对 ERDY 的应答之间的时问。设备指示它们是否能使用在 BOS descriptor 中的 SUPERSPEED_USB Device Capability descriptor 的 LTM Capable 域来发送 LTMTP,LTM 使能特性选择器能使 LTM 设备发送 LTM TPs 。
8.5.6.5.1 可选择的标准 LTM 和 BELT 请求
Optional Normative LTM and BELT Requirements 。
一般设备请求:
- LTM TPs 应该只被外围设备发送
LTM TPs 适用于除了同步端点以外的所有端点类型(可能同步端点无法忍受延迟请求)一旦 BELT 值被设备发送给主机,所有被配置的端点应该期待在指定的 BELT 时间内被服务。
设备应该发送 BELT 域为 tBELTdefault 的 LTM TP,作为 tMinLTMStateChange 的 LTM 使能状态下任何改变的应答。
设备应该确保它的 BELT 值尽快的被决定,以便于在需要改变 BELT 值之前能提供设备服务延迟容忍的合理参考。除此之外,应该符合下面条件:
最大的 LTM TPs 数是由 tBeltRepeat 约束
每个 LTM TP 应该有一个不同 BELT 值
系统应该默认所有设备的 BELT 为 1ms(参考 Table 8-33 )
BELT 的最小值为 125us(参考 Table 8-33)。
设备要求管理建立 BELT 值:
LTM 机制应该利用 U1SEL 和 U2SEL 来提供系统延迟信息给设备。在这里,系统延迟是在设备发送 ERDY 和在最深允许链路状态为 U1 或 U2 时将收到来自于主机的事务包(ACK TP?)之间的时间。这些值被设备用来正确调整它们的 BELT 值。
允许它们的链路进入 U1,但不进入 U2 的设备应该从总容忍延迟中减去 U1 系统退出延迟(U1SEL),将结果作为 LTM TP 的 BELT 域值发送。
允许它们的链路进入 U1 和 U2 的设备应该从它的总容忍延迟中减去 U2SEL,将结果作为 LTM TP 的 BELT 域值发送。
8.5.6.6 总线间隔调整消息(deprecated)
Bus Interval Adjustment Message,此功能已弃用。
这个设备通知可以被设备发送用来请求一个总线间隔长度的增加或减少。这典型被设备用来试着与主机外部时钟的总线周期时钟同步。总线周期的调整请求是相对于当前总线周期,例如,如果设备请求增加一个总线间隔调整(BusIntervalAdjustmentGranularity)然后又请求增加两个单元,那么总共主机请求增加了三个单元。
主机应该支持 -37268 到 37267 的绝对范围的总线间隔调整单元。设备不应该每 8 个总线周期超过一次请求调整。直到设备等待足够长时间而精确知道之前的总线轮询周期调整请求对随后 ITPS 时间戳值的影响,设备才应该发送另外的总线周期调整请求。设备不应该单次请求 BusIntervalAdjustment 单元超过 -4096 到 +4096 。 设备可以随着时间多次请求 BusIntervalAdjustment 总共超过 4096个单元。直到设备在过去 125us 里接收到 ITP,才可以请求总线周期调整。ITP 包含一个其值等于 0 或者等于设备地址的总线周期调整控制域,此时设备在地址或配置状态。
一次只能有一个设备控制总线间隔长度。主机控制器使用先来先服务原则来处理总线周期调整请求。当主机控制器开始操作,它应该发送带有总线周期调整控制域为 0 的请求的 ITPs 。当主机控制器首先收到一个总线周期调整控制请求时,它会设置随后的 ITPs(由主机广播)的 Bus Interval Adjustment Control 域值为发送请求的设备地址,一旦域值被设置为非 0 值,主机应该忽略来于其他所有设备的总线周期调整请求。如果被控制的设备断开了连接,主控制器应该复位 Bus Interval Adjustment Control 域值为 0 。主控制器可以给软件提供一种方式,不顾总线周期调整控制域的默认行为,而选择一个控制设备。主控制器应该在收到调整请求的两个总线周期内开始应用新调整的周期。
最小的总线周期调整(一个 BusIntervalAdjustmentGranularity)要求主机做一个 8x4096 个总线间隔的平均调整。主机被允许在单个总线周期中做此调整,常用于产生 ITP 所需时钟,总线轮询周期不需要一个比 8 个高速位时间小的周期。主机应该在有规律的轮询周期中进行总线轮询周期调整。当主机需要每 4096 个总线平均做多次 8 个高速位时间调整时,应该按下面的约束均匀分布:
包含不止一个 8 高速位时间的轮询周期调整要涉及到最大调整总线轮询周期。而其他轮询周期不用
在任何总线轮询周期中做的 8 个高速位时间的调整次数不应该超过任何其他总线轮询周期调整的高速位时间调整数
在两个连续最大调整总线轮询周期之间的差值不应该变化??
直到之后主机收到那个有效的总线周期调整请求的总线周期,总线周期调整的平分配和平均调整请求才应该在主机收到调整请求后的一个总线周期中应用。
下面是一个主机为指定有效总线周期调整请求操作的例子。上电后,在第 X-1 个总线周期中,主机收到一个增加 10 个 BusIntervalAdjustmentGranularity 单元的总线周期调整请求。主机控制器使用带有一个 8 个高速位时间周期的时钟来驱动产生时间戳和总线周期的计数器,主机控制器把额外的 8 个高速位时间时钟节拍在每一个以下总线周期中添加到它的计数器上:X+409,X+819,X+1228,X+1638,X+2048,X+2457,X+2867,X+3276X+3686,X+4096,X+4505,…
8.5.6.7 子链路速度设备通知(Sublink Speed Device Notification)
子链路速度:设备上报设备通知 TP,用于识别其链路连接的特征。 子链路速度设备通知 TP 应由在 SuperSpeedPlus 模式下运行的增强型 SuperSpeed 设备在进入地址 USB 设备状态时生成。
8.5.7 PING 事务包(只能被主机发送)
这种 TP 只能被主机发送。它是被主机用来在开始同步传输之前将所有连到设备的链路转回成 U0 。详情参考这种 TP 使用的 Appendix C。只有与 ACK TP 不同的区域被描述。
设备应该在 tPingResponse time 时间内通过发送 PING_RESPONSE TP(参考 Section 8.5.8)给主机,以此对 PING TP 应答。
设备应该保持它的链路处在 U0 直到随后它收到一个来自主机的包,或者直到 tPingTimeout time 超时。
8.5.8 PING_RESPONSE Transaction Packet(只能被设备发送)
此 TP 只能由设备发送,以响应主机发送的 PING TP。收到的每个 PING TP 都应发送一个 PING_RESPONSE TP。有关此 TP 使用的详细信息,请参阅附录 C。本节仅介绍与 ACK TP 不同的字段。
8.6 数据包(DP,Data Packet)
这种包能被主机或者设备发送。主机使用这种包发送数据给设备。设备使用这种包返回数据给主机作为一个 ACK TP 应答。所有的数据包由 DPH(Data Packet Header) 和 DPP(Data Packet Payload) 组成。只有与 ACK TP 不同的区域被描述:
注 1:为了便于阅读,此图中省略了 DPH 和 DPP 周围的框架符号。
注 2:SuperSpeedPlus 数据包使用的 DPH 后面的附加长度字段被省略。有关详细信息,请参阅第 7 章。
数据包格式:
End Of Burst (EOB)/Last Packet Flag (LPF) —— 突发结束/最后包标志:
解析:对于非同步端点,这个区域用来指示(EOB)突发结束;对于同步点,用于指示最后一个包(LPF)
对于非同步 IN 端点,这个区域被用来确认这是突发的最后一个包。当设备准备继续传输时,应该发送一个 ERDY 通知主机。注意:一个端点应该在重发 DP 中新计算 EOB 值。如果设备返回的数量比在收到最后的 ACK TP 包 NumP 域要求的数量还少,而且不是短包,则 EOB 域应该在突发的最后包中被置位。当设备发送一个短包时, EOB 可以被置位。
对于非同步 OUT 和控制端点,这个域应该被设为 0 。
对于同步端点这个域被用来确认这是在当前服务周期中最后一次突发的最后包。LPF 能被设备和主机置位。当这个 DP 源或目标是同步端点时候的使用请参考 8.12.6 章。
Endpoint Number(Ept Num) —— 这个域决定 DP 源或者 DP 的接收方(哪个设备端点)
Setup(s) —— 这个区域被主机置位指示 DP 是一个 Setup 数据包。这个域只能被主机置位。
Data Length —— 这个域用来指示不包含 CRC-32 的 DPP 数据的字节数
Data Block —— 这个区域包含 DPP 中的数据。字节中这个区域的大小由 Data Length 值指示。
8.7 同步时间截包(ITP)
Isochronous Timestamp Packet 。
ITPs 的类型域值为 Isochronous TimestampPacket ,ITPs 被用来从主机到所有活动的设备发送时间戳(广播)。ITPs 不带有地址或路由信息,而是通过集线器在 U0 状态下广播给所有它们的下游端口链路。设备不应该应答 ITP。ITPs 为同步传输被用来提供主机时序信息给设备。注意任何设备或集线器可以接收一个 ITP。只要链路已经在 U0 状态主机就应该在根端口链路上发送一个 ITP。只有主机能初始化一个 ITP 发送。主机不应该为发送 ITP 而使一个根端口链路进入 U0。如果根端口链路在 U0 状态,主机应该在时间戳范围内的每个总线周期发送一个 ITP。当主机根端口链路从查询状态进入 U0,主机应该发送带有同步时间戳开始(tIsochronousTimestampStart)的 ITPs 。ITP 可以在一次突发中的包之间发送。如果设备收到一个带有链路控制字 DL 标志置位的 ITP,时间戳值可以允许严重错误,可以被设备忽略
ITP 格式解析:
- lsochronous Timestamp(ITS) —— 同步时间戳区域被用来确认从主机发送 ITP 以来的当前时间值,时间戳域被分为 2 个子域:
13:0 —— 总线间隔计数。当前毫秒计数值的 1/8 。计数值达到 0x3FFF 时归 0,然后继续增加。
26:14 —— Delta(间隔),从当前 ITP 包的开始到上一个总线周期边缘之间的时间。这个值是一些 tlsochTimestampGranularity 单元数。被使用的值应该指定最接近前一个总线周期边界的间隔
注意:如果包是精确的从总线轮询周期边缘开始的,那么间隔时间被设为 0 。
Bus Interval Adjustment Control —— 此版本的规范中不推荐使用此字段,应为 Reserved 。这个域指定了控制总线轮询周期调整机理的设备地址。一旦上电,复位或设备断开连接,主机要设置此域为 0 。