USB3.2 规范中译本 第8章 协议层
协议层管理设备与其主机之间的数据端到端流动。该层基于链路层保证头包的传递,并根据传输类型为其余数据包增加端到端的可靠性。 除非特别注明,否则要求适用于SuperSpeed和SuperSpeedPlus架构。以Gen 1x1速度运行的Gen 2速度设备,无论其额外能力(如Gen 2速度)如何,只能使用SuperSpeed架构的功能。 本章详细描述了以下内容:
- 包的类型
- 包的格式
- 主机和设备发送包的预期响应
- 四种USB定义的传输类型
- 对批量传输类型的流支持 主机或设备可能接收或传输的各种响应和包的时间参数。
8.1 增强型SuperSpeed事务
增强型SuperSpeed总线定义了总线可以运行的多种速度。SuperSpeed总线实例上的事务规则在8.1.1节中定义。SuperSpeedPlus总线实例上的事务规则在8.1.2节中定义。 所有SuperSpeed总线实例中的链路都应以Gen 1x1速度运行。
8.1.1 SuperSpeed总线实例上的事务
当主机请求或发送数据到设备上的端点时,事务由主机发起,并在端点发送数据或确认收到数据时完成。SuperSpeed总线实例上的传输是设备应用程序向主机请求数据,然后将其分解为一个或多个突发事务。主机可以在等待当前总线事务完成时,向一个或多个端点发起一个或多个OUT总线事务。然而,主机在以下情况发生之前,不得向同一SuperSpeed总线实例上的任何端点发起另一个IN总线事务:
- 对于非同步端点
- 接收到所有请求的数据包(DPs)或
- 接收到一个短包或
- 接收到一个设置了EOB标志的数据包或
- 接收到一个NRDY或STALL事务包(TP)或
- 当前ACK TP事务超时
- 对于同步端点
- 接收到所有请求的数据包或
- 接收到一个短包或
- 接收到一个设置了最后一个包标志字段的数据包或
- 当前ACK TP事务超时
对于非同步事务,端点可以通过以下方式响应有效事务:
- 返回一个NRDY事务包
- 在OUT事务的情况下,通过返回一个ACK事务包接受它
- 在IN事务的情况下,返回一个或多个数据包
- 如果存在内部端点错误,返回一个STALL事务包
NRDY事务包(TP)响应表示端点尚未准备好接收或发送数据。这允许设备和主机之间的链路进入低功耗状态,直到端点准备好接收或发送数据。然而,如8.10.1节所述,即使在端点通知主机其准备好之前,主机也可以继续与设备上的端点执行事务。当准备好时,端点异步发送一个ERDY TP给主机,告知其现在准备好移动数据,主机通过重新安排请求来响应。请注意,同步事务不使用ERDY或NRDY TP,因为它们由主机在周期性间隔内服务。此外,发送到或从同步端点接收的数据包不被确认,即不发送ACK TP来确认接收到的数据包。
端点仅响应主机的请求。主机负责调度总线上的事务,并维护总线上数据传输的优先级和公平性;它通过IN和OUT请求的时间和顺序来实现这一点。事务不是广播的;数据包在主机和设备之间沿直接路径传输。任何未使用的链路都可以进入低功耗状态,使总线适合于积极的电源管理。
8.1.2 SuperSpeedPlus总线实例上的事务
SuperSpeedPlus总线实例上的事务遵循8.1.1节中定义的规则,并进行以下修改:
- SuperSpeedPlus主机可以发出同时的IN请求
- SuperSpeedPlus主机应按照8.12.6.3.1节的描述,流水线处理同步IN事务
- SuperSpeedPlus设备应支持对不同端点的同时IN请求
- 事务可能以与发起时不同的顺序到达/完成
8.1.2.1 同时IN事务
SuperSpeedPlus主机可以发起同时的IN事务。然而,SuperSpeedPlus主机不得对以下情况发起同时的IN事务:
- 同一端点
- SuperSpeed总线实例
注意:继续突发的ACK TP不构成新的IN事务。
8.1.2.2 事务重新排序
数据包(DPs和TPs)可能以与其原始顺序不同的顺序传递给预定接收者。这可能由于以下原因发生:
- SuperSpeedPlus集线器可能由于SuperSpeedPlus数据包排序规则而重新排序。参见10.8.6节。
- SuperSpeedPlus设备可能重新排序异步和周期性IN请求。
- SuperSpeedPlus设备和集线器将在DPs之前传输TPs(对于周期性和异步数据包)。
8.2 数据包类型
增强型SuperSpeed USB使用四种基本数据包类型,每种类型有一个或多个子类型。四种数据包类型是:
- 链路管理包(LMP)仅在一对链路之间传输(例如,一对直接连接的端口),主要用于管理该链路。
- 事务包(TP)遍历直接连接主机和设备的所有链路。它们用于控制数据包的流动、配置设备和集线器等。事务包没有数据负载。
- 数据包(DP)遍历直接连接主机和设备的所有链路。数据包有两个部分:数据包头(DPH)和数据包负载(DPP)。
- 同步时间戳包(ITP)在所有活动链路上进行多播。
所有数据包由14字节的头部组成,后跟2字节的链路控制字(总共16字节)
所有头部都有一个类型字段,接收实体(例如主机、集线器或设备)使用该字段来确定如何处理数据包。所有头部包括一个2字节的CRC(CRC-16)。 所有设备(包括集线器)和主机都会消耗它们接收到的LMPs。
如果类型字段的值是事务包或数据包头,则类型字段后面是路由字符串和设备地址字段。集线器使用路由字符串字段将出现在其上游端口的数据包路由到适当的下游端口。从设备到主机的数据包总是从集线器的下游端口路由到其上游端口。设备地址字段提供给主机,以便其可以识别数据包的来源。本章进一步讨论所有其他字段。
数据包包含描述数据块的头部附加信息
数据块后面总是跟着一个4字节的CRC-32,用于确定数据的正确性。数据块和CRC-32一起被称为数据包负载。
8.3 数据包格式
本节中的数据包字节和位定义以未编码的数据格式描述。为了清晰起见,已删除添加到串行流中的符号(即,用于帧数据包或控制或修改链路)、位编码、位扰码和链路级帧的影响。详细信息请参见第6章和第7章。
8.3.1 所有头部共有的字段
所有增强型SuperSpeed头部都以类型字段开始,用于确定如何解释数据包。在高层次上,这告诉数据包的接收者如何处理它:是用于管理链路,还是用于在设备和主机之间移动和控制数据流。
8.3.1.1 保留值和保留字段处理
保留字段和保留值不得以供应商特定的方式使用。 发送方应将所有保留字段设置为零,接收方应忽略任何保留字段。 发送方不得将定义字段设置为保留值,接收方应忽略任何定义字段设置为保留值的数据包。请注意,接收方应根据7.2.4.1节中的要求确认数据包并返回相同的信用。 注意:SuperSpeedPlus主机、集线器和设备使用一些以前标记为保留的字段。
8.3.1.2 类型字段
类型字段是一个5位字段,用于标识数据包的格式。类型用于确定数据包如何被中间链路使用或转发。
表8-1. 类型字段描述
宽度(位) | 偏移量(DW:bit) | 描述 |
---|---|---|
5 | 0:0 | 类型。这5位标识数据包的类型。 |
值 | 描述 |
---|---|
00000b | 链路管理包。 |
00100b | 事务包。 |
01000b | 数据包头。 |
01100b | 同步时间戳包。 |
其他值 | 保留。 |
8.3.1.3 CRC-16
所有头包都有一个16位的CRC字段。这个字段是对头包中前12个字节计算的CRC值。请参阅第7.2.1.1.2节了解用于计算该值的多项式。
8.3.1.4 链路控制字
链路控制字的使用在第7.2.1.1.3节中定义。
表8-2. 链路控制字格式
宽度 (位) | 偏移量 (DW:位) | 描述 |
---|---|---|
3 | 3:16 | 标头序列号。此字段中的有效值为0到7。 |
3 | 3:19 | 保留 (R)。 |
3 | 3:22 | 集线器深度。仅当延迟位设置时,此字段才有效,并向主机标识集线器在延迟TP或DPH返回给主机时在USB上的层次结构位置。这通知主机数据包应转发的端口当前处于低功耗状态(U1或U2)。此字段中的唯一有效值为0到4。 |
1 | 3:25 | 延迟 (DL)。如果重新发送标头数据包或标头数据包的传输延迟,则可以设置此位。第7章和第10章提供了有关何时应设置此位的更多详细信息。此数据包经过的任何后续集线器不得重置此位。 |
1 | 3:26 | 延迟 (DF)。此位只能由集线器设置。当需要发送数据包的下游端口处于电源管理状态时,应设置此位。此数据包经过的任何后续集线器不得重置此位。 |
- | - | 请参阅第10.9.4.4.1和10.9.4.4.2节了解集线器数据包延迟过程。 |
5 | 3:27 | CRC-5。此字段是用于验证此字中前11位正确性的CRC。请参阅第7.2.1.1.3节了解用于计算此值的多项式。 |
8.4 链接管理包 (LMP)
类型字段设置为链接管理包的包称为LMP。这些包用于管理单个链接。它们不携带地址信息,因此不可路由。它们可能是集线器端口命令的结果生成的。例如,集线器端口命令用于设置U2不活动超时。此外,它们用于交换端口能力信息,并且可能用于测试目的。
8.4.1 子类型字段 LMP
子类型字段中的值进一步标识 LMP 的内容。
Width (bits) | Offset (DW:bit) | Description |
---|---|---|
4 | 0:5 | Subtype. These 4 bits identify the Link Packet Subtype. Value Type of 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 Time Management 1000b-1111b Reserved |
16 | 3:0 | CRC-16。该字段是对前 12 个字节计算的 CRC。有关用于计算此值的多项式,请参阅第 7.2.1.1.2 节。 |
8.4.2 设置链路功能
置链路功能 LMP 用于配置无需离开活动 (U0) 状态即可更改的功能。 收到带有 Force_LinkPM_Accept 位断言的 LMP 后,端口应接受所有 LGO_U1 和 LGO_U2 链路命令,直到端口收到带有 Force_LinkPM_Accept 位取消断言的 LMP。端口收到带有 Force_LinkPM_Accept 位取消断言的 LMP 后,端口将根据设备端点的包挂起状态在正常模式下进行电源管理。 设备必须保持在 U1 或 U2 状态,直到下游端口启动退出到 U0。软件必须确保在发出生成 LGO_U1 或 LGO_U2 链路命令的 SetPortFeature 命令之前,链路级别没有挂起的包。 在正常操作期间,只有在所有其他将链路状态从 U0 降低到 U1 或 U2 的方法均失败时,才应使用此功能。 当集线器收到 SetPortFeature (FORCE_LINKPM_ACCEPT) 命令时,它会将此 LMP 发送到连接在特定端口上的设备。有关更多详细信息,请参阅第 10.16.2.2 节和第 10.16.2.10 节。 注意:不当使用 Force_LinkPM_Accept 功能会显著影响链路性能,在某些情况下(仅在正常操作期间使用时)可能导致设备无法恢复正常操作。
Table 8-4. 设置链路功能
Width (bits) | Offset (DW:bit) | Description |
---|---|---|
4 | 0:5 | Subtype. This field shall be set to Set Link Function for a Set Link Function LMP. |
7 | 0:9 | Set Link Function. These 7 bits identify the Set Link Function. Bits Description 0 Reserved 1 Force_LinkPM_Accept Value Meaning 0 De-assert 1 Assert 6:2 Reserved. |
8.4.3 U2不活动超时
U2不活动超时LMP用于定义从U1到U2的超时时间。有关此LMP的详细信息,请参阅第10.6节。
表8-5. U2不活动计时器功能
宽度 (位) | 偏移 (DW:位) | 描述 |
---|---|---|
4 | 0:5 | 子类型。此字段应设置为U2不活动超时,用于U2不活动超时LMP。 |
8 | 0:9 | U2不活动超时。这8位表示U2不活动超时值。此字段中的值与在设置端口功能(PORT_U2_TIMEOUT)命令中发送到集线器的值相同。有关此字段编码的详细信息,请参阅第10.16.2.10节。 |
8.4.4 供应商设备测试
此LMP的使用旨在用于供应商特定的设备测试,不应在链路的正常操作期间使用。
宽度 (位) | 偏移 (DW:位) | 描述 |
---|---|---|
4 | 0:5 | 子类型。此字段应设置为供应商设备测试。 |
8 | 0:9 | 供应商特定设备测试。这8位的功能是供应商特定的。 |
64 | 1:0 | 供应商定义的数据。此值由供应商定义。 |
8.4.5 端口能力
端口能力LMP描述了每个端口的链路能力,并在成功完成训练和链路初始化后由两个链路伙伴发送。在端口从轮询进入U0后,端口应在链路初始化完成后(参见第7.2.4.1.1节)在tPortConfiguration时间内发送端口能力LMP。请注意,端口可能不会总是直接从轮询过渡到U0,而可能会通过其他中间状态(例如恢复或热重置)进入U0。无论在轮询和进入U0之间经过了哪些状态,设备应在进入U0后立即发送端口能力LMP。
如果链路伙伴在tPortConfiguration时间内未收到此LMP,则:
- 如果链路伙伴具有下游能力,应按照第10.16.2.6节所述发出错误信号。
- 如果链路伙伴仅支持上游能力,请参阅第10.5和10.18节,这些章节定义了集线器和外围设备的上游端口连接状态。
表8-7. 端口能力LMP格式
宽度 (位) | 偏移 (DW:位) | 描述 |
---|---|---|
4 | 0:5 | 子类型。此字段应设置为端口能力 |
7 | 0:9 | 链路速度。在以Gen 1x1速度运行时,此字段是一个位掩码,描述了此设备支持的链路速度。 位 描述 0 此位应设置为1,以表示此设备支持在LANE_SPEED_MANTISSA_GEN1处进行信号传输。 6:1 保留。 在不以Gen 1x1速度运行时,此字段保留,应设置为零。 |
16 | 0:16 | Reserved (R). |
8 | 1:0 | HP缓冲区数量。在以Gen 1x1速度运行时,此字段指定此设备支持的头包缓冲区数量(在每个方向上发送或接收)。所有符合本规范修订版的设备在此字段中应返回值4。所有其他值保留。 在不以Gen 1x1速度运行时,此字段保留,应设置为零。 |
8 | 1:8 | Reserved (R) |
2 | 1:16 | 方向 (D)。此字段用于识别端口的上游或下游能力。所有端口至少应设置其中一个位。 位 描述 - 0 如果此位设置为1,则此端口可以配置为下游端口。 - 1 如果此位设置为1,则此端口可以配置为上游端口。 |
1 | 1:18 | USB 3.0 OTG功能 (OTG)。如果端口支持OTG功能,此字段应设置为1。有关更多信息,请参阅USB 3.0规范(修订版3.0)的On-The-Go和嵌入式主机补充的第6.1节。 |
1 | 1:19 | Reserved (R). |
4 | 1:20 | 决定字段:此字段仅在方向字段的位0和位1都设置时有效。当两个具有上游和下游能力的设备连接在一起时,此字段用于确定端口类型。有关详细信息,请参阅表8-8。 在所有其他情况下,此字段应设置为零。 |
40 | 1:24 | Reserved. |
在交换端口能力LMP后,链路伙伴应根据表8-8确定哪个链路伙伴应配置为下游端口。
表8-8. 端口类型选择矩阵
端口2 | 端口2 | 端口2 | ||
---|---|---|---|---|
上游端口 | 下游端口 | 两者皆有 | ||
端口1 | 上游端口 | 未定义 | 端口2为下游端口 | 端口2为下游端口 |
端口1 | 下游端口 | 端口1为下游端口 | 未定义 | 端口1为下游端口 |
端口1 | 两者皆有 | 端口1为下游端口 | 端口2为下游端口 | 决胜字段中值较高的端口成为下游端口 |
注意:
- 如果决定字段的内容相同,则两个链路伙伴应再次交换端口能力LMP,并在决胜字段中使用新的不同值。端口生成的决胜字段值序列应足够随机。
8.4.6 端口配置
本节仅描述与端口能力LMP不同的字段。 所有支持下游端口能力的增强型超级速度端口都应能够发送此LMP。 如果要配置为上游模式的端口在链路初始化后的tPortConfiguration时间内未收到此LMP,则上游端口应过渡到eSS.Disabled,并且外围设备应尝试以此设备支持的其他速度连接。
表 8-9. 端口配置 LMP 格式(与端口能力 LMP 的区别)
宽度(位) | 偏移量(DW:位) | 描述 |
---|---|---|
4 | 0:5 | 子类型:该字段应设置为 "Port Configuration"(端口配置) |
7 | 0:9 | 链路速率: 当以 Gen 1x1 速率运行时,该字段描述上行端口应操作的链路速率。 下游模式配置的链路伙伴发送的端口配置 LMP 中,此字段只能设置一个位。 位 定义: - 位0: 若设置为1,设备应以 LANE_SPEED_MANTISSA_GEN1 运行- 位6:1:保留 当不以 Gen 1x1 速率运行时,此字段保留且应置零 |
80 | 0:16b | 保留字段 |
配置为下游模式的端口应向上游端口发送端口配置链路管理报文(Port Configuration LMP)。发送该报文时,端口在链路速率字段(Link Speed field)中仅能选择1个比特位。该字段仅在端口以Gen 1x1速率运行时生效。
若下游端口无法与其链路伙伴协同工作,则应按第10.16.2.6节规定上报错误信号。
8.4.7 端口配置响应
此LMP由上游端口响应端口配置请求而发送,用于指示对端口配置LMP的接受或拒绝。本节仅描述与端口能力LMP(Port Capability LMP)存在差异的字段。
所有支持上游端口能力的增强型超高速(Enhanced SuperSpeed)端口必须支持发送此LMP。
若下游端口在tPortConfiguration超时时间内未收到此LMP,则应按第10.16.2.6节规定上报错误信号。
表 8-10. 端口配置响应 LMP 格式(与端口能力 LMP 的差异)
宽度(位) | 偏移量(DW:位) | 描述 |
---|---|---|
4 | 0:5 | 子类型:该字段应设置为“端口配置响应”。 |
7 | 0:9 | 响应码:当以 Gen 1x1 速率运行时,该字段指示设备接受的端口配置 LMP 中的设置。 位定义: - 位 0:若设置为 1,表示设备接受了链路速率设置。 - 位 6:1:保留。 当不以 Gen 1x1 速率运行时,该字段保留且应置零。 |
80 | 0:16 | 保留。 |
如果响应码指示链路速率被上游端口拒绝,下游端口应按照第10.16.2.6节所述发出错误信号。
8.4.8 精确时间测量
PTM通过提供精确表征链路延迟和通过集线器的传播延迟的方法,使USB设备能够获得更精确的时间概念。软件通过第9.6.2.6节所述的PTM能力描述符发现PTM能力。
精确时间测量由两个独立的机制组成:链路延迟测量(LDM)和集线器延迟测量(HDM)。这些机制相互补充,为设备提供高度精确的总线间隔边界定时;然而,即使没有LDM定时信息,HDM也可以用于提高设备总线间隔边界定时的准确性。
SuperSpeedPlus主机和集线器应支持PTM。对于所有外设设备和仅支持SuperSpeed的主机和集线器,PTM支持是可选的规范性要求。理想情况下,USB拓扑的所有组件都应支持PTM;然而,支持PTM的集线器仍将提高设备对总线间隔边界定时的整体准确性概念。
8.4.8.1 PTM总线间隔边界计数器
总线间隔边界应定义为一对计数器,称为PTM总线间隔边界计数器,其格式类似于ITP的27位等时时间戳:
- PTM Delta 计数器,13 位。
- PTM 总线间隔计数器,14 位。
PTM 时钟的周期为 tIsochTimestampGranularity 单位。
PTM Delta 计数器应由 PTM 时钟递增,以测量从当前时间到前一个总线间隔边界的时间延迟。PTM Delta 计数器是一个模数为 7500 的计数器,在微帧边界上回绕,即从 0 增加到 7499(约 125 微秒),然后回绕到 0。
当 PTM Delta 计数器回绕时,PTM 总线间隔计数器应递增。PTM 总线间隔计数器是一个模数为 16k 的计数器,即从 0 增加到 16,383,然后回绕到 0。
设备内部 PTM 时钟与总线间隔边界的同步机制是特定于实现的。
主机应实现一组 PTM 总线间隔边界计数器。主机是某个 PTM 域中总线间隔边界的来源。
集线器不需要实现 PTM 总线间隔边界计数器。
支持 PTM 的设备应实现 PTM 总线间隔边界计数器。
8.4.8.2 LDM 协议
LDM 协议通过请求者和响应者之间的一系列交换执行,响应者发送的 ITP 用于测量 LDM 链路延迟,并展示 LDM 时间戳交换的过程。
以下规则适用于 LDM 请求者和响应者:
- LDM 请求者是面向上游的端口。
- LDM 响应者是面向下游的端口。
- LDM 请求者和 LDM 响应者在 USB 链路上配对。
以下规则适用于 LDM 请求和响应,以及 LDM 请求者和响应者:
- 当 LDM 请求者发送一个 LDM 请求 LMP 时,它使用其 PTM 本地时间源的值作为 t1 时间戳。当 LDM 请求者接收到一个 LDM 响应 LMP 时,它使用其 PTM 本地时间源的值作为 t4 时间戳。
- 当 LDM 响应者接收到一个 LDM 请求 LMP 时,它使用其 PTM 本地时间源的值作为 t2 时间戳;当它发送一个 LDM 响应 LMP 时,它使用其 PTM 本地时间源的值作为 t3 时间戳。
- 每个 LDM 交换定义了一组时间戳,LDM 请求者可以使用这些时间戳来计算 LDM 链路延迟。
- 如果一个不支持 PTM 的端口接收到 LDM 消息,则该消息应被视为不受支持的 LMP,并由该端口静默丢弃。注意,该端口应按照第 7.2.4.1 节中规定的要求确认该数据包并返回相应的信用值。
- LDM 时间戳应参考接收到或发送的 LDM LMP 的第一个帧符号。
以下规则适用于 ITP 以及支持 PTM 的主机、集线器和设备:
- tITDFP 时间戳表示 PTM 下游端口发送 ITP 的时间。
- tITUFP 时间戳表示 PTM 上游端口接收 ITP 的时间。
8.4.8.2.1 LDM 时间戳交换
时间戳交换由 LDM 请求者生成一个 LDM 请求 LMP 并由 LDM 响应者返回一个 LDM 响应 LMP 构成。
如图 8-11 所示,时间戳 t1、t2、t3 和 t4 由请求者和响应者创建。
在时间戳交换的时间点 t4,LDM 请求者已经拥有了计算 LDM 链路延迟所需的全部信息。在图 8-11 的示例中,在时间点 t4,请求者已记录了 t1 和 t4 的时间戳,并从响应者接收到响应延迟(Response Delay)。有关如何使用这些时间戳来计算 LDM 链路延迟,请参阅第 8.4.8.3 节。
8.4.8.3 LDM 状态机
LDM 状态机使用以下符号表示:
其中,状态名称是为该状态定义的信息性名称,状态标志(Status Flags) 的值为:
- 分别表示 LDM 已启用(LDM Enabled) 和 LDM 有效(LDM Valid),例如,状态标志值 0,0 被解释为 LDM 已启用 = 假(0),且 LDM 有效 = 假(0)。
注意:与大圆圈相关的转换可以发生在该圆圈内定义的任何状态中,只要条件匹配即可。
注意:本节中的图用于说明状态转换的条件和动作;然而,有关各状态的明确定义,请参考以下章节中对相应状态的文字描述。
8.4.8.3.1 请求者操作
本节描述了请求者(上游端口)为参与 LDM 协议而执行的时间戳交换操作。
8.4.8.3.1.1 初始化请求 (Init Request)
这是请求者在上电、热复位或暖复位后的初始状态。
-
进入此状态时:
请求者应将 LDM 已启用标志 (LDM Enabled flag) 设置为 1。
初始化响应超时计数器 (Init Response Timeout Counter) 应在上电时初始化为 0,或者当从 LDM 禁用状态 (LDM Disabled) 或 时间戳响应状态 (Timestamp Response) 进入此状态时初始化为 0。如果从 初始化响应状态 (Init Response) 进入此状态,则 初始化响应超时计数器 不应更改。 -
在此状态下:
LDM 协议已启用(LDM Enabled = 1);总线间隔边界的本地副本无效(LDM Valid = 0),且请求者等待触发事件 (Trigger Event)。 -
触发事件 (Trigger Event):
当触发事件发生时,请求者应向响应者发送一个 LDM 时间戳请求 LMP (LDM TS Request LMP),并从本地时间源保存时间戳 t1 到 LDM 上下文 (LDM Context) 中,以记录 LDM 请求的发送时间,然后转移到 初始化响应状态 (Init Response)。请求者 初始化请求状态 (Init Request) 的典型触发事件是设备转换到 地址状态 (Address state)。
8.4.8.3.1.2 初始化响应 (Init Response)
-
进入此状态时:
请求者应递增 初始化响应超时计数器 (Init Response Timeout Counter),启动 响应计时器 (Response Timer),并等待 TS 响应 LMP (TS Response LMP) 或超时。 -
接收到 LDM TS 响应 LMP 且 LCW 延迟 (DL) = 0:
如果接收到 LDM TS 响应 LMP 且 LCW 延迟 (DL) 标志为 0,请求者应从本地时间源保存时间戳 t4 到 LDM 上下文 (LDM Context) 中,以记录 LDM 响应的接收时间,然后计算 LDM 链路延迟 (LDM Link Delay)(参见第 8.4.8.4 节),将 LDM 有效标志 (LDM Valid flag) 设置为 1,并转移到 时间戳请求状态 (Timestamp Request)。 -
接收到 LDM TS 响应 LMP 且 LCW 延迟 (DL) = 1:
如果接收到 LDM TS 响应 LMP 且 LCW 延迟 (DL) 标志为 1,请求者应认为 LDM TS 响应 LMP 的响应延迟字段无效,使 LDM 上下文 (LDM Context) 中的时间戳 t1、t2 和 t3 失效,立即生成一个触发事件以启动另一个交换,并转移到 时间戳请求状态 (Timestamp Request)。有关可能导致延迟位设置的条件,请参见第 7.2.4.1.2 和 7.2.4.1.12 节。 -
初始化响应超时 (1-2):
如果发生初始化响应超时(tLDMRequestTimeout)且 初始化响应超时计数器 小于 3,则请求者应递增 初始化响应超时计数器 并转移到 初始化请求状态 (Init Request)。 -
初始化响应超时 (3):
如果发生初始化响应超时且 初始化响应超时计数器 等于 3,则请求者应转移到 LDM 禁用状态 (LDM Disabled)。
8.4.8.3.1.3 时间戳请求 (Timestamp Request)
-
进入此状态时:
请求者应等待触发事件 (Trigger Event)。 -
触发事件 (Trigger Event):
当触发事件发生时,请求者应向响应者发送一个 LDM 时间戳请求 LMP (LDM Timestamp Request LMP),并从本地时间源保存时间戳 t1 到 LDM 上下文 (LDM Context) 中,以记录 LDM 请求的发送时间,然后转移到 时间戳响应状态 (Timestamp Response)。请求者 时间戳请求状态 (Timestamp Request) 的典型触发事件是首先转移到 时间戳请求状态 (Timestamp Request),或执行一个(平均值)算法以提高链路延迟的准确性。
注意:时间戳 t1 应根据 TS 延迟 (TS Delay) 进行调整。更多信息请参见第 8.4.8.6 节。
8.4.8.3.1.4 时间戳响应 (Timestamp Response)
-
进入此状态时:
请求者应启动 响应计时器 (Response Timer) 并等待 LDM TS 响应 LMP 或超时。 -
接收到 LDM TS 响应 LMP 且 LCW 延迟 (DL) = 0:
如果接收到 LDM TS 响应 LMP 且 LCW 延迟 (DL) 标志为 0,请求者应从本地时间源保存时间戳 t4 到 LDM 上下文 (LDM Context) 中,以记录 LDM 响应的接收时间,然后计算 LDM 链路延迟 (LDM Link Delay)(参见第 8.4.8.4 节),将 LDM 有效标志 (LDM Valid flag) 设置为 1,并转移到 时间戳请求状态 (Timestamp Request)。 -
接收到 LDM TS 响应 LMP 且 LCW 延迟 (DL) = 1:
如果接收到 LDM TS 响应 LMP 且 LCW 延迟 (DL) 标志为 1,请求者应认为 LDM TS 响应 LMP 的响应延迟字段无效,使 LDM 上下文 (LDM Context) 中的时间戳 t1、t2 和 t3 失效,立即生成一个触发事件以启动另一个时间戳交换,并转移到 时间戳请求状态 (Timestamp Request)。有关可能导致延迟位设置的条件,请参见第 7.2.4.1.2 和 7.2.4.1.12 节。 -
响应超时 (Response Timeout):
如果发生响应超时,请求者应转移到 初始化请求状态 (Init Request),此时 LDM 状态机将尝试与响应者重试时间戳交换。注意:时间戳 t4 应根据 TS 延迟 (TS Delay) 进行调整。更多信息请参见第 8.4.8.6 节。
8.4.8.3.1.5 LDM 禁用 (LDM Disabled)
-
进入此状态时:
请求者应清除 LDM_ENABLE 标志并终止所有 LDM 协议活动。 -
CLEAR_FEATURE(LDM_ENABLE):
当设备接收到此请求时,它应从任何其他 LDM 状态转移到 LDM 禁用状态 (LDM Disabled)。 -
SET_FEATURE(LDM_ENABLE):
如果设备接收到此请求,它应转移到 初始化请求状态 (Init Request)。
8.4.8.3.2 响应者操作
本节描述了响应者(即集线器或主机控制器的下游端口)为参与 LDM 协议而执行的操作。
LDM 响应者状态机应维护以下本地变量:响应者响应延迟溢出 (Responder Response Delay Overflow)。
8.4.8.3.2.1 响应者禁用 (Responder Disabled)
这是响应者在上电、热复位或暖复位后的初始状态。
-
进入此状态时:
响应者应终止所有 LDM 协议活动。 -
LDM 已启用 = 0:
如果 LDM 已启用 (LDM Enabled) 等于 0,则响应者应从任何其他 LDM 状态转移到 响应者禁用状态 (Responder Disabled)。 -
LDM 已启用 = 1:
如果 LDM 已启用 (LDM Enabled) 等于 1,则响应者应转移到 时间戳请求状态 (Timestamp Request)。
8.4.8.3.2.2 时间戳请求 (Timestamp Request)
-
进入此状态时:
响应者应等待一个 LDM TS 请求 LMP。 -
接收到 LDM TS 请求 LMP:
如果接收到 LDM TS 请求 LMP,响应者应从 PTM 本地时间源捕获时间戳 t2,以记录接收到 LDM TS 请求的时间,并转移到 时间戳响应状态 (Timestamp Response)。 -
注意:时间戳 t2 应根据 TS 延迟 (TS Delay) 进行调整。更多信息请参见第 8.4.8.6 节。
8.4.8.3.2.3 时间戳响应 (Timestamp Response)
-
进入此状态时:
响应者应等待触发事件 (Trigger Event)。 -
触发事件 (Trigger Event):
当触发事件发生时,响应者应从 PTM 本地时间源捕获时间戳 t3,以记录 LDM 响应发送的时间。如果值 t3 - t2 小于 tLDMResponseDelay,响应者应通过将 响应延迟字段 (Response Delay field) 初始化为值 t3 - t2 来构建一个 LDM TS 响应 LMP,将其发送给请求者,并转移到 时间戳请求状态 (Timestamp Request)。如果值 t3 - t2 等于或大于 tLDMResponseDelay,则响应者应转移到 时间戳请求状态 (Timestamp Request)。响应者 时间戳响应状态 (Timestamp Response) 的典型触发事件是,在接收到 LDM TS 请求 LMP 后,下一个在其下游链路上调度 LDM TS 响应 LMP 的机会。
-
注意:时间戳 t3 应根据 TS 延迟 (TS Delay) 进行调整。更多信息请参见第 8.4.8.6 节。
-
注意:如果调整后的响应延迟值超过 tLDMRequestTimeout,响应者应设置 LCW 延迟 (DL) 标志并重新计算 CRC-5。更多信息请参见第 8.4.8.6 节。
8.4.8.4 LDM 链路延迟 (LDM Link Delay)
LDM 定义了一组支持测量 LDM 链路延迟 的 PTM 功能。
LDM 链路延迟 表示数据包的第一个符号在响应者的下游端口上传输与同一数据包的第一个符号在请求者的上游端口上接收之间的时间延迟。在集线器或设备中,LDM 链路延迟 是通过与其上游响应者的时间戳交换得出的。
请求者可以通过执行多次时间戳交换,利用平均值方法来优化其 LDM 链路延迟 值。
注意:引用接收到的 ITP 的字段或子字段名称应使用下标 (RxITP),引用发送的 ITP 的字段或子字段名称应使用下标 (TxITP)。
8.4.8.4.1 计算
当时间戳交换完成时,请求者将计算 LDM 链路延迟 (LDM Link Delay)。
LDM 链路延迟 是经过调整的测量链路延迟,以确保与非 PTM 感知软件的兼容性。
LMP 传输时间 (LMP Transmission Time) 是传输一个 TP(包括帧和编码)所需的时间,单位为标称 UI。
其中,标称 UI 定义为:
𝑈𝐼_{𝑛𝑜𝑚𝑖𝑛𝑎𝑙} = \frac{(𝑈𝐼_{𝑚𝑎𝑥}) + (𝑈𝐼_{𝑚𝑖𝑛})}{2}
有关 UI_min 和 UI_max 的定义,请参见第 6.7 节。
-
对于运行在 Gen 1x1 速度的链路,LMP 传输时间 为
200UI×UI nominal
(即 5 Gbps 下为 40 ns)。
- 对于运行在 Gen 1x2 的链路,LMP 传输时间 为 20 ns。
- 在 Gen 2x1 速度下运行的链路中,传输一个 TP 需要 164 或 168 UI(取决于块对齐情况),统计平均值为 165 UI。因此,对于运行在 Gen 2x1 速度的链路,LMP 传输时间 为
165UI×UI
nominal
(即 10 Gbps 下为 16.5 ns)。
- 对于运行在 Gen 2x2 的链路,LMP 传输时间 为 8.25 ns。
如果 LDM 有效 (LDM Valid) 为 0,则 LDM 链路延迟 应使用以下公式计算:
𝐿𝐷𝑀_{𝐿𝑖𝑛𝑘 𝐷𝑒𝑙𝑎𝑦} = 𝐿𝑀𝑃_{𝑇𝑟𝑎𝑛𝑠𝑚𝑖𝑠𝑠𝑖𝑜𝑛 𝑇𝑖𝑚𝑒} - 𝑡_{𝐿𝑀𝑃𝑇𝑟𝑎𝑛𝑠𝑚𝑖𝑠𝑠𝑖𝑜𝑛𝐷𝑒𝑙𝑎𝑦}
如果 LDM 有效 (LDM Valid) 为 1,则时间戳交换中接收到的 LDM TS 响应 LMP 会向请求者提供 响应延迟字段 (Response Delay field),该字段定义了从接收到 LDM 请求到响应者发送 LDM 响应之间的时间延迟((t3 - t2))。
当接收到时间戳交换的 LDM TS 响应 LMP 时,请求者已经累积了时间戳 (t1) 和 (t4),可以将其与从响应者接收到的 响应延迟 ((t3 - t2)) 结合,使用以下公式计算 LDM 链路延迟:
𝐿𝐷𝑀_{𝐿𝑖𝑛𝑘 𝐷𝑒𝑙𝑎𝑦} = \frac{(𝑡4 - 𝑡1) - (𝑅𝑒𝑠𝑝𝑜𝑛𝑠𝑒 𝐷𝑒𝑙𝑎𝑦)}{2} + 𝐿𝑀𝑃_{𝑇𝑟𝑎𝑛𝑠𝑚𝑖𝑠𝑠𝑖𝑜𝑛 𝑇𝑖𝑚𝑒} - 𝑡_{𝐿𝑀𝑃𝑇𝑟𝑎𝑛𝑠𝑚𝑖𝑠𝑠𝑖𝑜𝑛𝐷𝑒𝑙𝑎𝑦}
时间戳 (t1)、(t4) 和 响应延迟 表示在 LDM 交换期间捕获的时间戳,如图 8-11 所示。默认的 LMP 传输时间 ((t_{LMPTransmissionDelay})) 将通过链路的实际 LMP 传输时间 进行校正。在 LDM 链路延迟 计算完成后,请求者 LDM 上下文 中的时间戳 (t1) 和 (t4) 将被下一个时间戳交换的值覆盖。
8.4.8.5 PTM 总线间隔边界设备计算
设备在接收到 ITP 时计算总线间隔边界。
一个 ITP 向设备提供三个值:
-
总线间隔计数器 (Bus Interval Counter(RxITP)) 子字段包含当前帧号。
-
Delta(RxITP) 子字段 包含从当前接收到的 ITP 的起始位置到前一个总线间隔边界的时间延迟。
-
Correction(RxITP) 字段 包含 ITP 在通过集线器时累积的任何负延迟。
如果 Delta(RxITP) 大于或等于 7500,设备应忽略该 ITP。
如果 Delta(RxITP) 小于 7500,设备应应用 Delta(RxITP) 和 Correction(RxITP) 值以及 LDM 链路延迟(从之前的 TS 交换中确定),以在接收到 ITP 时(tITUFP)设置 PTM Delta 计数器的值,使用以下公式:
PTM\ Delta\ Counter(tITUFP) = MODULUS(ISOCH\_DELAY + LDM\ Link\ Delay + Delta(RxITP) - Correction(RxITP), 7500)
其中,MODULUS(number, divisor) 返回 number 被 divisor 除后的整数余数,ISOCH_DELAY 是通过 SET_ISOCH_DELAY 请求写入设备的值。
同时,设备应使用 ITP 中接收到的 Bus Interval Counter(RxITP) 和 Delta(RxITP) 子字段的值,在接收到 ITP 时(tITUFP)设置 PTM 总线间隔计数器的值,使用以下公式:
PTM\ Bus\ Interval\ Counter(tITUFP) = Bus\ Interval\ Counter(RxITP) + ROUNDDOWN((LDM\ Link\ Delay + Delta(RxITP)) / 7500)
其中,ROUNDDOWN(n) 将 n 向下取整为最接近的整数值。
这种设置 PTM Delta 计数器和 PTM 总线间隔计数器的组合定义了设备中的总线间隔边界时间。
设备内部的时间同步机制(例如,与 PTM 本地时间源同步)是特定于实现的。
图 8-12 展示了 ITP 事务的 tITUFP 和 tITDFP 时间点。
8.4.8.6 PTM 总线间隔边界主机计算
主机应维护一个 PTM Delta 计数器和一个 PTM 总线间隔计数器。主机应使用这些当前值来填充 ITP 的等时时间戳 总线间隔计数器(TxITP) 和 延迟(TxITP) 字段,并将 校正(TxITP) 字段设置为零,以发送下游 ITP。
8.4.8.7 PTM 集线器 ITP 再生
集线器应维护一个由 PTM 时钟递增的 ITP 延迟计数器。
如果支持 PTM 的集线器接收到一个 ITP 且 延迟 (DL) 位未被设置,则集线器应应用以下规则:
- 将 ITP 延迟计数器 设置为零。
支持 PTM 的集线器应针对每个处于 U0 状态的下游端口独立应用以下规则:
- 当接收到一个 ITP 时,集线器应为该下游端口排队一个待传输的 ITP。
- 当传输一个 ITP 时,集线器应:
-
将 Bus Interval Boundary(RxITP) 的值复制到下游 ITP 的等时时间戳字段中的 Bus Interval Boundary(TxITP) 子字段。
-
使用以下方法计算 Delta(TxITP) 子字段的值:
使用以下公式确定在 ITP 应发送的时间(tITPDFP)处的 Delta 值:Delta(tITPDFP) = LDM\ Link\ Delay + Delta(RxITP) + (ITP\ Delay\ Counter – wHubDelay) – Correction(RxITP)
其中,Delta(tITPDFP) 是时间 tITPDFP 处的 Delta 值。
- 如果 Delta(tITPDFP) 大于或等于零且小于 7500,集线器应将 Delta(TxITP) 设置为等于 Delta(tITPDFP),并将 Correction(TxITP) 值设置为零。
- 如果 Delta(tITPDFP) 大于或等于 7500,集线器应将 Delta(TxITP) 设置为 7500。
- 如果 Delta(tITPDFP) 为负值,集线器应将 Delta(TxITP) 设置为零,并使用以下公式计算 Correction(TxITP) 值:
Correction(TxITP) = – Delta(tITPDFP)
- 重新计算修改后的 ITP 的 CRC-16。
如果支持 PTM 的集线器接收到一个 ITP 且 延迟 (DL) 位被设置,则集线器应应用以下规则:
- 不做任何修改地转发接收到的 ITP。
ITP 中使用的等时时间戳值应为传输时的实际值;例如,如果在 ITP 被排队时还有其他数据包正在等待传输,则使用的值不应是排队时的值,而应调整为实际传输时间(tITPDFP)。更多信息请参见第 8.4.8.6 节。
8.4.8.8 性能
图 8-16 展示了构成 LDM 交换路径的各种组件,这些组件对 LDM 机制的整体性能有所贡献。
- 请求者到响应者路径 和 响应者到请求者路径 分别适用于 LDM TS 请求和 TS 响应 LMP。
- 请求者接收路径 适用于由上游端口接收到的 ITP,响应者发送路径 适用于由下游端口发送的 ITP。
为实现最佳传播延迟测量,应满足以下要求:
-
请求者与响应者之间的链路延迟应是对称的。
-
时间戳值被分配给 ITP 或 TS LMP,以捕获数据包实际在链路上接收或传输的时间。LDM 时间戳值也会在 ITP(总线间隔计数器/增量字段)和 TS 响应 LMP(响应延迟)传输时被捕获。
-
在将时间戳值分配给 ITP 或 LDM LMP 与数据包实际在链路上接收或传输之间,会发生一个与实现相关的 TS 延迟 (TS Delay)。每个时间戳值都应针对相应的 TS 延迟 进行调整,以便为 LDM LMP 或 ITP 捕获的时间戳能够近似于相应数据包的最后一个符号跨越请求者或响应者与链路边界的时间。
-
端口的时间戳机制或协议路径中可能存在不对称延迟(例如 Rx/Tx 不对称)。如果这些不对称性不可忽略:
- 响应者应对 TS 响应 LMP 的响应延迟(t3 - t2 时间戳)值进行适当调整,以补偿其 Rx/Tx 不对称性,使得其 t2 和 t3 时间戳看起来是在距离链路边界相等的 TS 延迟 处捕获的。
- 请求者在计算 t4 时间戳时应考虑其 Rx/Tx 不对称性。
-
在 LDM 请求和响应 LMP 之间的时间间隔内,请求者与响应者之间的链路延迟应保持恒定。
-
时间戳的最坏情况延迟波动(不确定性)应受 tPropagationDelayJitterLimit 限制。
-
由于链路组件和时钟内部协议栈导致的时间戳延迟波动(不确定性) 应通过以下两种技术减少:
- PTM 中使用的 时间戳测量平面 (Timestamp Measurement Planes) 应尽可能靠近物理链路边界生成,具体取决于给定时钟实现,即最小化 TS 延迟 (TS Delay)。
- 协议栈和链路组件引入的剩余延迟波动(不确定性)可以通过对多次时间戳交换的链路延迟值进行平均来减少。平均算法超出了本规范的范围。
-
时钟振荡器的固有稳定性和精度必须符合表 6-18 中为单位间隔 (Unit Interval) 定义的时钟精度要求。
实现说明
LDM 时间戳捕获机制
LDM 使用数据链路层和事务层的服务。LDM 的精度要求时间测量尽可能靠近物理层进行。相反,消息协议本身属于事务层。LDM 消息协议适用于单个链路,其中上游端口是请求者,下游端口是响应者。
对于大多数实现,事务层和数据链路层中的逻辑本质上是非确定性的。实现细节和当前条件对特定数据包何时遇到特定处理步骤有很大影响。这实际上使得在这些层中无法捕获准确记录特定物理事件时间的时间戳。
理想情况下,时间测量应以符号级精度进行,尽可能靠近发送差分驱动器模块(图 6-2 中的 D+/D- 输出)或差分接收器与均衡模块(图 6-3 中的 D+/D- 输入)。通常,这需要特定于实现的调整,以补偿无法直接测量实际引脚处时间的问题,因为时间通常会在 Rx 或 Tx 路径中的某个内部点被测量(即时间戳被捕获)。设计者应通过其记录的时间戳值和生成的时间值(例如 LDM TS 响应中的响应延迟值)适当地近似并适应这些延迟。本规范不对这种测量的精度和一致性设限,但强烈建议实现尽可能高的精度和一致性。
8.4.8.9 LDM 规则
响应者应根据以下规则对每个 LDM 请求 LMP 用 LDM 响应 LMP 进行响应:
-
响应者在未接收到 LDM 请求 LMP 之前不得发送 LDM 响应。
-
响应者在发送 LDM 响应和接收 LDM 请求 LMP 时,应捕获 PTM 本地时钟源的时间戳(t2 和 t3)。
-
当响应者拥有填充 LDM 响应 LMP 所需的时间值时,应发出 LDM 响应 LMP:时间戳(图 8-11 中的 t2 - t3)。
-
请求者应在发送 LDM 请求的最后一个符号时捕获 t1 时间戳。
-
响应者应在接收到 LDM 请求的最后一个符号时捕获 t2 时间戳。
-
响应者应在发送 LDM 响应的最后一个符号时捕获 t3 时间戳。
-
请求者应在接收到 LDM 响应的最后一个符号时捕获 t4 时间戳。
注意:这些规则假设图 8-16 中的 Tx 和 Rx TS 延迟为零,即时间戳测量平面与 TS LMP 链路边界的发送和接收时间相同。有关如何调整实际时间戳延迟的信息,请参见第 8.4.8.8 节。
8.4.8.10 LDM 与集线器
集线器既是请求者又是响应者,并充当其上游端口和下游端口之间的中介。作为请求者,集线器利用 PTM LDM 机制在其上游端口发出 LDM 请求,以识别其自身与其上游响应者之间的 LDM 链路延迟。集线器利用 PTM HDM 机制更新其转发到下游的 ITP 的等时时间戳。
集线器实现中具有 LDM 已启用 (LDM Enabled) 和 LDM 有效 (LDM Valid) 标志。它们的状态由集线器的请求者状态机决定。集线器的响应者状态机中的 LDM 已启用 或 LDM 有效 标志会跟踪请求者状态机的值;例如,如果请求者状态机中的 LDM 已启用 或 LDM 有效 转换为 0,则集线器的所有响应者状态机都应转换为 响应者禁用状态 (Responder Disabled)。当请求者状态机中的 LDM 已启用 和 LDM 有效 都转换为 1 时,集线器的所有响应者状态机都应转换为 初始化请求状态 (Init Request)。集线器不会为每个下游端口的响应者状态机单独设置 LDM 已启用 或 LDM 有效 标志。
USB 拓扑从根集线器端口向下枚举;即集线器必须处于 已配置状态 (Configured state),其下游端口才能激活。PTM 时间参数的选择应确保在典型的枚举序列中,在集线器转换到 已配置状态 之前,LDM 链路延迟已经建立。这意味着,集线器的响应者状态机应在下游端口运行时立即进入 初始化请求状态 (Init Request),且无需软件干预即可启用 LDM。如果连接到下游端口的设备的请求者无法及时建立 LDM 链路延迟,则它可能会转换为 LDM 禁用状态 (LDM Disabled) 并需要软件手动启动 LDM 交换。另一种方法是,支持 PTM 的枚举软件可以在配置支持 PTM 的集线器之前验证其是否已建立 LDM 链路延迟。
8.4.8.11 链路延迟测量 (LDM) LMP
LDM LMP 应用于 LDM 时间戳交换中,以测量上游端口的链路延迟。
表 8-11. LDM LMP
宽度 (位) | 偏移量 (DW:位) | 描述 |
---|---|---|
4 | 0:5 | SubType。此字段应设置为精确时间测量。 |
3 | 0:9 | LDM 类型。此字段标识 LDM LMP 的类型。如果 LDM 请求 LMP 发起 LDM 时间戳交换,则此字段应设置为 TS 请求。 值 描述 0 TS 请求 - 发起 LDM 时间戳交换。 1 TS 响应 - 完成时间戳交换。携带时间信息。 2-3 保留 |
2 | 0:12 | LDM 序列号 (LDMS)。此字段标识 LDM 交换的序列号。此字段的值应由请求者在 LDM 请求中设置,并由响应者在关联的 LDM 响应中返回。请求者可以使用此值明确验证响应 LMP 是否与交换的请求 LMP 相关联。此值应在请求者发起的每次交换中递增。 |
14 | 1:0 | 响应延迟。在 LDM 响应 LMP 中,此字段应以 tIsochronousTimeStampGranularity 单位报告接收到 LDM 请求的最后一个符号与传输关联 LDM 响应的最后一个符号之间的延迟。 |
8.5 事务包 (TP)
事务包(TP)在主机和设备之间的直接路径上传输。TP用于控制数据流和管理端到端连接。Type字段的值应设置为事务包。Route String字段由集线器用于将出现在其上游端口的数据包路由到正确的下游端口。设备发送的TP的Route String字段设置为零。当主机发送TP时,Device Address字段包含目标接收者的地址。当设备发送TP到主机时,它将Device Address字段设置为自己的地址。主机使用该字段来识别TP的来源。TP中的SubType字段由接收者用于确定TP的格式和用途。
表8-12 事务包(TP)的子类型字段
宽度 (位) | 偏移 (DW:位) | 描述 |
---|---|---|
4 | 1:0 | 子类型。子类型字段用于识别特定类型的事务包 (TP)。 |
值 TP类型 | ||
0000b Reserved | ||
0001b ACK | ||
0010b NRDY | ||
0011b ERDY | ||
0100b STATUS | ||
0101b STALL | ||
0110b DEV_NOTIFICATION | ||
0111b PING | ||
1000b PING_RESPONSE | ||
1001b – 1111b 保留 |
8.5.1 确认 (ACK) 事务包
ACK事务包用于两个目的:
- 对于IN端点,主机发送ACK事务包以请求设备的数据,并确认之前接收到的数据包。
- 对于OUT端点,设备发送ACK事务包以确认接收到主机发送的前一个数据包,并告知主机在接收到该数据包后可用的数据包缓冲区数量。
Table 8-13. ACK TP 格式
位宽(bits) | 偏移(DW:bit) | 字段名称 | 中文说明 |
---|---|---|---|
20 | 0:5 | 路由字符串 / 保留字段 | 仅由集线器使用。结合集线器深度,用于将数据包路由到正确的下游端口。设备发送时该字段为保留字段。详见规范第 8.9 节。 |
7 | 0:25 | 设备地址(Device Address) | 指定该事务包(TP)的目标或来源设备地址。详见规范第 8.8 节。 |
4 | 1:0 | 子类型(SubType) | 对于 ACK 类型的事务包,该字段应设置为 ACK。 |
2 | 1:4 | 保留字段(Reserved) | 保留字段,无需设置。 |
1 | 1:6 | 重试数据包(rty) | 表示主机或设备未收到或收到损坏的数据包,请求发送方从指定序列号开始重发数据包。 |
1 | 1:7 | 方向(Direction, D) | 指示该事务包的源或目标端点的方向。详见规范第 8.8 节。 Value Direction of Data Flow 0b Host to Device 1b Device to Host |
4 | 1:8 | 端点number(Ept num) | 该字段用于确定设备中的一个端点,该端点是此 TP(Transaction Packet)的来源或接收方。详见第 8.8 节。 |
3 | 1:12 | Transfer 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 对于来自 SuperSpeed 总线实例的 ACK 和延迟数据包(Deferred DPs),表示未知(Unknown);对于所有其他 ACK 和 DPs,此值为保留。详见第 10 章。 |
1 | 1:15 | Host Error (HE) | 仅当 ACK TP 从主机发送到设备时该字段有效。若主机因内部问题无法接收有效数据包,则设置此位。对于非等时传输,若设置此位,还必须设置 Retry Data Packet 字段。 |
5 | 1:16 | 数据包数量 (NumP) | 表示接收方可接受的数据包缓冲区数量。该值必须小于或等于端点在 Endpoint Companion Descriptor 的 bMaxBurst 字段中声明的最大突发大小(详见第 9.6.7 节)。 |
5 | 1:21 | 序列号 (Seq Num) | 表示接收方期望接收的下一个数据包的序列号。 |
5 | 1:26 | Reserved | 保留位,未定义用途。 |
1 | 1:31 | TP Follows (TPF) | 在 SuperSpeed 模式下为保留位。在 SuperSpeedPlus 模式下,仅当设备打算在此 TP 后发送一个 Device Notification TP 时才设置此位。 |
16 | 2:0 | Stream ID / Reserved | 若该 ACK TP 目标是支持 Stream 的 Bulk 端点(即 Stream 管道),此字段包含 1 到 65535 之间的 Stream ID。值为 0 是保留的,若收到值为 0 的 TP,则视为无效。其他类型的管道应将此字段视为保留。若 Bulk 端点不支持 Stream,此字段应设置为 0。详见第 8.12.1.4 节。 |
8 | 2:16 | Reserved | 保留位,未定义用途。 |
1 | 2:24 | Support Smart Isochronous (SSI) | 本版本规范中已弃用该字段,应视为保留(Reserved)。仅对等时(ISO)端点有效。对于 OUT 端点,只有当该字段为 1 且 lpf 字段为 0 时,DBI 、WPA 和 NBI 字段才有效。对于 IN 端点,主机不设置 lpf 字段,因此只需设置 SSI 字段以表示支持智能等时调度。该字段通知设备主机控制器支持高级等时调度功能,设备可利用此功能在主机轮询服务间隙期间将链路切换至低功耗状态。若主机向 OUT 端点传输数据,必须确保仅在 lpf 为 0 时设置该字段为 1;若两者同时为 1,设备行为未定义。若主机从 IN 端点接收数据,且设备响应的 DP 中 lpf 为 1,则设备可忽略该字段及相关字段,仅等待主机再次 PING。 |
1 | 2:25 | Will Ping Again (WPA) / Reserved | 本版本规范中已弃用该字段,应视为保留。仅对 ISO 端点有效,且仅当 SSI 字段为 1 时有效。若该字段为 1,表示主机控制器将在再次服务该端点前发送一个 PING TP。 |
1 | 2:26 | Data in this Bus Interval is done (DBI) / Reserved | 本版本规范中已弃用该字段,应视为保留。仅对 ISO 端点有效,且仅当 SSI 字段为 1 时有效。若该字段为 1,表示主机控制器在当前总线周期内已完成对该端点的所有事务。注意:若同时设置了 WPA 字段,设备可忽略该字段的值,因为主机会在恢复事务前发送 PING。 |
1 | 2:27 | Packets Pending (PP) | 仅由主机设置。若该字段为 1,表示主机准备好接收来自该端点或 Stream 的另一个数据包(DP)。端点由 Endpoint Number 和 Direction 字段标识;若为 Stream 端点,则由 Stream ID 字段进一步标识。若该字段为 0,表示主机不准备接收更多数据包。若设备上所有端点均无待处理数据包,设备可利用此信息将上行链路切换至低功耗状态(如 U1 或 U2)。 |
4 | 2:28 | Number of Bus Intervals (NBI) / Reserved | 本版本规范中已弃用该字段,应视为保留。仅对 ISO 端点有效,且仅当 SSI 为 1、WPA 为 0 且 DBI 为 1 时有效。该字段表示主机控制器将在当前总线周期之后的第 NBI + 1 个周期内再次服务该端点。 |
8.5.2 NRDY(Not Ready)事务包
此事务包(TP)只能由设备为非等时(non-isochronous)端点发送。
- 对于 OUT 端点,如果设备没有可用的数据包缓冲区来接收主机发送的数据包(DP),则发送此 TP 给主机。
- 对于 IN 端点,如果设备无法在主机发送 ACK TP 后返回数据包(DP),也会发送此 TP。
本节仅描述与 ACK TP 不同的字段。
表 8-14:NRDY TP 格式
位宽(bits) | 偏移位置(DW:bit) | 字段名 | 中文说明 |
---|---|---|---|
4 位 | 1:0 | SubType | 此字段应设置为 NRDY,表示该事务包为“未就绪”类型。 |
3 位 | 1:4 | 保留(Reserved) | 保留字段,未定义用途。 |
20 位 | 1:12 | 保留(Reserved) | 保留字段,未定义用途。 |
5 位 | 2:27 | 保留(Reserved) | 保留字段,未定义用途。 |
8.5.3 端点就绪(ERDY)事务包
此事务包(TP)只能由设备为非等时(non-isochronous)端点发送。
它用于通知主机:某个端点已经准备好发送或接收数据包(DP)。
本节仅描述与 ACK TP 不同的字段。
表:ERDY TP 格式(与 ACK TP 的差异)
位宽(bits) | 偏移位置(DW:bit) | 字段名 | 中文说明 |
---|---|---|---|
4 位 | 1:0 | SubType | 此字段应设置为 ERDY,表示该事务包为“端点就绪”类型。 |
3 位 | 1:4 | 保留(Reserved) | 保留字段,未定义用途。 |
4 位 | 1:12 | 保留(Reserved) | 保留字段,未定义用途。 |
5 位 | 1:16 | Number of Packets (NumP) | 对于 OUT 端点,请参考表 8-13 中对该字段的描述。 对于 IN 端点,该字段由端点设置,表示当主机恢复对该端点的事务时,端点可以发送的数据包数量。该值不得大于端点在 Endpoint Companion Descriptor 中 bMaxBurst 字段所声明的最大突发大小。注意:主机可能仅将该字段的值视为参考信息。 |
11 位 | 1:21 | 保留(Reserved) | 保留字段,未定义用途。 |
5 位 | 2:27 | 保留(Reserved) | 保留字段,未定义用途。 |
8.5.4 状态事务包(STATUS Transaction Packet)
此事务包(TP)只能由主机发送。
它用于通知一个 控制端点(control endpoint),主机已经启动了控制传输的 状态阶段(Status Stage)。
此 TP 只能发送给控制端点。
本节仅描述与 ACK TP 不同的字段。
表 8-16:STATUS TP 格式(与 ACK TP 的差异)
位宽(bits) | 偏移位置(DW:bit) | 字段名 | 中文说明 |
---|---|---|---|
4 位 | 1:0 | SubType | 此字段应设置为 STATUS ,表示该事务包为“状态阶段”类型。 |
3 位 | 1:4 | 保留(Reserved) | 保留字段,未定义用途。 |
52 位 | 1:12 | 保留(Reserved) | 保留字段,未定义用途 |
8.5.6 设备通知(DEV_NOTIFICATION)事务数据包
此事务数据包只能由设备发送。设备使用它来通知主机设备或接口状态的异步变化,例如,用于识别在设备执行远程唤醒操作时导致该操作的功能。此事务数据包不是从某个特定的端点发送的,而是从整个设备发送的。仅描述与 ACK 事务数据包不同的字段。
表 8‑18 设备通知事务数据包格式(与 ACK TP 的区别)
位宽 (bits) | 偏移量 (DW:bit) | 描述 |
---|---|---|
4 | 1:0 | 子类型 (SubType)。该字段应设置为 DEV_NOTIFICATION (设备通知)。 |
4 | 1:4 | 通知类型 (Notification Type)。该字段标识设备通知的类型: 值 通知包类型 0000 保留 (Reserved) 0001 功能唤醒 (FUNCTION_WAKE) 0010 延迟容忍消息 (LATENCY_TOLERANCE_MESSAGE) 0011 总线间隔调整消息 (BUS_INTERVAL_ADJUSTMENT_MESSAGE) 0100 主机角色请求 (HOST_ROLE_REQUEST)1 0101 子链路速度 (SUBLINK_SPEED)2 0110 – 1111 保留 (Reserved) |
- 此通知类型值应保留供 OTG 使用。有关相应设备通知传输包 (TP) 的定义,请参阅 USB 3.0 OTG and EH Supplement (USB 3.0 OTG 和 EH 补充规范) 的第 5.5 节。
- 对于在 SuperSpeedPlus 模式下运行的设备,必须要求此设备通知。对于在 SuperSpeed 模式下运行的设备,此设备通知是可选的。
8.5.6.1 功能唤醒设备通知 (Function Wake Device Notification)
图 8-24. 功能唤醒设备通知
宽度 (位) | 偏移(DW:bit) | 描述 |
---|---|---|
4 | 1:0 | SubType。此字段应设置为 DEV_NOTIFICATION。 |
4 | 1:4 | 通知类型(Notification Type)。应为 FUNCTION_WAKE。 |
8 | 1:8 | 接口(Interface)。该字段标识引发设备进行远程唤醒操作的功能中的第一个接口。 |
48 | 1:16 | 保留(Reserved)。 |
8.5.6.2 延迟容忍消息(LTM)设备通知
延迟容忍消息设备通知是一项可选的规范性功能,可实现更高能效的平台运行。
图 8-25. 延迟容忍消息设备通知
位宽 (bits) | 偏移量 (DW:bit) | 描述 |
---|---|---|
4 | 1:0 | 子类型 (SubType):该字段应设置为 DEV_NOTIFICATION(设备通知)。 |
4 | 1:4 | 通知类型 (Notification Type):LATENCY_TOLERANCE_MESSAGE(延迟容忍消息)。 |
12 | 1:8 | BELT:表示设备在遇到意外操作副作用前可等待服务的纳秒时间。 比特位 描述 9:0 延迟值 (LatencyValue, ns) 11:10 延迟比例因子 (LatencyScale) 值 操作 00b 保留 01b 延迟值 × 1024 10b 延迟值 × 32,768 11b 延迟值 × 1,048,576 |
44 | 1:20 | 保留字段 |
8.5.6.3 总线间隔调整消息设备通知
此功能已弃用
位宽 (bits) | 偏移量 (DW:bit) | 字段名称 | 描述 |
---|---|---|---|
4 | 1:0 | 子类型 (SubType) | 该字段应设置为 DEV_NOTIFICATION(设备通知)。 |
4 | 1:4 | 通知类型 (Notification Type) | BUS_INTERVAL_ADJUSTMENT_MESSAGE(总线间隔调整消息)。 (此功能已弃用) |
8 | 1:8 | 保留 | 保留字段 |
16 | 1:16 | 总线间隔调整 (Bus Interval Adjustment) | 此字段为二进制补码值,范围 -32768 至 +32767,以总线间隔调整粒度单位表示。 |
8.5.6.4 功能唤醒通知
功能(设备)可通过向主机发送功能唤醒设备通知来发出信号,表明其希望从设备挂起状态(在链路转换到U0之后)或功能挂起状态退出,前提是已启用远程唤醒功能。更多详细信息请参阅第9.2.5节。
8.5.6.5 延迟容忍消息传递
延迟容忍消息传递是一种可选的规范性USB电源管理功能,它利用报告的BELT(尽力而为延迟容忍)值来实现更高能效的平台运行。
BELT值是指主机在考虑所有已配置端点服务需求的情况下,设备可承受无主机服务的最大时间。具体而言,BELT值是指从主机接收到设备发出的ERDY(Endpoint Ready)到主机发送对该ERDY的响应之间的时间间隔。
设备通过BOS描述符中的SUPERSPEED_USB设备能力描述符(参见第9.6.2节)的LTM Capable字段来表明其是否支持发送LTM(Latency Tolerance Messaging)事务包(TP)。LTM Enable(参见第9.4.9节)功能选择器用于启用(或禁用)支持LTM的设备发送LTM TP。
8.5.6.5.1 可选的规范性LTM和BELT要求
通用设备要求:
- LTM TP应仅由外围设备发起。
- LTM TP适用于除等时端点外的所有端点类型。对于中断端点,BELT值仅在端点处于流控状态时适用。
- 一旦设备向主机发送了BELT值,该设备的所有已配置端点应预期在指定的BELT时间内得到服务。
- 设备应在LTM_Enable状态发生任何变化后的tMinLTMStateChange规定时间内,发送一个BELT字段值为tBELTdefault的LTM TP。
- 设备应确保其BELT值的确定频率足够高,以便在需要更改BELT值之前能够合理估计设备的服务延迟容忍度。此外,还应满足以下条件:
- LTM TP的最大数量受tBeltRepeat限制。
- 每个LTM TP应具有不同的BELT值。
- 系统默认所有设备的BELT值为1毫秒(参见表8-36)。
- BELT的最小值为1毫秒(参见表8-36)。
BELT值确立的设备要求:
- LTM机制应利用U1SEL和U2SEL为设备提供系统延迟信息(参见第9.4.16节——Set SEL)。在此上下文中,系统延迟是指当设备发送ERDY时,到其从主机接收到事务包(类型取决于方向)之间的时间,此时允许的最深链路状态为U1或U2。设备应使用这些值来适当调整其BELT值,同时考虑其在USB链路拓扑中的位置。
- 允许链路进入U1但不允许进入U2的设备,应从其总延迟容忍度中减去U1系统退出延迟(U1SEL),并将结果值作为LTM TP中BELT字段的值发送。
- 允许链路进入U1和U2的设备,应从其总延迟容忍度中减去U2系统退出延迟(U2SEL),并将结果值作为LTM TP中BELT字段的值发送。
8.5.6.6 总线间隔调整消息
此功能已弃用。
总线间隔调整消息仅可由运行在SuperSpeed模式下的设备发送,并且在不以SuperSpeed模式运行的总线实例上,主机应忽略此消息。
该设备通知可由设备发送,以请求增加或减少总线间隔长度。这通常用于设备尝试将主机的总线间隔时钟与外部时钟同步的情况。总线间隔调整请求是相对于当前总线间隔的。例如,如果设备请求增加一个BusIntervalAdjustmentGranularity单位,随后又请求增加两个BusIntervalAdjustmentGranularity单位,则主机的总体调整量应为三个BusIntervalAdjustmentGranularity单位。
主机应支持在−37268至+37267个BusIntervalAdjustmentGranularity单位的绝对范围内进行调整。设备每八个总线间隔内不得请求超过一次调整。设备在未等待足够时间以准确观察前一次总线间隔调整请求对后续ITP(Isochronous Timestamp Packet)中时间戳值的影响之前,不得发送另一个总线间隔调整请求。设备不得单次请求超过±4096个单位的BusIntervalAdjustment调整。但设备可以随时间多次发送调整请求,累计调整量可超过4096个单位。除非设备在过去125μs内接收到ITP,且该ITP的Bus Interval Adjustment Control字段值为零或设备地址,并且设备处于Address或Configured状态,否则设备不得请求总线间隔调整。
同一时间仅有一个设备可控制总线间隔长度。主机控制器采用先到先服务策略处理总线间隔调整请求,如本节所述。主机控制器开始运行时,应在ITP中设置Bus Interval Adjustment Control字段为零。当主机控制器首次接收到总线间隔调整控制请求时,应在后续ITP中将Bus Interval Adjustment Control字段设置为发送请求的设备地址。一旦该字段设置为非零地址,主机应忽略所有其他设备的总线间隔调整请求。如果控制设备断开连接,主机控制器应将该字段重置为零。主机控制器可提供一种方式,供软件覆盖默认的总线间隔调整控制字段行为,并选择控制设备。主机控制器应在接收到总线间隔调整请求后的两个总线间隔内开始应用调整。
最小的总线间隔调整(一个BusIntervalAdjustmentGranularity单位)要求主机平均每4096个总线间隔调整8个高速比特时间。主机可在单个总线间隔内完成此调整,使得用于生成ITP时间和总线间隔边界的时钟周期无需小于8个高速比特时间。主机应定期进行总线间隔调整。当主机需要平均每4096个总线间隔调整8个或更多高速比特时间时,调整应按照以下约束均匀分布:
- 包含比其他间隔多8个高速比特时间调整的间隔称为最大调整总线间隔。
- 任何总线间隔内的调整量不得比其他间隔多超过8个高速比特时间。
- 连续最大调整总线间隔之间的总线间隔距离变化不得超过1个总线间隔。
总线间隔调整的均匀分布和平均调整要求,应从主机接收到总线间隔调整请求后的第一个总线间隔开始生效,直至主机接收到后续有效总线间隔调整请求的总线间隔为止。
以下为特定总线间隔调整请求的有效主机行为示例:
系统上电后,主机在总线间隔X-1接收到减少10个总线间隔调整粒度单位的调整请求。主机控制器使用周期为8个高速比特时间的时钟驱动计数器以生成时间戳和总线间隔边界。主机控制器在以下每个总线间隔中为其计数器额外添加一个8高速比特时间的时钟节拍:
X+409, X+819, X+1228, X+1638, X+2048, X+2457, X+2867, X+3276, X+3686, X+4096, X+4505,…
8.5.6.7 子链路速度设备通知
设备通过子链路速度设备通知事务包(TP) 上报其链路连接特性。运行在SuperSpeedPlus模式下的增强型SuperSpeed设备在进入Address USB设备状态时,应生成此类TP。
计算规则:
- 通道速度 = 通道速度尾数 × 1000通道速度指数
- 子链路速度 = 通道速度 × (通道数量 + 1)
流程要求:
- 设备应在状态阶段ACK TP中设置TP跟随标志(TPF),以通知主机在SET_ADDRESS请求后需发送设备通知TP。
- 接收子链路速度设备通知TP(Rx Sublink Speed Device Notification TP) 应作为设备在状态阶段ACK TP设置TPF标志后发送的下一个TP。
- 设备应在Rx子链路速度设备通知TP中设置TPF标志,以通知主机需在此TP后发送第二个设备通知TP。
- 发送子链路速度设备通知TP(Tx Sublink Speed Device Notification TP) 应作为设备在Rx子链路速度设备通知TP设置TPF标志后发送的下一个TP。
链路对称性要求:
- 非对称通道类型仅可由SuperSpeed片间互联(SSIC)设备上报。
- 对称链路指接收(Rx)与发送(Tx)子链路具有相同通道速度和通道数量的链路。
- 增强型SuperSpeed设备应仅支持对称链路。
位宽 (比特) |
偏移量 (双字:位) |
描述 |
---|---|---|
4 | 1:0 | 子类型 (SubType) 该字段应设置为 DEV_NOTIFICATION |
4 | 1:4 | 通知类型 (Notification Type) SUBLINK_SPEED |
23 | 1:8 | 保留 |
2 | 2:4 | 通道速度指数 (LSE) 定义基数为1000的指数,用于计算本子链路速度设备通知表示的最大通道速度时应用于通道速度尾数(LSM) 值 | 描述 00b | 比特/秒 01b | 千比特/秒(Kb/s) 10b | 兆比特/秒(Mb/s) 11b | 吉比特/秒(Gb/s) |
2 | 2:6 | 子链路类型 (ST) 标识本通知定义的是对称还是非对称比特率,并指示定义的是接收还是发送比特率 注:子链路速度属性需成对出现(Rx后紧跟Tx),且两者的SSID值必须相同 位 | 值 | 描述 0 | 0 | 对称:Rx与Tx子链路通道数相同且速率相同 0 | 1 | 非对称:Rx与Tx子链路通道数和/或速率不同 1 | 0 | 子链路工作在接收模式 1 | 1 | 子链路工作在发送模式 |
2 | 2:8 | 保留 |
4 | 2:10 | 通道数量 (Lanes) 标识子链路的通道数(从0计数:0=1通道,1=2通道,以此类推) |
2 | 2:14 | 链路协议 (LP) 标识链路支持的协议 值 | 描述 00b | 保留 01b | SuperSpeedPlus 10b-11b | 保留 |
16 | 2:16 | 通道速度尾数 (LSM) 定义尾数,在计算本通知表示的通道速度时应用于LSE |
注意:
本规范包含支持SSIC(SuperSpeed片间互联)能力的特性,例如非对称链路速度与多通道配置。
但Enhanced SuperSpeed总线不支持非对称链路速度。Enhanced SuperSpeed设备应仅将子链路类型设置为对称模式。
8.5.7 PING事务包
该事务包(TP)仅可由主机发送。主机通过此TP在发起等时传输前,将路径中至目标设备的所有链路切换回U0状态。关于此TP的使用详情,请参阅附录C。本节仅描述与ACK TP不同的字段。
设备应在tPingResponse时间内(参见表8-36)向主机发送PING_RESPONSE TP(参见第8.5.8节)以响应PING TP。需注意,设备无需验证EP_NUM和Direction字段,仅需将其原样复制到PING_RESPONSE TP的对应字段中。
设备应保持其链路处于U0状态,直至收到主机的后续数据包或tPingTimeout超时(参见表8-36)。
位宽 (比特) |
偏移量 (双字:位) |
描述 |
---|---|---|
4 | 1:0 | 子类型 (SubType) 该字段应设置为 PING |
3 | 1:4 | 保留 |
52 | 1:12 | 保留 |
8.5.8 PING_RESPONSE 事务包
该事务包(TP)仅可由设备发送,用于响应主机发出的 PING TP。针对每个接收到的 PING TP,设备均应发送一个 PING_RESPONSE TP。关于此 TP 的使用详情,请参阅附录 C。本节仅描述与 ACK TP 不同的字段。
位宽 (比特) |
偏移量 (双字:位) |
描述 |
---|---|---|
4 | 1:0 | 子类型 (SubType) 该字段应设置为 PING_RESPONSE |
3 | 1:4 | 保留 |
1 | 1:7 | 方向 (D) 该字段应设置为所响应的 PING TP 中 Direction 字段的值 |
4 | 1:8 | 端点号 (Ept Num) 该字段应设置为所响应的 PING TP 中 Ept Num 字段的值 |
52 | 1:12 | 保留 |
8.6 数据包(DP)
该数据包可由主机或设备发送。主机使用此数据包向设备发送数据;设备则使用此数据包响应ACK事务包(TP)向主机返回数据。所有数据包均由数据包头和数据包有效载荷组成。本节仅描述与ACK TP不同的字段。
数据包通过主机与设备之间的直接路径传输。需注意:允许发送零长度数据块的数据包,但此类数据包应包含CRC-32校验码。
位宽 (比特) |
偏移量 (双字:位) |
描述 |
---|---|---|
20 | 0:5 | 路由字符串/仲裁权重/保留字段 • SuperSpeed模式:定义同ACK TP的路由字符串/保留字段,仅集线器使用 • SuperSpeedPlus模式:重定义ACK TP的路由字符串/保留字段: - 下行数据包(主机→设备):解释为路由字符串(详见第8.9节) - 上行异步数据包(设备→主机):低16位(位5-20)表示仲裁权重,高位保留且置零(详见第10.8.6.1节) |
5 | 1:0 | 序列号 (Seq Num) 标识数据包(DP)的序列号 注:序列号在31处回绕 |
1 | 1:5 | 保留 (R) |
1 | 1:6 | 突发结束/末包标志 (EOB/LPF) • 非等时端点:称EOB • 等时端点:称LPF 非等时IN端点:标识突发传输的末包。设备需发送ERDY TP通知主机继续传输 注:端点须在重传DP中重新评估EOB值 设置EOB条件: 1. 设备返回包数少于最近ACK TP的NumP字段请求数,且当前非短包 2. 设备无法满足Gen1速率的tMaxBurstInterval或Gen2速率的tGen2MaxBurstInterval,且当前非短包 注:发送短包时即使返回包数不足也无需置位EOB;仅当需在当前短包传输后进入流控状态时才需置位 非等时OUT/控制端点:该字段置零 等时端点:标识当前服务间隔内最后突发的末包(主机/设备均可设置),详见第8.12.6节 |
4 | 1:8 | 端点号 (Ept Num) 标识DP的源端或接收端设备端点 |
1 | 1:15 | 设置 (S) 由主机设置,标识此为Setup数据包(仅主机可设置) |
16 | 1:16 | 数据长度 (Data Length) 指示DPP(数据包有效载荷)的字节数(不含CRC-32) |
1 | 2:27 | 包挂起 (PP) 仅主机可设置: • 置位:主机有≥1个DP待传输至该端点/流 • 清零:此为待传至目标端点/流的最后一个DP 注:若设备所有端点无包挂起,可据此启用上行链路深度节能(如切至U1/U2状态) |
xx | 4:0 | 数据块 (Data Block) 包含DPP(数据包有效载荷)中的数据,其字节大小由数据长度字段指示 |
32 | 4:0 + xx | CRC-32 对DPP数据块计算的循环冗余校验值(多项式参见第7.2.1.2.2节) 注:因数据块长度可能非4字节整数倍,该字段不一定对齐双字边界 |
8.7 等时时间戳包(ITP)
等时时间戳包(ITP)应在所有处于U0状态且已完成端口配置的链路上进行组播。
ITP的类型字段值为"Isochronous Timestamp Packet"。ITP用于将时间戳从主机传递至所有活动设备,其特点如下:
- 不携带寻址或路由信息
- 由集线器组播至所有下游端口(要求链路处于U0状态且已完成端口配置)
- 设备不应响应ITP
ITP的核心作用是为设备提供主机时序信息以实现同步(注:任何设备或集线器均可接收ITP)。主机传输ITP的条件及规则:
- 根端口链路传输条件:仅当链路已处于U0状态时,主机方可在根端口链路上发送ITP
- 传输启动权限:仅主机可发起ITP传输
- 状态限制:主机不得为传输ITP而将根端口链路切换至U0状态
- 传输周期:若根端口链路处于U0状态,主机应在每个总线间隔的tTimestampWindow时间窗内从总线间隔边界开始发送ITP
- 初始传输时机:主机根端口链路从轮询状态进入U0后,须在tIsochronousTimestampStart时间内开始传输ITP
ITP可在突发传输的数据包间隙发送。若设备接收到的ITP中链路控制字的延迟标志(DL)被置位,则该时间戳值可能显著不准确,设备可忽略此时间戳。
位宽 (比特) |
偏移量 (双字:位) |
描述 |
---|---|---|
27 | 0:5 | 等时时间戳 (ITS) 标识主机发送ITP时的当前时间值,包含两个子字段: 位域 | 描述 13:0 | 总线间隔计数器:当前125µs(微帧间隔)计数值(0x3FFF时归零继续递增) 26:14 | 时间差 (Delta):当前ITP包起始到前一个总线间隔边界的时间差(单位为tIsochTimestampGranularity) 注:若数据包精确起始于总线间隔边界,则时间差置0 |
7 | 1:0 | 总线间隔调整控制 本规范版本中已弃用,应保留 原功能:指定控制总线间隔调整机制的设备地址(复位/上电/设备断开时主机置零) |
14 | 1:7 | 校正值 (Correction) 以tIsochTimestampGranularity为单位的负延迟值(表示ITP穿越支持PTM的集线器累积的延迟) 主机应置为0 |
43 | 1:21 | 保留 |
ITP中的ITS值应具有±1个tIsochTimestampGranularity单位的精度,该精度以主机生成ITP时的时钟为基准,并在主机发送ITP的首个帧同步符号时测量。支持精确时间管理(PTM)的集线器对ITP的要求详见第10.9.4.4.1节。
8.8 地址三元组
数据包(DP)和多数事务包(TP)通过三个字段的组合访问特定数据流:
- 设备地址(Device Address)
- 端点号(Endpoint Number)
- 方向字段(Direction)
设备地址规则:
- 设备复位和上电时地址默认值为0
- 主机在枚举过程中为其分配1至127范围内的地址
- 地址0保留为默认地址,禁止分配作其他用途
端点数量规则:
- 除默认控制端点(端点号固定为0)外
- 设备最多可支持15个IN端点和15个OUT端点(由方向字段标识)
8.9 路由字符串字段
路由字符串是下行数据包中的20位字段,集线器通过其将数据包路由至指定下游端口。其构成及运作机制如下:
- 组成原理:由通往目标设备路径中每个集线器的下游端口号(每集线器4位)串联而成
- 路由机制:集线器将集线器深度值(Hub Depth)乘以4作为路由字符串的偏移量,定位决定其下游端口号的比特位
- 深度值分配:集线器深度值在枚举过程中确定并分配给每个集线器
图8-32说明
Hub@Tier1字段值表示直接连接到主机根端口的下游集线器端口号(后续层级依此类推)。
8.9.1 路由字符串端口字段
路由字符串中的4位字段用于标识目标集线器的具体端口。
8.9.2 端口字段宽度
路由字符串端口字段宽度固定为4位,限制单集线器最大支持端口数为15个。
8.9.3 端口编号规则
- 数据包目标端口:由路由字符串端口字段值标识
- 集线器控制器寻址:该层级端口字段值必须置0
- 下游端口寻址:从1开始顺序编号
8.10 事务包用途
事务包(TP)用于报告数据事务状态,可返回以下信息:
- 数据包接收成功
- 命令接受/拒绝
- 流控状态
- 暂停条件
8.10.1 流控状态机制
描述端点返回流控响应时主机与设备的交互规则(仅批量、控制和中断端点支持流控,等时端点禁止):
IN端点进入流控状态的条件(响应ACK TP时)
- 返回NRDY TP
注:端点必须收到最近发送DP的ACK TP后,方可发送NRDY TP - 发送DP时在包头(DPH)中置位EOB字段为1
OUT端点进入流控状态的条件(响应DP时)
- 返回NRDY TP
- 发送ACK TP时将NumP字段置0
包挂起字段(PP)说明
- 仅主机设置有效
- 不影响端点是否进入流控状态
注:主机与设备TP响应的完整规则详见第8.11节
流控状态恢复
当端点处于流控状态时,必须发送ERDY TP以返回激活状态。具体要求:
- IN端点:需在收到最近发送DP的ACK TP后,方可发送ERDY TP
- 非流控状态端点:禁止发送ERDY TP(支持流的批量端点除外,详见第8.12.1.4.2/8.12.1.4.3节)
主机行为规则:
- 可随时恢复与任意端点的传输(即使端点未返回ERDY TP)
- 必须忽略非流控状态端点发出的ERDY TP
- 若主机恢复传输,端点需重新评估流控状态并作合规响应
8.10.2 突发事务
增强型SuperSpeed架构支持主机与设备间DP的突发传输。SuperSpeedPlus架构新增以下突发条件:
- 多IN事务并行处理
- 具备额外缓存及本地仲裁决策的集线器
- 下游端口链路速率不同的集线器
8.10.2.1 增强型SuperSpeed突发事务
增强型SuperSpeed USB协议允许主机在设备可接收/发送数据时,持续向设备发送或从设备接收数据。端点单次突发传输中无需中间ACK TP的包数由该端点的端点伴侣描述符(见第9.6.7节)报告。若端点报告的最大突发尺寸(bMaxBurst
)大于1包,则视为支持突发事务。
突发传输规则如下:
- 单次突发最大包数 = min(
• 端点最大突发尺寸(见表9-30的bMaxBurst
定义)
• 端点/主机最近收到的ACK TP或ERDY中NumP字段值
• 减去上次ACK TP确认后已发送的包数
) - 主机重置权:
• 端点初始化时
• 流控状态后恢复传输时
主机可将突发包数重置为端点最大突发尺寸 - 包长限制:
• 突发内除末包外所有数据包(DP)必须为最大包长
• 末包可小于最大包长(短包规则见第8.10.2节) - 持续条件:
• ACK TP的NumP字段非零
• 每个DP均为最大包长 - NumP动态调整:
• 主机/设备可通过ACK TP随时增加NumP值(需继续接收数据)
• NumP值不得超过设备支持的最大突发尺寸
• 等时IN端点的NumP变更需额外满足第8.12.6节要求 - 当设备或主机发送ACK TP时,若需递减NumP字段值,递减幅度不得超过1。例如:若前次ACK TP的NumP字段值为5,则用于确认下一接收数据包的ACK TP的NumP字段值不得低于4。此规则仅存在以下例外:
- 若设备能接收数据但无法继续接纳数据,则应发送NumP字段置零的ACK TP
- 当设备发送带EOB标志的DP或短数据包时(参见第8.10.2节),主机应回复NumP置零的ACK TP。但若主机收到EOB=0的短数据包且需对同端点发起新传输,可发送含非零NumP值的ACK TP
- 当设备发送含DPP错误的数据包时(参见第8.11.2节),主机可发送rty位置1且NumP值小于端点最大突发能力的ACK TP(含零值)
8.10.2.2 SuperSpeedPlus突发事务
SuperSpeedPlus架构对突发事务新增以下要求:
该架构支持超越SuperSpeed的传输速率。为优化Gen2速度下的总线性能,增强型SuperSpeed设备与主机在端点至主机或主机至端点的DP突发传输中,须满足tGen2MaxBurstInterval时间间隔要求。
因支持多路IN传输,当链路可用时单个SuperSpeedPlus设备可从多端点同时突发DP。以Gen2速率运行的设备在不同端点向主机并发突发DP时,须满足tGen2MaxDeviceMultiPacketInterval时间间隔要求。
在SuperSpeedPlus架构中,不同端点或设备的DP经SuperSpeedPlus集线器传输时,可能因路径竞争被缓存或重排序。当集线器缓存多个发往Gen2链路的DP时,无论这些DP是否归属同设备/端点,其传输间隔不得超过tGen2MaxHubMultiPacketInterval。
8.10.3 短数据包
增强型SuperSpeed保留USB 2.0短数据包语义:当主机或设备收到的DP数据长度字段小于端点最大包长时,应认定该次传输完成。
对于IN传输:
- 设备发送短DP后须停止发送DP
- 主机应对短DP回复NumP置零的ACK TP(除非需对同端点发起新传输,此时可按第8.10.2节设置NumP值)
- 当端点有新传输初始化时,主机须调度至该端点的传输事务
在OUT事务的情况下,主机可能在发送短数据包(DP)后停止发送后续DP。当针对某个端点发起新的传输时,主机应重新调度该端点的传输事务。注意,这标志着对该端点新一轮突发传输的开始。
8.10.4 SuperSpeedPlus事务重排序规则
在SuperSpeedPlus总线实例中,若传输准备就绪,传输包(TP)应优先于数据包(DP)发送(适用于周期性和异步数据包)。
TP使用类型1链路信用值。
主机和设备在SuperSpeedPlus总线实例上发起确认包(ACK)和数据包头(DPH)时,必须设置其传输类型(TT)字段。来自异步端点的上行流DPH包含仲裁权重(AW)字段,SuperSpeedPlus设备须将该字段设为零值。
SuperSpeedPlus集线器和设备应优先选择周期性数据包而非异步数据包进行链路传输。
周期性DP使用类型1链路信用值,异步DP使用类型2链路信用值。
数据包的返回顺序与总线上不同端点IN事务的发起顺序无关。涉及同一端点的TP和DP必须按照主机或设备发出的原始顺序进行传输。
图8-33. 批量IN事务并发处理示例
图8-34. 批量与同步IN事务并发处理示例
8.11 TP或DP响应
发送和接收设备应按照表8-27至表8-29的规定返回DP或TP。根据传输类型以及TP的传输方向,并非所有TP都被允许使用。
8.11.1 设备对请求数据TP的响应
表8-27列出了设备针对批量、控制和中断端点请求数据的TP所应采取的响应方式。当存在以下任一情况时,TP将被视为无效:
- 包含错误的设备地址
- 其端点编号和方向未指向当前配置中包含的端点
- 未携带预期的序列号
- 其传输类型(TT)与端点类型不匹配(针对运行在SuperSpeedPlus模式的设备)
表8-27. 设备对请求数据TP的响应方式
(批量、控制及中断端点)
接收无效TP | 接收带延迟位设置的TP | 设备发送端点停止功能设置 | 设备准备传输数据 | 采取动作 |
---|---|---|---|---|
是 | 任意 | 任意 | 任意 | 设备应忽略该TP |
否 | 是 | 是 | 任意 | 设备应发送ERDY TP |
否 | 是 | 否 | 否 | 设备不应响应,准备就绪时发送ERDY TP |
否 | 是 | 否 | 是 | 设备应发送ERDY TP表明准备发送数据 |
否 | 否 | 是 | 任意 | 发出STALL TP |
否 | 否 | 否 | 否 | 发出NRDY TP |
否 | 否 | 否 | 是 | 开始传输主机请求序列号的DP数据包 |
8.11.1 IN端点停止传输包的发送条件
IN端点必须等待收到其最后发送数据包(DP)的确认包(ACK TP)后,才能发送停止传输包(STALL TP)。
8.11.2 主机对设备数据的响应机制
表8-28列出了主机对设备批量、控制和中断端点数据的响应规则。主机仅能返回ACK TP确认包。当存在以下任一情况时,数据包头(DPH)将被视为无效:
- 包含错误的设备地址
- 其端点编号和方向未指向当前配置中包含的端点
- 未携带预期的序列号
- DPH中的数据长度超出端点最大数据包长度限制
- 其传输类型(TT)与端点类型不匹配(针对运行在SuperSpeedPlus模式的设备)
表8-28中DPP错误可能由以下一种或多种原因导致:
- CRC校验错误
- 循环冗余校验值不正确
- DPP传输中止
- 数据包传输过程被异常终止
- DPP缺失
- 未接收到预期数据包
- 数据长度不匹配
- DPH声明的数据长度与实际载荷长度不符
表8-28. 主机对接收设备数据的响应方式
(批量、控制和中断端点)
DPH含无效值 | 数据包载荷错误 | 主机可接收数据 | 主机返回TP响应动作 |
---|---|---|---|
是 | 任意 | 任意 | 丢弃数据且不发送任何TP |
否 | 是 | 任意 | 丢弃数据并发送重试位置位的ACK TP,请求序列号字段设定为损坏DP序列号的零个或多个DP |
否 | 否 | 否 | 丢弃数据;发送重试位置位的ACK TP,请求序列号字段设定为主机未能接收DP序列号的一个或多个DP,且主机错误位需置1 |
否 | 否 | 是 | 接收数据并发送ACK TP,请求序列号字段设定为预期下一个DP序列号的零个或多个DP(同时隐式确认当前DP接收成功) |
好的,这是严格按照原文格式和排版要求的中文翻译:
8.11.3 设备对从主机接收数据的响应
设备对从主机接收到的用于批量端点、控制端点和中断端点数据的 TP 响应如表 8-29 所示。若存在以下一个或多个条件,则认为 DPH 无效:
- 设备地址不正确
- 其端点号和方向不指向属于当前配置的端点
- 不具有预期的序列号
- DPH 中的数据长度大于端点最大数据包大小
- 其 TT 与端点类型不匹配(对于运行在 SuperSpeedPlus 模式的设备)
在表 8-29 中,DPP 错误可能由以下一个或多个原因引起:
- CRC 校验不正确
- DPP 中止
- DPP 缺失
- DPH 中的数据长度与实际数据载荷长度不匹配
注:接收到ACK TP表示主机发送的具有前一序列号的DP已被设备成功接收,同时表明设备当前可用于接收主机待发送DP的数据包缓冲区数量。对于每个成功接收的DP,设备都应发送ACK TP。
表8-29 设备对OUT事务的响应
(批量端点、控制端点和中断端点)
DPH 包含无效值 | DPH 的延迟位被置位 | 接收端停止特性被设置 | 数据包有效载荷 (DPP) 错误 | 设备能否接收数据 | 设备返回的 TP |
---|---|---|---|---|---|
是 | 任意 | 任意 | 任意 | 任意 | 丢弃 DP。 |
否 | 是 | 是 | 任意 | 任意 | 设备应发送 ERDY TP。 |
否 | 是 | 否 | 任意 | 否 | 设备不应响应。当其准备好恢复时,应发送 ERDY TP。 |
否 | 是 | 否 | 任意 | 是 | 设备应发送 ERDY TP。 |
否 | 否 | 是 | 任意 | 任意 | 设备应发送 STALL TP。 |
否 | 否 | 否 | 任意 | 否 | 丢弃 DP,发送 NRDY TP。 |
否 | 否 | 否 | 是 | 是 | 丢弃 DP,发送 ACK TP(包含设备期望的 DP 序列号(从而表明未收到该 DP)、重试位置位以及设备针对此端点可接收的 DP 数量)。 |
否 | 否 | 否 | 否 | 是 | 发送 ACK TP(指示下一个期望的 DP 序列号(从而表明成功接收此 DP)以及设备针对此端点可接收的 DP 数量)。 |
8.11.4 设备对 SETUP DP 的响应
SETUP DP 是一种特殊的数据包,通过其 Setup 字段置为 1 并寻址到任意控制端点来标识。SETUP 是一种特殊类型的主机到设备数据事务,允许主机发起一个设备应执行的命令。收到 SETUP DP 后,设备应按照表 8-30 所示进行响应。
若存在以下任一情况,则认为 SETUP DPH 无效:
- 设备地址不正确
- 端点号和方向不指向属于当前配置的端点
- 端点号不指向控制端点
- 序列号非零
- 数据长度未设置为八
- TT 与端点类型不匹配(对于运行在 SuperSpeedPlus 模式的设备)
表8-30 控制端点的SETUP事务处理响应
(仅适用于控制端点)
DPP错误可能由以下一个或多个原因导致:
- CRC校验错误(CRC incorrect)
数据传输过程中校验失败,可能与数据完整性或通信干扰相关 。 - DPP已中止(DPP aborted)
操作因系统或协议异常提前终止 。 - DPP缺失(DPP missing)
预期的数据包或响应未按协议要求提供 。 - Setup DPH中的数据长度与实际数据负载长度不匹配(Data length in the Setup DPH does not match the actual data payload length)
数据描述字段与实际传输内容的长度不一致,可能导致解析失败 。
DPH状态 | 无效值 | 延迟位设置 | 数据包负载错误 | 操作说明 |
---|---|---|---|---|
DPH存在无效值 | 是 | 不适用 | 不适用 | 丢弃数据包(DP)。 |
DPH延迟位已设置 | 否 | 是 | 不适用 | 设备应发送ERDY传输包(TP),表明已准备好接收SETUP数据包(DP)。 |
设备返回的TP | 否 | 否 | 是 | 丢弃SETUP数据包,发送序列号置零、重试位(rty)置位且NumP字段为1的ACK TP。 |
正常接收SETUP DP | 否 | 否 | 否 | 发送序列号置1的ACK TP(表示成功接收SETUP DP)。NumP字段值指示设备是否需要对数据/状态阶段进行流量控制(详见8.12.2节)。 |
8.12 TP 序列
构成一个事务的数据包取决于端点类型。共有四种端点类型:大容量(bulk)、控制(control)、中断(interrupt)和等时(isochronous)。
8.12.1 大容量事务
大容量事务的特点是通过错误检测和重传机制保证主机与设备之间数据的无错误传输。大容量事务使用由 TP(事务包)和 DP(数据包)组成的两阶段事务。在某些流控和停止条件下,数据阶段可以被 TP 替代。TT 字段在 SuperSpeedPlus 模式下,由主机和外设设备设置为 Bulk;详见表 8‑13。
8.12.1.1 状态机符号说明
本节展示了主机端点和设备端点为推进 IN 或 OUT 管道上的协议所需的详细状态机。这些图表不应被视为实施上的强制要求,而是用于指定所需行为。图 8‑35 显示了状态机图例。
-
三线边框的圆表示对另一个(层级)状态机的引用。
-
双线边框的圆表示初始状态。
-
单线边框的圆表示简单状态。
-
菱形(连接处)用于将若干转换汇合为一个公共点。连接处允许一个输入转换对应多个输出转换,或多个输入转换对应一个输出转换。在涉及连接处的路径上,所有条件均必须为真,该路径才会被采用。
-
一条路径就是由一个或多个连接处串联而成的转换序列。
-
转换(transition)标注为一个带中线的框,框的上方是条件,下方是动作。
-
没有中线的转换仅表示条件。
-
要执行该转换,必须满足条件为真。
-
如果执行该转换,则会执行框下方列出的动作。
-
条件和动作的语法使用 VHDL。
-
状态以圆圈表示,圆圈内部包含一个加粗的名称,并可选地包含进入该状态时要执行的一个或多个动作。
-
使用实线箭头表示由主机发起的转换。
-
使用虚线箭头表示由设备发起的转换。
-
使用点‑点‑划线箭头表示由设备或主机发起的转换。
8.12.1.2 Bulk IN 事务
当主机准备接收大容量数据时,
它发送一个 ACK TP 到设备,
条件: 表示主机期望接收的序列号和数据包数
- Bulk 端点必须按照第 8.11.1 节中定义的方式响应。
- 主机对每个接收到的有效 DP 都发送一个 ACK TP。
- 如果之前的 ACK TP 指示主机期望设备发送多个 DP(取决于 TP 中的 Number of Packets 字段),设备在发送下一个 DP 时无需等待 ACK TP。
- ACK TP 隐式确认具有前一个序列号的最后一个 DP 已被主机正确接收,同时指示设备下一个期望的序列号和数据包数量。
- 如果主机在接收任一 DP 时检测到错误,它将发送一个带 Retry 位设置为 1 的 ACK TP,序列号设置为首个出错的 DP, 即使之后的包无误也不例外。
- 设备必须从该 Retry 位为 1 的 ACK TP 所指定的序列号开始,重传所有 DP。
- 在端点初始化后(通过 Set Configuration、Set Interface 或 ClearFeature (ENDPOINT_HALT) 命令——详见第 9 章),主机期望设备发送的第一个 DP 序列号为 0;第二个为 1;第三个为 2;……直到 31,然后下一个 DP 的序列号重置为 0。
- 设备端点发送数据包时不断递增序列号,除非收到带 Retry 位为 1 的 ACK TP,指示需重传先前的 DP。
- 若主机请求多个 DP 而设备一时无法提供,设备应将最后一个 DP 的 DPH 中 End Of Burst 标志设为 1。
- 如果发送的 DP 数据负载小于该端点的 MaxPacketSize,则无需设置 End Of Burst 标志。
- 当设备发送完主机期望的所有数据,或发送一个数据负载小于 MaxPacketSize 的 DP 时,一次传输即完成。
- 若主机要开始新一次传输,应发送新的 ACK TP,指定下一序列号和期望的 DP 数量。
例如,上次传输结束于序列号为 2 的小于 MaxPacketSize 的 DP,则主机将发送序列号为 3 的 ACK TP,以期开启下一次传输。
8.12.1.3 Bulk OUT 事务
当主机准备传输大容量数据时,
它向设备发送一个或多个 DP。
- 若设备收到了 DPH,并且其中包含有效的设备地址、端点号、方向和预期序列号,设备必须按照第 8.11.3 节定义进行响应。
- 在端点初始化后首次传输中,主机将第一个 DP 的序列号初始化为 0;第二个为 1;第三个为 2;……直到 31,之后再循环回 0。
- 主机持续递增 DP 的序列号,除非收到带 Retry 位为 1 的 ACK TP,表示必须重发先前某个包。
- 一次传输在主机发送完所有数据后结束——无论最后一个 DP 的负载是否等于该端点的 MaxPacketSize。
- 若主机想开启新一轮传输,只需发送下一个序列号的 DP,目标为设备上的对应端点。
8.12.1.4 批量流协议
流协议遵循标准增强型超高速批量协议的语义,因此支持流的增强型超高速批量管道的数据包交换与不支持流的增强型超高速批量管道无法区分。流协议通过数据包头中的流ID字段严格管理。
注释 :设备类定义的方法用于协调流ID,主机通过流ID选择端点缓冲区,设备通过流ID选择与特定流关联的功能数据。通常通过带外机制(例如其他端点)在主机与设备之间传递“活动流ID列表”。
注释 :流状态机展示了发送数据包(DP)与接收确认包(ACK)之间的1:1关系。从逻辑上这是正确的;然而,增强型超高速的突发功能允许主机与设备之间最多存在MaxBurst个未完成的ACK,因此在时间上可能存在“多对一”关系。突发在流管道上的管理方式与普通批量管道完全一致。更多信息请参考第8.10.2节“突发事务”。
如本节所述,流协议适用于“管道”的状态,并被描述为单一实体。实际上,流协议由管道一端的主机和另一端的设备独立跟踪。因此,在任意时刻,由于主机与设备之间的数据包传播延迟,两端可能会短暂不同步。
若请求重试且主机无法在当前突发周期内继续重传数据包(DP),主机应在符合传输类型约束的前提下,在下一个可用机会返回至该端点。
图8-38 通用流协议状态机(SPSM)
图 8-38 说明了流协议状态机 (SPSM) 的基本状态转换。本节描述了 SPSM 适用于 IN 和 OUT 端点的通用状态转换。针对 IN 和 OUT 端点的 SPSM 详细操作将在后续章节中描述。
禁用 (Disabled) – 这是管道配置后的初始状态,也是在任何其他状态中检测到错误时所转换到的状态。首次为管道分配端点缓冲区 (Endpoint Buffer) 时,主机应将 SPSM 转换到 预备管道 (Prime Pipe) 状态。如果 禁用 状态是因错误而进入的,则必须先通过软件干预移除错误条件,才能退出该状态。
注意:当发生错误(例如Stall)或收到SetFeature(ENDPOINT_HALT)请求时,无论当前处于何种SPSM状态,均应转换为Disabled(禁用)状态。若主机检测到错误(例如Stall、tHostTransactionTimeouts等),主机应将其对应端点的SPSM状态转换为Disabled状态。若主机检测到未由设备声明的错误(例如tHostTransactionTimeouts),主机应通过向设备发送SetFeature(ENDPOINT_HALT)请求,将设备的SPSM状态转换为Disabled状态。
Prime Pipe(管道初始化):此状态转换始终由主机发起,用于通知设备软件已添加或修改了端点缓冲区集。退出此状态后,设备此前标记为Not Ready(未就绪)的Active Stream ID(活动流ID)均应标记为Ready(就绪)。
注释:为减少总线事务,主机控制器限制每次进入Idle状态后仅允许一次向Prime Pipe状态的转换。这意味着,在Idle状态下,即使多个流的端点缓冲区变为就绪状态,也仅生成一次向Prime Pipe状态的转换。由于Prime Pipe状态未指定哪些流已就绪,所有Active Stream ID均通过Prime Pipe标记为Ready。设备需负责测试所有Active Stream ID(如上所述),在返回Idle状态后发送适当的ERDY信号。注意:设备类定义的约束条件可用于限制任意时刻需测试的Active Stream ID数量。
Idle(空闲):进入此状态表示未选择当前流(CStream)。在此状态下,SPSM等待由主机发起的向Prime Pipe或Move Data状态的转换,或由设备发起的向Start Stream状态的转换。主机和设备发起状态转换的目标是启动流的数据传输。由主机发起的Move Data状态转换称为Host Initiated Move Data(主机发起的数据移动)或HIMD。所有Active Stream ID均通过HIMD标记为Ready。
Start Stream(启动流):此状态始终由设备发起,用于通知主机设备希望在选定的流上开始传输数据。当设备拥有Ready状态的流ID时,可随时发起向此状态的转换。若主机接受设备选择的流,则管道进入Move Data状态;若主机拒绝设备选择的流ID,则管道返回Idle状态,且该流ID将暂时标记为Not Ready。注意:设备维护一份“Active”流ID列表,Active流ID可为Ready或Not Ready状态。主机通过带外机制(通常为独立的OUT端点)向设备告知Active流ID。
Move Data(数据传输):在此状态下进行流数据传输。当SPSM转换至此状态时,当前流(CStream)被设定。当流传输完成,或主机/设备因暂时耗尽数据或缓冲空间而终止流传输时,SPSM转换回Idle状态。向Idle状态的转换会使当前流失效。
注释:通用规则是,流状态机仅在接收到有效的DP(数据包)或TP(传输包)时推进。例如,若接收到带有错误DPP的数据包,流状态机应在当前状态执行重试,并仅在成功传输有效数据包时推进状态。
8.12.1.4.1 流ID(Stream IDs)
在DP(数据包)头以及ACK、NRDY和ERDY TP(传输包)中预留了一个16位的流ID字段,用于在主机与设备间传递SID(流标识符)。流协议保留的特定SID值及其他SID表示如下:
-
NoStream:此SID表示对应总线数据包未关联流ID,流ID字段不应被解释为指向有效流。NoStream的SID值为FFFFh。
-
Prime:此SID用于定义进入和退出Prime Pipe状态的转换。
与NoStream一样,对应总线数据包未关联流ID,流ID字段不应被解释为指向有效流。
Prime SID值为FFFEh。 -
Stream n:其中n为1至65533(FFFDh)之间的值。
此表示法用于引用有效流ID。若数据包头使用此表示法,则流ID字段有效。
有效Stream n SID值范围为1至65533(FFFDh),数值与n相同。 -
Stream 0:此值由流支持的管道保留且不使用。
Stream 0 SID值为0000h。标准批量管道需使用该值。 -
CStream:表示分配给当前流的流ID值。
主机和设备均维护CStream值。流协议确保主机与设备中的CStream值一致。
有效值为NoStream或Stream n。 -
LCStream:表示上一次状态转换前分配给管道的CStream SID值。
LCStream值由主机维护。有效值为Prime、NoStream或Stream n。
例如,当管道处于Move Data状态(CStream = Stream n)并转换至Idle状态时, -
LCStream被设为Stream n,而CStream被设为NoStream,从而LCStream记录“上一CStream”值。
Stream n SID值由主机分配并通过设备类定义的带外方法传递给设备。
设备需将Stream n SID值视为“逻辑值”,即不得推断其含义或修改该值。
注释:以下描述的批量IN和OUT流协议简化了状态机,未明确体现增强型超高速端点的突发特性(允许发送DP而无需等待ACK)。实现时需扩展状态机以支持突发。
以下章节(8.12.1.4.2至8.12.1.4.5)将流状态机分为四个案例,分别描述流管道的主机端和设备端状态:
- 8.12.1.4.2和8.12.1.4.3:设备端状态机。
- 8.12.1.4.4和8.12.1.4.5:主机端状态机。
每个管道端的独立章节分别描述IN和OUT操作。
各流状态机章节的子章节描述状态机的各个状态。
子章节首先说明状态的目的及通用特性,随后讨论各退出转换条件。
描述状态退出转换的段落前会标注对应状态图中的唯一条件或动作标签。
注释:主机与设备间的U1或U2超时值应设置为防止数据事务正常响应期间进入U1或U2状态。
数据事务时序信息详见第8.13节。
注释:流状态机章节中存在状态名重载。例如:
- Idle状态在四个状态机描述中均定义。
- INMvData主机状态在设备和主机IN状态机章节中均有定义。
状态相关性体现在可能发生在流管道两端;但每个流状态机章节描述独立状态机,因此各章节中状态关联的条件和动作不同。
8.12.1.4.2 设备IN流协议
本节定义通过IN批量端点实现设备侧流协议状态转换的增强型超高速数据包交互规则。
后文描述中,设备IN流状态转换的触发时机为:
- 设备向主机发送状态机相关消息的首符号首比特时
- 设备首次解码出来自主机的状态机相关消息时
在IN管道中,主机内的端点缓冲区接收来自设备的功能数据。
图8-39 设备IN流协议状态机(DISPSM)
8.12.1.4.2.1 禁用 (Disabled)
端点完成配置或接收到设置特性(ENDPOINT_HALT)请求后,管道即处于禁用状态。
ACK(Prime, NumP>0, PP=0) – 如果收到 Stream ID 字段设置为 Prime 的 ACK TP,则设备应将管道转换到 Prime Pipe 状态。此转换发生在系统软件将初始端点缓冲区分配给该管道之后。
ACK(Deferred) – 如果收到带有 Deferred (DF) 标志的 ACK,则设备应将管道转换到 Deferred Prime Pipe 状态。当链路在等待初始端点缓冲区分配期间已切换到 U1 或 U2 状态时,会收到此分组。
8.12.1.4.2.2 Prime Pipe
Prime Pipe 状态通知设备端点缓冲区已分配给一个或多个流,但并不指明具体是哪些流。在此状态下,设备应将所有活动流(Active Streams)置为就绪(Ready)。返回 Idle 状态后,设备应发出 ERDY,以从其活动流列表中启动某个特定流。
NRDY(Prime) – 进入 Prime Pipe 状态时,设备应生成一个 Stream ID 字段设置为 Prime 的 NRDY TP,并转换到 Idle 状态。
8.12.1.4.2.3 Deferred Prime Pipe
Deferred Prime Pipe 状态通知设备端点缓冲区已分配给一个或多个流,但在等待过程中链路已切换到 U1 或 U2 状态。在此状态下,设备应将所有活动流置为就绪。返回 Idle 状态后,设备应发出 ERDY,以从其活动流列表中启动某个特定流。
无条件 – 进入 Deferred Prime Pipe 状态后,设备应立即转换到 Idle 状态。这是在图 8‑39 中唯一的 Deferred Prime Pipe 退出转换。
8.12.1.4.2.4 Idle
在 Idle 状态下,管道等待流选择(例如,转换到 Start Stream 或 Move Data),或等待主机通知已向该管道添加或修改了某个流的端点缓冲区(即转换到 Prime Pipe)。注意,首次进入 Idle(即从 Disabled 状态转换)时,仅设备可以发起流选择。
ERDY(Stream n, NumP>0) – 为发起流选择,设备生成一个 Stream ID 设置为 Stream n、NumP 值大于 0 的 ERDY TP,并转换到 Start Stream 状态,其中 Stream n 为设备提出的流 ID。无论管道是否处于流控状态,设备都可在想启动流传输时发起此转换。设备维护一个可生成 ERDY 的“活动且就绪”流列表。设备用于流选择的方法不在本规范范围内,通常由与该管道关联的设备类定义。需注意,ERDY 的 NumP 字段值反映了设备可用于 Stream n 的端点数据量。
ACK(Prime, NumP>0, PP=0) – 如果从主机收到 Stream ID 等于 Prime 的 ACK TP,则设备应转换到 Prime Pipe 状态。
ACK(Stream x, NumP>0) – 主机通过此转换向设备提议流 ID 为 Stream x。如果收到的 ACK TP 的 Stream ID 不等于 Prime,则设备应转换到 Move Data 状态。主机在希望启动流传输时可发起此转换,称为主机发起移动数据(Host Initiated Move Data,HIMD)。HIMD 表明端点缓冲区已为某个特定流更改。由于此转换,设备应将 Stream x 置为就绪。进入 Move Data 状态后,设备可通过 NRDY 拒绝该流提议,或通过 DP 接受该流提议。转换至 Move Data 状态时,设备将 CStream 设置为所接收的流 ID(Stream x)。通常 Stream x 与设备最后一次生成的 ERDY 中的 Stream n 相同;如果发生下述竞态条件之一,主机可能会丢弃 ERDY,于是 Stream x 可能与 Stream n 不同。此时 PP 应等于 1。
ACK(Deferred) – 如果收到带有 Deferred (DF) 标志的 ACK,则设备应将管道转换到 Deferred Prime Pipe 状态。当链路已切换到 U1 或 U2 状态且主机尝试执行 HIMD 时,会收到此分组。
8.12.1.4.2.5 Start Stream
在 Start Stream 状态下,设备等待主机接受或拒绝其提议的“活动且就绪”流选择。
ACK(Stream n, NumP>0) – 如果收到 Stream ID 等于 Stream n 的 ACK TP,则主机已接受设备对启动 Stream n 的提议,设备应转换到 Move Data 状态。进入 Move Data 状态时,设备将 CStream 设置为所接收的流 ID(Stream n)。此时 PP 应等于 1。
ACK(NoStream, NumP=0, PP=0) – 如果收到 Stream ID 等于 NoStream 的 ACK TP,则主机已拒绝设备对启动 Stream n 的提议,设备应转换到 Idle 状态。由于此转换,设备应将 Stream n 置为不可就绪(Not Ready)。如果设备没有可用的端点缓冲区,主机必须拒绝其提议。
ACK(Prime, NumP>0, PP=0) – 如果收到 Stream ID 等于 Prime 的 ACK TP,则发生了竞态条件。主机已进入 Prime Pipe 状态以告知设备某些流的端点缓冲区已更新,与此同时设备也尝试启动流传输,它们各自的消息在链路上交错通过。此时设备处于 Start Stream 状态,主机处于 Prime Pipe 状态。为解决此情况,设备应转换到 Prime Pipe 状态。
ACK(Stream x, NumP>0) – 如果收到 Stream ID 等于 Stream x 的 ACK TP,则发生了竞态条件。主机已进入 Move Data 状态以启动对 Stream x 的传输,与此同时设备也尝试启动对 Stream n 的传输,它们的消息在链路上交错通过。此时设备处于 Start Stream 状态,主机处于 Move Data 状态。为解决此情况,设备应转换到 Move Data 状态,并将 Stream x 置为就绪。转换至 Move Data 状态时,设备将 CStream 设置为所接收的流 ID(Stream x)。此时 PP 应等于 1。
ACK(Deferred) – 如果收到带有 Deferred (DF) 标志的 ACK,则设备应将管道转换到 Deferred Prime Pipe 状态。当链路在等待主机对 Start Stream 请求的响应时已切换到 U1 或 U2 状态,并且 tERDYTimeout 已超时,才会发生此转换。
注意:“PP 应等于 1” 的表述在 Idle 和 Start Stream 状态下,并不要求设备必须验证 PP 是否等于 1;但如果设备进行该检查,且 PP 不等于 1,则应停止该端点(halt the EP)。
8.12.1.4.2.6 Move Data
在 Device IN Move Data 状态下,管道两端的 CStream 均设为相同值,管道可以主动传输数据。Move Data 状态下所执行的总线事务细节及其退出条件定义在下文的 Device IN Move Data 状态机中。
设备 IN 移动数据状态机(DIMDSM)如上所述可从 Start Stream 或 Idle 状态进入。进入 DIMDSM 后会立即转换到 INMvData Device 状态。DIMDSM 允许设备在与某个流关联的功能数据耗尽时终止移动数据操作,也允许主机在与某个流关联的端点缓冲区空间耗尽时终止移动数据操作。DIMDSM 始终退出到 Idle 状态。导致 DIMDSM 退出的数据包中不应设置重试(Rty=1)标志。在数据包重试期间,流管道保持在移动数据状态。
注意:在移动数据状态中交换的所有数据包,其流 ID 值均应为 CStream;如果在 DIMDSM 中检测到与 CStream 不同的流 ID 值,设备应停止该端点。
注意:如果在首次进入移动数据状态时 CStream 并非活动状态,设备可按关联设备类的定义,通过发送 NRDY 或对管道发出 STALL 来拒绝该流提议。
8.12.1.4.2.7 INMvData Device
此状态最初由 Start Stream 状态或 Idle 状态进入。在此状态下,设备准备向主机发送 DP,或可拒绝主机的 HIMD。
DP(CStream, EOB=0) – 如果设备对 CStream 的端点数据超过一个最大包大小,则设备可发送一个 EOB=0 的 DP 给主机,并转换到 INMvData Host 状态。DPP 应包含 CStream 数据。
DP(CStream, EOB=1) – 如果设备对 CStream 的端点数据小于或等于一个最大包大小,则设备可发送一个 EOB=1 的 DP 给主机,并转换到 INMvData Device Terminate 状态。DPP 应包含 CStream 数据。
NRDY(CStream) – 设备可通过发送 Stream ID 为 CStream 的 NRDY 来拒绝后续 CStream 传输,并转换到 Idle 状态,退出 DIMDSM。设备可在首次进入 DIMDSM 时生成此转换以拒绝 HIMD,或在传输过程中因意外内部情况需要对 CStream 进行流控时生成此转换。
8.12.1.4.2.8 INMvData Host
在此状态下,设备刚向主机发送了一个 DP,并对 CStream 仍有更多功能数据可用。设备在此状态下等待主机对最后一个 DP 的应答。
ACK(CStream, NumP>0, PP=1) – 如果设备收到 NumP > 0 且 PP = 1 的 ACK,则应转换到 INMvData Device 状态。这是主机在当前突发尚未完成且对 CStream 还有更多端点缓冲区空间时的响应。注意,如果主机在上一个设备 DP 中检测到错误,则此数据包中可设置重试(Rty=1)标志。若设置了 Rty,设备在下次发送 DP 时应使用相应的序列号重发该 DP。若检测到 DP 错误,主机可在所有重试耗尽或收到正确 DP 前继续当前突发;若无法继续,主机应在下一个可用时机在传输类型约束内对该端点发起新突发。
ACK(CStream, NumP=0, PP=1) – 如果设备收到 NumP = 0 且 PP = 1 的 ACK,则应转换到 INMvData Burst End 状态。这是主机在对 CStream 仍有端点缓冲区空间,但必须终止当前设备突发时的响应。注意,在 INMvData Host 到 INMvData Device 的过渡过程中,设备应看到 NumP 随着突发完成而递减至 0。若主机在上一个设备 DP 中检测到错误,此数据包中也可设置 Rty=1 标志。
ACK(CStream, NumP=0, PP=0) – 如果设备收到 NumP = 0 且 PP = 0 的 ACK,则应转换到 Idle 状态,退出 DIMDSM。这是主机在用尽 CStream 端点缓冲区空间后,对最后一个 DP 的正常应答。此转换应将 CStream 置为 Not Ready。在 INMvData Host 到 INMvData Device 的过渡过程中,设备应看到 NumP 随着端点缓冲区耗尽而递减至 0。
注意:在 INMvData Host 状态下接收到 NumP > 0 且 PP = 0 的 ACK 是非法组合,若检测到,设备应停止该端点。
8.12.1.4.2.9 INMvData Device Terminate
此状态由设备刚发送完其对 CStream 可用的最后一个 DP(即用尽 CStream 功能数据)而进入。在此状态下,设备等待主机对移动数据传输最后一个 DP 的应答。
ACK(CStream, NumP=0, No Rty) – 如果设备收到 NumP = 0 且 Rty = 0 的 ACK,则应转换到 Idle 状态,退出 DIMDSM。这是主机对设备最后一个 DP 成功接收的正常结束应答(终止 ACK)。
ACK(CStream, NumP>0, PP=1, Rty) – 如果设备收到 Rty = 1 的 ACK,并且 NumP > 0、PP = 1,则应转换到 INMvData Device 状态并重发相应的 DP。这是主机在检测到设备 DP 出错且突发尚未完成时的响应。
ACK(CStream, NumP=0, PP=1, Rty) – 如果设备收到 Rty = 1 且 NumP = 0、PP = 1 的 ACK,则应转换到 INMvData Burst End 状态,并等待主机发起下一次突发。这是主机在检测到设备 DP 出错但突发已完成时的响应。主机应在下一次突发中继续执行重试过程。
8.12.1.4.2.10 INMvData Burst End
此状态由主机终止某个流管道的突发而进入。在此状态下,设备等待一个表示新突发开始的 ACK TP。
ACK(CStream, NumP>0, PP=1) – 如果设备收到 NumP > 0 且 PP = 1 的 ACK,则应转换到 INMvData Device 状态。注意,如果进入此状态时设置了 Rty 标志,则退出时仍应保留该标志。
ACK(Deferred) – 如果收到带 Deferred (DF) 标志的 ACK,则设备应转换到 Idle 状态,退出 DIMDSM。当链路在等待主机重启突发时已切换到 U1 或 U2 状态时会收到此分组;随着其他设备的传输活动增加,此转换变得更为可能。
8.12.1.4.3 Device OUT Stream Protocol
本节定义了在 OUT 批量端点上,将设备端的流协议从一个状态转换到另一个状态所需的增强型 SuperSpeed 分组交换。在下文中,假定“Device OUT Stream 状态转换”发生在设备向主机发送与状态机相关的消息的第一个符号的第一个比特时,或发生在设备首次解码主机的与状态机相关的消息时。对于 OUT 管道,主机中的端点数据传输到设备的功能缓冲区。除非另有说明,DP 将包含端点数据。
8.12.1.4.3.1 Disabled
在端点被配置完成或收到 SetFeature(ENDPOINT_HALT) 请求后,管道进入 Disabled 状态。
- DP(Prime, PP=0) – 如果成功接收到 Stream ID 字段设置为 Prime 且 PP=0 的 DP,则设备应将管道转换到 Prime Pipe 状态。DPP 应包含零长度数据负载。此转换发生在系统软件将初始端点缓冲区分配给该管道之后。注意,如果检测到 DP 数据(即使是零长度)的错误,设备应保持在 Disabled 状态,并发送 ACK(Prime, NumP>0, Rty) 重试,直到成功接收到 DP(Prime)。此情况未在上图中示出。
- DPH(Deferred) – 如果接收到带 Deferred (DF) 标志的 DP,则设备应将管道转换到 Deferred Prime Pipe 状态。当链路在等待初始端点数据分配期间已切换到 U1 或 U2 状态时,会收到此分组。
8.12.1.4.3.2 Prime Pipe
Prime Pipe 状态通知设备端点数据已分配给一个或多个流,但并不指明具体是哪些流。返回 Idle 状态后,设备应发出 ERDY,以从其“活动且就绪”流列表中启动某个特定流。
- NRDY(Prime) – 进入 Prime Pipe 状态时,设备应返回一个 Stream ID 字段设置为 Prime 的 NRDY TP,并立即转换到 Idle 状态。
8.12.1.4.3.3 Deferred Prime Pipe
Deferred Prime Pipe 状态通知设备端点数据已分配给一个或多个流;但在等待过程中链路已切换到 U1 或 U2 状态。
- 无条件 – 进入 Deferred Prime Pipe 状态后,设备应立即转换到 Idle 状态。
8.12.1.4.3.4 Idle
在 Idle 状态下,管道等待流选择(例如转换到 Start Stream 或 Move Data),或等待主机通知已向管道添加或修改了端点数据(即转换到 Prime Pipe)。注意,首次进入 Idle 时,仅设备可发起流选择。
- ERDY(Stream n, NumP>0) – 为发起流选择,设备生成 Stream ID 设置为 Stream n、NumP 值>0 的 ERDY TP,并转换到 Start Stream 状态,其中 Stream n 为设备提出的流 ID。设备在任何情况下都可发起此转换,并维护一份可生成 ERDY 的“活动且就绪”流列表。ERDY 的 NumP 值反映了设备可用于 Stream n 的端点缓冲区空间。
- DP(Prime, PP=0) – 如果成功接收到 Stream ID=Prime 且 PP=0 的 DP,则设备应转换到 Prime Pipe 状态。DPP 包含零长度数据负载。若检测到 DP 数据出错,设备应保留在 Idle 状态,发送 ACK(Prime, NumP>0, Rty) 重试,直到成功接收 DP(Prime)。
- DP(Stream x) – 如果接收到 Stream ID≠Prime 的 DP,则主机提议流 ID 为 Stream x,设备应转换到 Move Data 状态,并将 Stream x 置为就绪。进入 Move Data 后,设备可用 NRDY 拒绝或用 ACK 接受该提议;转换时将 CStream 设为收到的 Stream x。DPP 包含该流的首个数据负载。通常 Stream x 等于设备最后 ERDY 中的 Stream n,但若发生竞态(主机丢弃 ERDY),则可能不同。
- DPH(Deferred) – 如果接收到带 Deferred (DF) 标志的 DPH,则设备应转换到 Deferred Prime Pipe 状态。当链路在等待主机尝试转换到 Prime Pipe 或 Move Data(HIMD)时切换到 U1/U2,就会收到此分组。
8.12.1.4.3.5 Start Stream
在 Start Stream 状态下,设备等待主机接受或拒绝其提出的“活动且就绪”流选择。
- DP(Stream n) – 若接收到 Stream ID=Stream n 的 DP,则主机已接受设备对启动 Stream n 的提议,且提供了该流的首个数据包,设备应转换到 Move Data 状态,并将 CStream 设为 Stream n。DPP 包含首个数据负载。
- DP(NoStream, PP=0) – 若成功接收到 Stream ID=NoStream 的 DP,则主机已拒绝设备的提议,设备应转换到 Start Stream End 状态。DPP 包含零长度负载,且将 Stream n 置为 Not Ready。若检测到 DP 出错,设备应保留在 Start Stream 状态,发送 ACK(NoStream, NumP>0, Rty) 重试,直到成功接收 DP(NoStream)。
- DP(Prime, PP=0) – 若接收到 Stream ID=Prime 的 DP,则发生竞态:主机在设备发起转移时已进入 Prime Pipe。DPP 包含零长度负载,设备应转换到 Prime Pipe 状态;若检测到错误,还应在 Prime Pipe 状态下重试。
- DP(Stream x) – 若接收到的流 ID 既不等于 Stream n、Prime,也不等于 NoStream(如 Stream x),则发生竞态:主机已进入 Move Data。设备应转换到 Move Data 状态,将 Stream x 置为就绪,CStream 设为 Stream x,DPP 包含该流首个数据负载。在 Move Data 状态下,设备可接受或拒绝主机提议。
- DPH(Deferred) – 若接收到带 Deferred (DF) 标志的 DPH,则设备应转换到 Idle 状态,退出 Start Stream。这种情况仅当 tERDY 超时且链路在等待主机响应期间进入 U1/U2 时才可能发生,设备应在此情况下重发 ERDY。延迟 DPH 无 DPP。
8.12.1.4.3.6 Start Stream End
在 Start Stream End 状态下,设备已收到对其流选择提议的拒绝,必须对主机的 DP 做出响应。Bulk 协议要求对任何 DP 发送 ACK 或 NRDY,Streams 协议规定发送 NRDY。
- NRDY(NoStream) – 设备生成 Stream ID=NoStream 的 NRDY,并转换到 Idle 状态。
8.12.1.4.3.7 Move Data
在 Device OUT Move Data 状态下,管道两端的 CStream 均为同一值,管道可主动传输数据。Move Data 状态下总线事务的详细流程及退出条件在下文的 Device OUT Move Data 状态机中定义。
设备 OUT 移动数据状态机(DOMDSM)如上所述可从 Start Stream 或 Idle 状态进入。DOMDSM 允许设备在与某个流关联的功能缓冲区空间耗尽时终止移动数据操作,也允许主机在与某个流关联的端点数据耗尽时终止移动数据操作。
- PP = 0 – 进入 DOMDSM 时,如果主机对于该流只剩一个数据包的端点数据可用,则设备接收到的第一个 DP 中 PP 将等于 0,此时应转换到 OUTMvData Device Terminate 状态。
- PP = 1 – 进入 DOMDSM 时,如果主机对于该流有多于一个数据包的端点数据可用,则设备接收到的第一个 DP 中 PP 将等于 1,此时应转换到 OUTMvData Device 状态。
DOMDSM 始终退出到 Idle 状态。导致 DOMDSM 退出的数据包中不得设置重试(Rty=1)标志。在数据包重试期间,流管道保持在移动数据状态。
注意:在移动数据状态中交换的所有数据包,其流 ID 值应始终为 CStream;如果在 DOMDSM 中检测到与 CStream 不同的流 ID 值,设备应停止该端点。
注意:若在首次进入移动数据状态时 CStream 并非处于活动状态,设备可按关联设备类的定义,通过发送 NRDY 或对管道发出 STALL 来拒绝该流提议。
8.12.1.4.3.8 OUTMvData Device
此状态最初由 Start Stream 状态或 Idle 状态进入。在此状态下,设备对应主机发送的最后一个 DP 进行应答,或可拒绝主机的 HIMD。
- ACK(CStream, NumP>0) – 如果设备对 CStream 仍有功能缓冲区空间,则应向主机发送 NumP > 0 的 ACK TP,并转换到 OUTMvData Host 状态。注意,如果设备在上一个主机 DP 中检测到错误,则此数据包中可设置重试(Rty)标志。主机应在所有重试耗尽或收到正向确认(Rty=0)前继续当前突发。此转换表示先前接收的 DP 数据负载已被端点接受用于 CStream。
- ACK(CStream, NumP=0) – 如果设备对 CStream 已无更多端点缓冲区空间,则应生成 NumP=0 的 ACK TP,退出 DOMDSM 并转换到 Idle 状态。此转换允许设备在端点缓冲区空间耗尽时退出移动数据状态,并表示先前接收的 DP 数据负载已被端点接受用于 CStream。
- NRDY(CStream) – 设备也可通过发送 Stream ID 为 CStream 的 NRDY 来终止后续 CStream 传输,转换到 Idle 状态并退出 DOMDSM。设备可在首次进入 DOMDSM 时生成此转换以拒绝 HIMD,或在传输过程中因内部异常而流控 CStream。此转换表示先前接收的 DP 数据负载已被丢弃。
8.12.1.4.3.9 OUTMvData Host
此状态下,主机刚收到设备对应先前 DP 的 ACK TP,且对 CStream 仍有更多端点数据可用。主机在此状态生成新的 DP,管道也将在主机突发之间停留此状态。
- DP(CStream, PP=1) – 如果设备收到 PP=1 的 DP,则应转换到 OUTMvData Device 状态。DPP 应包含 CStream 数据负载。这是主机在对 CStream 可用端点数据超过一个最大包大小时的响应。
- DP(CStream, PP=0) – 如果设备收到 PP=0 的 DP,则应转换到 OUTMvData Host Terminate 状态。DPP 应包含 CStream 数据负载。这是主机在用尽对 CStream 可用端点数据时的响应,且 DP 长度 ≤ 一个最大包大小。
- DPH(Deferred) – 如果收到带 Deferred (DF) 标志的 DPH,则设备应转换到 Idle 状态,退出 DOMDSM。当链路在等待下一个主机 DP 时切换到 U1/U2 状态时,会收到此分组。延迟 DPH 无对应的 DPP。
8.12.1.4.3.10 OUTMvData Host Terminate
此状态由主机刚发送完其对 CStream 可用的最后一个 DP(即用尽 CStream 端点数据)而进入。在此状态下,设备对应主机的最后一个 DP 进行应答以完成移动数据传输。
- ACK(CStream, NumP=0) – 如果设备的功能缓冲区空间也已耗尽,则应生成 NumP=0 的 ACK TP 并转换到 Idle 状态,退出 DOMDSM。
ACK(CStream, NumP>0) – 如果设备的功能缓冲区空间尚未耗尽,则应生成 NumP > 0 的 ACK TP,并转换到 Idle 状态,退出 DOMDSM。此转换应将 CStream 置为 Not Ready。
ACK(CStream, NumP>0, Rty) – 如果设备检测到上一个 DP 出错,则应生成 NumP > 0 且 Rty = 1 的 ACK TP,以便主机重试该 DP。随后设备应转换到 OUTMvData Host 状态。
NRDY(CStream) – 设备可通过发送 Stream ID 为 CStream 的 NRDY 来对最后一次 CStream 传输进行流控,并转换到 Idle 状态,退出 DOMDSM。设备可能因意外内部情况需要流控 CStream 而生成此转换。
8.12.1.4.4 Host IN Stream Protocol
本节定义了在 IN 批量端点上,将主机端流协议从一个状态转换到另一个状态所需的增强型 SuperSpeed 分组交换。在下文中,假定“Host IN Stream 状态转换”发生在主机向设备发送与状态机相关消息的第一个符号的第一个比特时,或发生在主机首次解码设备的状态机相关消息时。对于 IN 管道,主机中的端点缓冲区接收设备的功能数据。
图 8‑43 Host IN Stream Protocol State Machine (HISPSM) 显示该状态机。
8.12.1.4.4.1 Disabled
在端点被配置完成或出现端点错误条件(Stall、tHostTransactionTimeout 等)后,管道进入 Disabled 状态,且 LCStream 初始化为 NoStream。
- ACK(Prime, NumP>0, PP=0) – 当系统软件将初始端点缓冲区分配给管道后,主机应发送 Stream ID 字段设置为 Prime 的 ACK TP 给设备,并将管道转换到 Prime Pipe 状态。
8.12.1.4.4.2 Prime Pipe
Prime Pipe 状态通知设备端点缓冲区已分配给一个或多个流。
- NRDY(Prime) – 如果主机收到 Stream ID=Prime 的 NRDY TP,则应转换到 Idle 状态。这是 Prime Pipe 操作的正常终止。
- ACK(Deferred) – 如果收到带 Deferred (DF) 标志的 ACK,则主机应将管道转换到 Idle 状态。当管道在等待初始端点缓冲区分配时,链路已切换到 U1 或 U2,就可能收到此分组(例如在 Disabled 状态下已生成 ACK(Prime, NumP>0, PP=0) 后)。
- ERDY() – 如果收到 ERDY,则发生竞态:此时设备在 Start Stream 状态,而主机在 Prime Pipe 状态。主机已进入 Prime Pipe 通知设备端点缓冲区已更新,与此同时设备尝试启动流传输,二者消息在链路上交错。为解决该情况,主机应保持在 Prime Pipe 状态,等待设备发送 NRDY(Prime)。
8.12.1.4.4.3 Idle
在 Idle 状态下,管道等待流选择(如转换到 Start Stream 或 Move Data),或等待主机通知已向管道添加或修改了流端点缓冲区(即转换到 Prime Pipe)。注意,首次进入 Idle(即从 Disabled)时,仅设备可发起流选择。
- ERDY(Stream n, NumP>0) – 如果收到 ERDY,主机应转换到 Start Stream 状态。设备通过 ERDY 选择一个特定流(Stream n)以期望主机开始 IN 事务。设备可随时发起该转换,并且 ERDY 的 NumP 字段值反映设备可用于 Stream n 的端点数据量。ERDY NumP 值仅供参考,具体的流选择算法由与管道关联的设备类定义。转换到 Start Stream 后,主机将 LCStream 设置为 Stream n。
- ACK(Deferred) – 如果收到带 Deferred (DF) 标志的 ACK,则主机保持在 Idle 状态。当主机在拒绝设备的 Start Stream 请求(即已发送 ACK(NoStream, NumP=0, PP=0))时,链路在等待期间切换到 U1/U2,就可能收到此分组。此情况仅在 tERDYTimeout 超时后出现。
- Stream x EP Buffer Change – 如果主机的一个或多个端点缓冲区状态发生更改,主机在“&”处评估由软件提交给主机控制器的流 ID(Stream x),并可能直接转换到 Prime Pipe 或 Move Data 状态。这是一种优化,称为主机发起移动数据(HIMD),可让主机直接进入 Move Data 而无需经过 Prime Pipe → Start Stream → Move Data 序列。具体算法由主机决定。
- & ACK(Prime, NumP>0, PP=0) – 如果选择转换到 Prime Pipe,主机应生成 Stream ID=Prime、NumP>0、PP=0 的 ACK TP,并转换到 Prime Pipe。主机通常在修改了缓冲区的流不是设备最后选择的流时(Stream x ≠ LCStream)选择此转换。
- ACK(Stream x, NumP>0) – 如果选择转换到 Move Data,主机应生成 Stream ID=Stream x、NumP>0 的 ACK TP,并转换到 Move Data。转换后主机将 CStream 设置为 Stream x。通常在修改的流与设备最后选择的流相同时(Stream x = LCStream)选择此转换。此时 PP 应等于 1,因为主机可接收设备的下一个 DP。某些主机或设备类(如 Mass Storage UASP)可能禁用此转换。
8.12.1.4.4.4 Start Stream
在 Start Stream 状态下,设备已发送 ERDY,提议主机启动对 Stream n 的 IN 传输,并等待主机接受或拒绝该流选择。
- ACK(Stream n, NumP>0) – 如果主机接受了对 Stream n 的提议,则应发送 Stream ID=Stream n、NumP>0 的 ACK TP,并转换到 Move Data 状态。转换后主机将 CStream 设置为 Stream n。主机在有可用端点缓冲区时应接受设备的流提议。此时 PP 应等于 1。
- ACK(NoStream, NumP=0, PP=0) – 如果主机拒绝了对 Stream n 的提议,则应发送 Stream ID=NoStream、NumP=0、PP=0 的 ACK TP,并转换到 Idle 状态。主机在没有可用端点缓冲区时应拒绝设备的流提议。
8.12.1.4.4.5 Move Data
在 Host IN Move Data 状态下,管道两端的 CStream 均为相同值,管道可主动传输数据。Move Data 状态下总线事务的详细流程及其退出条件在下文的 Host IN Move Data 状态机中定义。
主机 IN 移动数据状态机(HIMDSM)如上所述可从 Start Stream 或 Idle 状态进入。进入 HIMDSM 后会立即转换到 INMvData Device 状态。HIMDSM 允许设备在与某个流关联的功能数据耗尽时终止移动数据操作,也允许主机在与某个流关联的端点缓冲区空间耗尽时终止移动数据操作。HIMDSM 始终退出到 Idle 状态。导致 HIMDSM 退出的数据包中不得设置重试(Rty=1)标志。在数据包重试期间,流管道保持在移动数据状态。
注意:在移动数据状态中交换的所有数据包,其流 ID 值均应为 CStream(仅 INMvData Device 子状态的 ERDY 转换除外)。在 HIMDSM 中若检测到与 CStream 不同的流 ID 值,主机应停止该端点。
8.12.1.4.4.6 INMvData Device
此状态最初由 Start Stream 或 Idle 状态进入。在此状态下,主机正在等待设备发送 DP 或等待对 HIMD 的拒绝。
- DP(CStream, EOB=0) – 如果主机收到 EOB=0 的 DP,则应将该 DP 数据复制到与该流关联的端点缓冲区,并转换到 INMvData Host 状态。DPP 应包含 CStream 数据负载。此转换发生在设备返回 IN 数据且仍有更多功能数据可发送时。转换后,主机将 LCStream 设置为 CStream,以记录设备上次感兴趣的流。
- DP(CStream, EOB=1) – 如果主机收到 EOB=1 的 DP,则应将该 DP 数据复制到与该流关联的端点缓冲区,并转换到 INMvData Device Terminate 状态。DPP 应包含 CStream 数据负载。此转换发生在设备返回 IN 数据且功能数据已耗尽时,例如该 DP 耗尽了该流的所有功能数据。转换后,主机将 LCStream 设置为 CStream。
- NRDY(CStream) – 如果主机收到 NRDY,则应退出 HIMDSM 并转换到 Idle 状态。此转换可在首次进入 HIMDSM 且设备拒绝 HIMD 时发生,或在传输过程中因设备内部异常而需要流控 CStream 时发生。
- ACK(Deferred) – 如果主机收到带 Deferred (DF) 标志的 ACK,则应退出 HIMDSM 并转换到 Idle 状态。当主机与设备之间的链路在等待重启突发时切换到 U1/U2 状态,就会收到此分组。此转换有两种情况:1)主机尝试 HIMD 后长时间等待;2)突发之间其他设备活动繁忙导致延迟。主机将此转换视为 Prime Pipe,并在接收到集线器转发的延迟 ACK 后发送 ERDY 重启流。
- ERDY() – 如果主机收到 ERDY,则发生竞态:此时设备在 Start Stream 状态,主机在 Move Data 状态。主机因 HIMD 进入 Move Data,与此同时设备也尝试启动流传输,两者消息交错。为解决此条件,主机应保持在 INMvData Device 状态,等待设备发送 DP 或 NRDY。
8.12.1.4.4.7 INMvData Host
此状态下,主机已从设备收到一个有更多功能数据可用的 DP,并已将数据复制到对应流的端点缓冲区,现需发送应答。
- ACK(CStream, NumP>0, PP=1) – 如果对该流仍有更多端点缓冲区空间且主机将继续当前突发,则主机应生成 NumP>0、PP=1 的 ACK TP 并转换到 INMvData Device 状态。如在上一个 DP 中检测到错误,则应设置 Rty 标志。主机可在所有重试完成或接收正确分组前,一直在 INMvData Host ↔ INMvData Device 循环;若此次突发在重试完成前终止,可进入 INMvData Burst End(Rty=1),并在下一可用时机返回 INMvData Device(Rty=1)继续重试,符合端点类型约束。
- ACK(CStream, NumP=0, PP=1) – 如果对该流仍有端点缓冲区空间,但需终止当前突发,则主机应生成 NumP=0、PP=1 的 ACK TP 并转换到 INMvData Burst End 状态。如在上一个 DP 中检测到错误,则应设置 Rty 标志。
- ACK(CStream, NumP=0, PP=0) – 如果上一个 DP 无错误且该流的端点缓冲区空间已耗尽,则主机应生成 NumP=0、PP=0 的 ACK TP 并转换到 Idle 状态,退出 HIMDSM。此转换通知设备主机已耗尽该流的端点缓冲区空间。
8.12.1.4.4.8 INMvData Burst End
此状态由主机终止某个流管道的突发而进入。主机在准备开始下一突发时退出此状态。若进入此状态时正在重试(Rty=1),则退出时仍应保留 Rty 标志,并在符合端点类型约束的情况下继续重试。
- ACK(CStream, NumP>0, PP=1) – 当准备对 CStream 启动新突发时,主机应生成 NumP>0、PP=1 的 ACK 并转换到 INMvData Device 状态。若进入此状态时 Rty=1,则退出时仍应设置 Rty。
8.12.1.4.4.9 INMvData Device Terminate
此状态下,主机已收到设备最后一个 DP(设备功能数据已耗尽),并已将数据复制到对应端点缓冲区,现需发送应答并退出 HIMDSM。如接收的 DP 错误,可在符合端点类型约束下重试。
- ACK(CStream, NumP=0, No Rty) – 如果接收的 DP 无错误,则主机生成 NumP=0、Rty=0 的 ACK,并转换到 Idle 状态,退出 HIMDSM。
- ACK(CStream, NumP>0, PP=1, Rty) – 如果接收的 DP 出错且当前突发未完成,则主机生成 NumP>0、PP=1、Rty=1 的 ACK,并转换到 INMvData Device 状态。主机可在所有重试完成或接收正确分组前,一直在 Device Terminate ↔ Device 循环。
- ACK(CStream, NumP=0, PP=1, Rty) – 如果接收的 DP 出错且当前突发已完成,则主机生成 NumP=0、PP=1、Rty=1 的 ACK,并转换到 INMvData Burst End 状态。主机应在下一突发中继续重试。
8.12.1.4.5 Host OUT Stream Protocol
本节定义了在 OUT 批量端点上,将主机端流协议从一个状态转换到另一个状态所需的增强型 SuperSpeed 分组交换。在下文中,假定“Host OUT Stream 状态转换”发生在主机向设备发送与状态机相关消息的第一个符号的第一个比特时,或发生在主机首次解码设备的状态机相关消息时。对于 OUT 管道,设备的功能缓冲区接收主机的端点数据。
主机 OUT 移动数据状态机(HOMDSM)如上所述可从 Start Stream 或 Idle 状态进入。进入 HOMDSM 后会立即转换到 OUTMvData Device 状态。HOMDSM 允许设备在与某个流关联的功能缓冲区空间耗尽时终止移动数据操作,也允许主机在与某个流关联的端点数据耗尽时终止移动数据操作。HOMDSM 始终退出到 Idle 状态。导致 HOMDSM 退出的数据包中不得设置重试(Rty=1)标志。在数据包重试期间,流管道保持在移动数据状态。
注意:在移动数据状态中交换的所有数据包,其流 ID 值均应为 CStream(仅 OUTMvData Device 子状态的 ERDY 转换除外)。在 HOMDSM 中若检测到与 CStream 不同的流 ID 值,主机应停止该端点。
8.12.1.4.5.6 HOMDSM 条目
- PP = 0 – 进入 HOMDSM 时,如果主机对该流仅有一个数据包的端点数据可用,则发送给设备的第一个 DP 中 PP=0,并转换到 OUTMvData Device Terminate 状态。
- PP = 1 – 进入 HOMDSM 时,如果主机对该流有多于一个数据包的端点数据可用,则发送给设备的第一个 DP 中 PP=1,并转换到 OUTMvData Device 状态。
8.12.1.4.5.7 OUTMvData Device
此状态最初由 Start Stream 或 Idle 状态进入。在此状态下,主机正在等待设备发送 ACK TP 或拒绝 HIMD。
- ACK(CStream, NumP>0) – 如果主机收到 NumP>0 的 ACK TP,则转换到 OUTMvData Host 状态,表示设备对该流仍有更多功能缓冲区空间可用。若设备检测到上一个 DP 错误,则此包中应设置重试(Rty)标志。若请求重试,主机应继续当前突发,直到所有重试完成或成功传输正确包。主机将 LCStream 设置为 CStream,以记录设备上次感兴趣的流。
- ACK(CStream, NumP=0) – 如果主机收到 NumP=0 的 ACK TP,则转换到 Idle 状态,退出 HOMDSM,表示设备对该流功能缓冲区空间已耗尽。主机将 LCStream 设置为 CStream。
- NRDY(CStream) – 如果主机收到 NRDY,则转换到 Idle 状态,退出 HOMDSM。此转换可在首次进入 HOMDSM 时设备拒绝 HIMD,或在传输过程中设备因异常情况流控 CStream 时发生。
- DPH(Deferred) – 如果主机收到带 Deferred (DF) 标志的 DPH,则转换到 Idle 状态,退出 HOMDSM。此包可能在主机尝试 HIMD 时,或在 OUT 管道突发之间、其他设备活动繁忙且路径上的 Ux 超时较短时收到。此转换后,主机在 Idle 状态下等待设备发送 ERDY 以重启流。延迟 DPH 无 DPP。
- ERDY() – 如果主机收到 ERDY,则发生竞态:此时设备在 Start Stream 状态,主机在 Move Data 状态。主机因 HIMD 进入 Move Data,而设备同时尝试启动流传输,消息在链路上交错。为解决该情况,主机应保持在 OUTMvData Device 状态,等待设备发送 ACK 或 NRDY。
8.12.1.4.5.8 OUTMvData Host
此状态下,主机已收到设备的 ACK TP 且设备对 CStream 仍有功能缓冲区空间可用,主机需发送包含端点数据的 DP,并在突发间停留此状态。注意,DP 重试过程可跨突发进行。
- DP(CStream, PP=1) – 如果对该流仍有端点数据可用且主机继续当前突发,则生成 PP=1 的 DP,并转换到 OUTMvData Device 状态。DPP 应包含 CStream 数据负载。若设备在上一个 ACK 中请求重试(Rty),主机应重发相应 DP,直到所有重试完成或设备确认正确 DP。
- DP(CStream, PP=0) – 如果此 DP 耗尽了对 CStream 的所有端点数据,则生成 PP=0 的 DP,并转换到 OUTMvData Host Terminate 状态。
8.12.1.4.5.9 OUTMvData Host Terminate
此状态由主机用尽其对 CStream 可用的所有端点数据并发送最后一个 DP 后进入。主机在此状态下等待对最后一个 DP 的应答。
- ACK(CStream, NumP=0) – 若收到 NumP=0、Rty=0 的 ACK TP,则转换到 Idle 状态,退出 HOMDSM。此转换发生在设备成功接收最后一个 DP,且主机与设备同时耗尽各自数据/缓冲区时。
- ACK(CStream, NumP>0, No Rty) – 若收到 NumP>0、PP=0、Rty=0 的 ACK,则转换到 Idle 状态,退出 HOMDSM。此转换发生在设备成功接收最后一个 DP,主机耗尽其对 CStream 的端点数据,但设备仍有功能缓冲区空间时。
- ACK(CStream, NumP>0, Rty) – 若收到 NumP>0、Rty=1 的 ACK,则转换到 OUTMvData Host 状态并重发相应 DP。此转换发生在设备接收最后一个 DP 出错且需重试时。主机可在所有重试完成或设备确认正确 DP 前,一直在 Host Terminate ↔ Host 循环。
- NRDY(CStream) – 若收到 NRDY,则转换到 Idle 状态,退出 HOMDSM。此转换可在传输过程中设备因异常情况流控 CStream 时发生。
- DPH(Deferred) – 若收到带 Deferred (DF) 标志的 DPH,则转换到 Idle 状态,退出 HOMDSM。此包在主机发送最后一个 DP 前链路切换到 U1/U2 时收到。延迟 DPH 无 DPP。
8.12.2 控制传输
控制传输至少包括两个事务阶段:Setup 和 Status。可选地在这两者之间包含 Data 阶段。Data 阶段的方向由 Setup 包负载首字节的 bmRequestType 字段指示。
- Setup 阶段使用 SETUP 事务将信息发送到设备的控制端点。SETUP 格式类似于 Bulk OUT,但 DPH 中 Setup 字段为 1,Data Length 字段为 8,且序号始终为 0。接收 Setup 包的设备应按 8.11.4 定义响应。无论阶段或方向如何,TP 或 DP 中的 Direction 字段对所有控制端点均设为 0;TT 字段在 SuperSpeedPlus 模式下由主机和设备设为 Control(见表 8‑13)。
- 若端点成功接收 Setup 包,可返回 NumP=0 的 ACK TP 进行流控;设备必须在准备好继续传输(Data 或 Status 阶段)时发送 ERDY。注意,主机可在任何端点 – 即使未返回 ERDY – 上恢复事务。
- Data 阶段(若存在)由一个或多个 IN/OUT 事务组成,遵循与 Bulk 相同的协议,但 Direction 字段始终为 0,初始序号为 0,且所有事务方向一致。最大数据量和方向由 Setup 阶段确定;若数据超出单包大小,则分多包发送,最后一个包可为残余数据。所有控制端点仅支持突发大小为 1,因此主机与控制端点一次只能收发一个包。
- Status 阶段是最后事务,由 SubType=STATUS 的 TP 标识。若 STATUS TP 中 Deferred 位为 0,设备应发送 NRDY、STALL 或 ACK。若发送 NRDY,则主机需等待设备对该控制端点发送 ERDY 后,方可再次发送 STATUS TP。然而,主机可在任何端点 – 即使未收到 ERDY – 上恢复事务。若 STATUS TP 的 Deferred 位为 1,设备应发送 ERDY 表示已准备好完成控制传输的状态阶段。
图 8‑47 和图 8‑48 显示了控制读写序列的事务顺序、序号值和数据包类型。
当控制端点在控制传输的数据阶段或状态阶段发送 STALL TP 后,在收到下一个 SETUP DP 之前,对该端点的所有后续访问都应返回 STALL TP。端点在接收到后续的 SETUP DP 时,应返回 ACK TP。对于控制端点,如果对 SETUP 事务返回 ACK TP,则主机认为端点已自动从导致 STALL 的状态恢复,并应正常工作。
8.12.2.1 状态报告结果
在状态阶段,设备向主机报告传输的前序 Setup 阶段和 Data 阶段的结果。可返回三种可能状态:
- 命令序列已成功完成。
- 命令序列未能完成。
- 设备仍在完成命令。
状态报告始终为设备到主机方向。表 8‑31 总结了各状态所需返回的响应类型。所有控制传输都在响应 STATUS TP 事务时,通过 TP 向主机返回状态。
请注意,尽管状态报告始终是从设备到主机方向,但 STATUS TP 应被视为一次 OUT 事务。主机可在不等待 STATUS TP 响应的情况下,对其他端点开始执行 IN 事务。
表 8‑31 状态阶段响应
中文翻译与解释 | 说明 |
---|---|
设备发送的状态响应事务包 (TP) | 设备向主机发送的状态响应包。 |
请求完成 (ACK 事务包) | 请求被成功处理,设备返回确认(ACK)包。 |
请求错误 (STALL 事务包) | 请求无法处理(端点停止/错误),设备返回停止(STALL)包。 |
设备忙 (NRDY 事务包) | 设备当前无法处理数据(忙),通知主机“未准备好”(NRDY)。 |
主机应向控制管道发送 STATUS TP,以启动状态阶段。管道对该 TP 的握手响应指示当前状态:
- NRDY TP 表示设备仍在处理命令,完成后应发送 ERDY TP。
- ACK TP 表示设备已完成命令,且准备好接受新命令。
- STALL TP 表示设备发生错误,无法完成命令。
控制端点发送的 ACK TP 其 NumP 字段应设为零,但这不被视为控制端点的流控条件。若在数据阶段向控制管道发送的数据超出 Setup 阶段指定的长度,或请求返回的数据超出指定长度,管道应返回 STALL TP。若在数据阶段返回 STALL TP,则该控制传输不应进行状态阶段。
8.12.2.2 可变长度数据阶段
控制管道可在数据阶段返回比指定数据结构更多的数据。当所有数据结构内容已返回主机后,设备通过返回一个载荷小于该端点最大包大小的 DP 来表示数据阶段结束。注意:若返回的数据量虽少于主机请求量,但正好是最大包大小的整数倍,则控制端点应发送零长度 DP 以终止数据阶段。
8.12.2.3 控制管道返回的 STALL TP
控制管道可因控制传输问题返回 STALL TP。若设备无法完成命令,则在数据阶段和/或状态阶段返回 STALL TP。与功能性 Stall 不同,协议性 Stall 并不表示设备错误,其状态持续到接收到下一次 SETUP DP 为止,且在此之前,对该管道的任何 IN 或 OUT 事务均应返回 STALL TP。协议性 Stall 通常表示设备不理解请求或其参数,为扩展 USB 请求提供机制。控制管道不支持功能性 Stall。
8.12.3 总线间隔与服务间隔
对于所有周期性(中断和同步)端点,端点必须被服务的间隔称为“服务间隔”。在本规范中,“总线间隔”一词用于指代 USB 2.0 规范中定义的一个微帧间隔。
8.12.4 中断事务
中断传输类型用于具有有界服务周期的不频繁数据传输。它支持可靠的数据传输并保证有界延迟。只要有数据可用,就能保证恒定的数据速率。若检测到传输数据出错,主机无需在同一服务间隔内重试该事务;但若设备暂时无法发送或接收数据(即响应 NRDY TP),主机应仅在收到该设备针对该端点发送的 ERDY TP 后,才恢复对该端点的事务。中断事务与批量事务非常相似,但在每个服务间隔内限制最多突发三个 DP。SuperSpeedPlus 模式下,主机和设备应将 TT 字段设为 Interrupt(见表 8‑13)。只要设备接受数据(OUT 端点)或返回数据(IN 端点),主机应按照约定的服务间隔持续对中断端点执行事务。主机必须对服务间隔内成功接收的每个 DP 发送 ACK TP,即使它是该间隔内的最后一个 DP;此最后一个 ACK TP 的 Number of Packets 字段应设为零。若在当前服务间隔内对中断端点执行事务时发生错误,主机无需在当前间隔内重试,但最迟应在下一个服务间隔中重试。
8.12.4.1 中断 IN 事务
当主机希望对端点启动中断 IN 事务时,应向该端点发送一个 ACK TP,指定期望的序号和期望从端点接收的数据包数。如果中断端点能够响应该 ACK TP 并发送数据,则可在同一服务间隔内最多发送主机请求的数据包数。主机应对每个 DP 响应一个 ACK TP,以确认数据成功接收;若 DPP 损坏,则发送带重试请求的 ACK TP。注意,主机在首次从特定端点启动传输时(即端点经 Set Configuration、Set Interface 或 ClearFeature(ENDPOINT_HALT) 初始化后),期望第一个 DP 的序号为零。中断端点应按照第 8.11.1 节的描述,对主机的 TP 做出响应。只要设备在主机发送 ACK TP 后持续返回数据且传输未完成,主机就应在该端点的每个服务间隔内继续发送 ACK TP。下列任一情况发生时,主机应停止对该设备端点的事务:
- 端点响应 NRDY TP 或 STALL TP。
- 传输的所有数据已成功接收。
- 端点在发送给主机的最后一个 DP 中设置了 EOB 标志。
当端点收到主机的 ACK TP 却无法发送数据时,应向主机发送 NRDY TP(若是内部端点或设备错误则发送 STALL TP)。此后,在后续服务间隔内,主机不得再对该端点执行事务。只有在收到端点发送的 ERDY TP 后,主机方可恢复对之前返回流控响应的端点的中断事务,从而获知端点已准备好再次传输数据。一旦主机收到 ERDY TP,应在不晚于两倍服务间隔(由中断端点描述符的 bInterval 字段值决定)内,通过发送 ACK TP 向端点发起 IN 请求。中断端点应返回 DP(序号为上次成功发送数据包序号加 1)或若无法返回数据,则返回 NRDY TP 或 STALL TP。
若设备收到延迟的中断 IN TP 且需要发送中断 IN 数据,则应响应 ERDY TP,并将链路保持在 U0,直到收到主机的下一次中断事务,或直到 tPingTimeout(见表 8‑36)超时。与批量事务相同,中断端点发送的每个数据包序号均递增;当序号达到 31 时回绕为 0。
图 8‑49. 主机在每个服务间隔内发送中断 IN 事务。
注意:在图 8-53 中,主机在同一服务间隔内重试了接收到出错的数据包。这并不是必须的,主机也可以选择在下一个服务间隔中重试该事务。
8.12.4.2 中断 OUT 事务
当主机希望对某个端点启动中断 OUT 事务时,它会发送第一个具有预期序号的 DP。如果该端点支持的突发大小大于 1,主机可以在同一服务间隔内向端点发送更多的数据包。如果端点能够接收来自主机的数据,它将发送 ACK TP 来确认数据已成功接收。
注意,在主机对某个端点执行首次传输(该端点通过 Set Configuration、Set Interface 或 ClearFeature(ENDPOINT_HALT) 命令初始化,详见第 9 章)时,主机会将第一个 DP 的序号初始化为 0。
只要设备对主机发送的数据包响应 ACK TP 且传输尚未完成,主机应在该端点的每个服务间隔内继续向设备发送数据。设备应对 DP 的成功接收进行确认,或者在数据包损坏的情况下请求主机重试该事务。
对于主机发送的 OUT 数据,中断端点应按照第 8.11.3 节中的描述进行响应。
当某个端点从主机接收到数据后,如果此时暂时无法接收数据,则应向主机发送一个 NRDY TP(在端点或设备内部发生错误的情况下则发送 STALL TP)。主机在随后的服务间隔中不应再对该端点执行任何事务。
主机仅在收到该端点发出的 ERDY TP 后,才可恢复对先前返回流控响应的端点执行中断事务。ERDY TP 通知主机该端点已准备好再次接收数据。一旦主机收到 ERDY TP,主机必须在不超过该端点中断端点描述符中 bInterval 字段所确定的服务间隔的两倍时间内,将数据包传输到该端点。
如果设备接收到一个被延迟(Deferred)的中断 OUT 类型的 DPH,并且该设备需要接收中断 OUT 数据,则设备应发送一个 ERDY TP,并保持链路处于 U0 状态,直到收到主机的后续中断事务,或者直到 tPingTimeout
(见表 8-36)超时为止。
与 Bulk 事务类似,主机发送的每个数据包的序号都会持续递增。当序号增加到 31 时,会回绕至 0。
图 8-54. 主机在每个服务间隔中发送中断 OUT 事务
注意:在图 8-57 中,主机在同一服务间隔内重试了一个接收到错误的数据包。主机并不要求必须在同一服务间隔内进行重试,也可以在下一个服务间隔中重试该事务。
8.12.5 主机计时信息
USB 3.0 主控制器不会像传统 USB 那样向所有设备广播常规的帧起始(SOF)数据包。在 Enhanced SuperSpeed USB 链路中,主机通过等时戳记数据包(ITP)来发送主机计时信息,这种数据包会在根端口链路处于 U0 且接近总线间隔边界时发送。集线器会将等时戳记数据包(根据第 10.9.4.4 节所述进行必要的修改)转发到任何处于 U0 状态且已完成端口配置的下游端口。
主机必须基于非扩频时钟提供等时戳记。需要等时戳记进行操作的设备必须确保链路在总线间隔边界附近处于 U0 状态。除非确实需要等时戳记进行正常操作,否则设备不应仅为了接收戳记而强行维持链路处于 U0 状态。
注意: 如果设备的链路在总线间隔边界时处于 U0,则该设备会接收到等时戳记数据包。这意味着对于没有任何等时端点或不需要同步的设备来说,丢弃等时戳记数据包不会带来负面影响。
等时戳记数据包会在每个总线间隔边界附近发送,并传达当前的总线间隔编号及从戳记数据包开始到前一个总线间隔之间的时间。等时端点会请求一个服务间隔,长度为一个总线间隔乘以 2^n 微秒,其中 n 是一个介于 0 到 15(含)之间的整数。
ITP 所传递的计时信息能够确保所有等时端点接收到相同的总线间隔边界。除非主机链路进入 U3,主机必须始终保持所有端点的服务间隔边界对齐。当主机根端口链路退出 U3 状态后再次进入 U0 状态时,主机必须在 tIsochronousTimestampStart
时间内开始发送 ITP。此时 ITP 的边界可能仍与进入 U3 状态之前的边界对齐。
图 8-59 展示了一个示例:一个等时 IN 端点和一个等时 OUT 端点连接在同一个 USB 3.0 主控制器下。等时 IN 端点的服务间隔为 X,而等时 OUT 端点的服务间隔为 2X。主机可以在服务间隔的任意位置安排等时 IN(通过 ACK TP)或等时 OUT 的数据传输。
设备通过检测总线间隔计数器(Bus Interval Counter)的最低有效位(LSB)翻转来识别新的服务间隔的开始。需要监视多少位取决于 bInterval
的设置。例如:
- 如果服务间隔为 2 个总线间隔,那么当总线间隔计数器的最低 1 位变为 ‘0’ 时,即表示新的服务间隔开始;
- 如果服务间隔为 4 个总线间隔,则当计数器的最低 2 位变为 ‘00’ 时,表示新的服务间隔开始;
- 依此类推。
若 bInterval
设置为 1,则当总线间隔计数器的最低有效位发生变化时,设备应识别出服务间隔的开始。
设备不得假设每个服务间隔内的数据传输事务总发生在相同的位置。主机必须调度等时事务,使其不会跨越服务间隔边界。
8.12.6 等时传输
以下各节定义了适用于 SuperSpeed 和 SuperSpeedPlus 设备的等时(Isochronous)传输协议。SuperSpeedPlus 协议放宽了主机在向 SuperSpeedPlus 设备调度等时传输时的限制,并引入了向端点发起流水线事务请求的能力,以提高总线效率。
8.12.6.1 增强型 SuperSpeed 等时传输
等时 IN 事务如图 8-60 所示,等时 OUT 事务如图 8-61 所示。
对于 IN 事务,主机会先发送一个 ACK TP,随后进入数据阶段,端点发送数据给主机。
对于 OUT 事务,当当前服务间隔内有数据要传输时,主机直接发送数据。
等时传输不支持重试机制。
在 SuperSpeedPlus 模式下运行的主机和外围设备,应将 TT 字段设置为 Isochronous;详见表 8-13。
图 8-60:增强型 SuperSpeed 等时 IN 事务格式
图 8-61:增强型 SuperSpeed 等时 OUT 事务格式
每个服务间隔内的第一个数据包(DP)或 ACK 事务包(TP)应从序列号 0 开始。
对于在单个服务间隔中包含多个数据包的等时事务,每个后续的数据包其序列号递增 1。当序列号达到 31 后,后续的数据包序列号重新从 0 开始。
具有等时端点的设备应能够在每个服务间隔内发送或接收其端点描述符和端点伴随描述符中所指示的数据包数量。主机应能在每个服务间隔内接收和发送的最大数据包数量如下:
- 对于运行在 Gen 1x1 速度的设备:最多 48 个数据包(DP)
- 对于运行在 Gen 1x2 或 Gen 2x1 速度的设备:最多 96 个数据包
- 对于运行在 Gen 2x2 速度的设备:最多 192 个数据包
服务间隔中的最后一个数据包应设置 lpf
字段为 1,其长度可小于或等于最大数据包大小(MaxPacketSize)。服务间隔中除最后一个之外的每个数据包应设置 lpf
为 0,并具有等于 MaxPacketSize 的长度。
如果在某个服务间隔内没有要发送给等时 OUT 端点的数据,主机在该间隔内不会发送任何内容。如果设备的等时 IN 端点在接收到主机发出的等时 IN ACK TP 时没有数据可发送,则设备应发送一个零长度数据包。
图 8-62 和图 8-63 显示了对每个服务间隔请求 2000 字节带宽(即每个服务间隔最多只能发送或接收两个数据包)的等时 IN 和 OUT 事务示例。
如果主机由于错误条件无法在指定间隔内发送等时 OUT 数据,则主机会丢弃该数据并通知主机软件该错误。如果主机由于错误条件无法在指定的服务间隔内发送等时 ACK TP,同样也会通知主机软件发生了错误。
图 8-62. 增强型 SuperSpeed 等时 IN 事务示例
图 8-63. 增强型 SuperSpeed 等时 OUT 事务示例
图 8-64. 增强型 SuperSpeed 等时 IN 事务示例
图 8-65. 增强型 SuperSpeed 等时 OUT 事务示例
8.12.6.1.1 智能等时调度协议
本节已弃用。
图 8-66 和图 8-67 展示了具有服务间隔为 8 的端点使用智能等时调度的等时 IN 和 OUT 事务示例。在下方的等时 IN 示例中,主机仅在请求端点发送数据时发送一个带有 SSI 和 DBI 字段设置为非零值的 ACK TP。应注意,主机也可以在当前总线间隔中发送多个 ACK TP,仅最后一个 ACK TP 的 SSI 和 DBI 字段设置为非零值。
除了 lpf
字段外,还提供了 SSI、WPA、DBI 和 NBI 字段(详见表 8-13),用于为设备提供更多主机计划传输等时数据的信息,从而使设备能够更积极地管理其上行链路。
DBI
用于告知设备主机在当前总线间隔中不再有数据要传输。WPA
字段设置为 1 时,表示主机会在下一次启动数据传输之前向设备发送一个 PING TP。NBI
值在DBI
设置为 1 且WPA
设置为 0 时提供,设备可使用该值更积极地管理其上行端口。该值用于指示主机将在第几个总线间隔(参见表 8-13)重新对该端点启动数据传输。在这种情况下,主机在恢复传输前不需要发送 PING TP,设备需自行负责相应地管理其上行链路。
请注意,SSI 及其相关字段仅在服务间隔内有效,且仅可由主机用于告知设备其对特定等时端点的服务方式。主机在每个服务间隔开始前,仍然必须发送一个 PING 并等待 PING_RESPONSE 后才能服务等时端点。
图 8-66. 智能增强型 SuperSpeed 等时 IN 事务示例
图 8-67. 智能增强型 SuperSpeed 等时 OUT 事务示例
8.12.6.2 主机在执行 SuperSpeed 等时事务时的灵活性
主机针对 SuperSpeed 总线实例上的端点,可能以任意大小的突发方式传输所有的数据包,只要未完成的数据包数量不超过端点在其描述符中宣传的最大突发大小。
8.12.6.3 SuperSpeedPlus 等时事务
8.12.6.3.1 管道化等时 IN 事务
SuperSpeedPlus 主机可以按照第 8.12.6.1 节中概述的规则执行到增强型 SuperSpeed 等时端点的等时事务。然而,在执行到 SuperSpeedPlus 端点的 IN 事务时,SuperSpeedPlus 主机可以在端点未返回之前请求的所有数据之前,发送多个 IN ACK TP 请求更多的数据。主机不得请求超过端点描述符中报告的最大突发大小的未完成数据包数量。
如果一个 SuperSpeedPlus 端点在其描述符中报告最大突发大小为 'M',那么 SuperSpeedPlus 主机可以发送以下序列的 IN ACK TP 到设备,而无需等待设备返回初始 IN ACK TP 请求的所有数据包:
表 8-32. 管道化等时 IN 事务的 ACK TP 和数据包
主机到设备 | 设备到主机 |
---|---|
IN ACK TP (SeqN = 0, NumP = N) 其中 N <= M | DP (Seq0) |
DP (Seq1) | |
IN ACK TP (SeqN = N, NumP = X) 其中 X <= M - N + 已接收的数据包数 | DP (Seq2) |
DP (Seq3) | |
DP (Seq4) | |
IN ACK TP (SeqN = N + X, NumP = Y) 其中 Y <= M - X + 已接收的数据包数 | . . . |
DP (SeqM) | |
DP (SeqM+1) |
如表8-32所示,序列号字段的更新方式与SuperSpeedPlus Isochronous IN事务相同,然而它们是“流水线”式的。流水线式指的是SuperSpeedPlus主机在第一个IN ACK TP完成之前,能够发送下一个IN ACK TP。SuperSpeedPlus主机可以继续发送流水线式的IN ACK TP,但需要满足以下三点限制:
- 从端点请求的未完成数据包数不能大于端点的最大突发大小(Max Burst Size)。
- 从端点请求的未完成数据包数不能超过在该服务间隔内期望从端点接收的总数据量。
- 一旦接收到端点的数据结束指示,SuperSpeedPlus主机应停止在当前服务间隔内发送流水线式的IN ACK TP。
如果在任何时候,端点返回的DP设置了lpf位,SuperSpeedPlus主机将不再期望在该服务间隔内从端点接收更多的数据包。主机应将此条件视为该服务间隔内该端点的Isochronous事务结束。该端点应丢弃在该服务间隔内已接收或接收到的任何额外的IN ACK TP。
图 8-68. 示例流水线异步IN事务
8.12.6.4 主机在执行SuperSpeedPlus异步事务时的灵活性
主机在针对SuperSpeedPlus总线实例上的端点时,可以以任意大小的突发方式传输所有的DP,只要待处理的数据包数量不大于端点描述符中声明的最大突发大小。
设备应支持所有这些规则允许的管道化异步 IN 事务。
8.12.6.5 设备对异步 IN 事务的响应
表 8-33 列出了设备在响应 ACK TP 时可能做出的响应。如果 ACK TP 存在以下任何条件,则视为无效:
- 设备地址不正确
- 端点号和方向与当前配置中不属于该端点
- 没有预期的序列号
- 其中的延迟位被设置
- 其 TT 与端点类型不匹配(针对在 SuperSpeedPlus 模式下运行的设备)
收到 ACK TP | 设备能否发送数据 | 采取的动作 |
---|---|---|
是 | 不关心 | 不返回响应 |
否 | 否 | 返回序列号为 0 的零长度数据包 |
否 | 是 | 返回 N 个数据包,序列号从 0 到 N-1。除最后一个包外,每个包应为 MaxPacketSize 字节。最后一个包可小于或等于 MaxPacketSize 字节。最后一个包应设置 LPF 标志。 |
8.12.6.6 主机处理异步 IN 事务
表 8-34 列出了主机处理 IN 事务数据的过程。主机对于接收到的异步 IN 数据从不返回响应。在表 8-34 中,DP 错误可能由以下一个或多个原因导致:
- CRC-32 错误
- DPP 中止
- DPP 丢失
- DPH 的 TT 未设置为 Isochronous(来自 SuperSpeedPlus 模式的设备)
- DPH 中的数据长度与实际数据负载长度不匹配
如果主机接收到损坏的数据包,它会丢弃当前服务间隔中剩余的数据并通知主机软件错误。
表 8-34. 主机对 IN 事务的响应
数据包错误 | 主机能接受数据 | 主机数据处理 |
---|---|---|
是 | N/A | 丢弃数据 |
否 | 否(对于符合规范的主机实现,这种情况不应发生。) | 丢弃数据 |
否 – 数据包具有预期的序列号 | 是 | 接受数据 |
否 – 数据包没有预期的序列号 | 是 | 丢弃数据 |
8.12.6.7 设备对 Isochronous OUT 数据包的响应
表 8-35 列出了设备对 OUT 数据包的处理。设备从不对响应返回 TP。在表 8-35 中,DP 错误可能由于以下一种或多种原因:
- CRC-32 错误
- DPP 被中止
- DPP 缺失
- DPH TT 未设置为 Isochronous(对于在 SuperSpeed 模式下运行的设备)
- DPH 中的数据长度与实际数据负载长度不匹配
- DPH 中设置了 Deferred 位
Table 8-35. 设备对 OUT 数据包的响应
数据包错误 | 预期序列号 | 设备是否能接收数据 | 设备数据处理 |
---|---|---|---|
是 | 无所谓 | 无所谓 | 丢弃数据 |
否 | 是 | 是 | 接收数据 |
否 | 是 | 否 | 丢弃数据 |
否 | 否 | 否 | 丢弃数据,设备可能丢弃当前服务间隔中的任何额外数据 |
否 | 否 | 是 | 丢弃数据,设备可能丢弃当前服务间隔中的任何额外数据 |
8.13 时序参数
表 8-36 列出了设备在响应它接收到的各种类型的数据包时必须遵守的最小和/或最大时间。它还列出了设备在延迟容忍消息中可以设置的默认和最小时间,以及在接收到某些 TP 后设备可以启动 U1 或 U2 进入的最小时间。此外,它还列出了设备在进行突发传输时必须遵守的 DPs 之间的最大时间。所有 txxxResponse(例如 tNRDYResponse)、tMaxBurstInterval 和 tGen2MaxBurstInterval 时间都是当主机/设备没有其他数据发送到下游/上游链路时,主机/设备必须遵守的时序。
表 8-36. 时序参数
名称 | 描述 | 最小值 | 最大值 | 单位 |
---|---|---|---|---|
tPortConfiguration | 从端口进入 U0 到完成 LMP 交换的最大时长。在平局情况时(参见表 8-7),两端口将重置计时器并重新启动,直到平局解决。 | 20 | μs | 微秒 |
tPingTimeout | 设备接收到主机的 ping 后,直到设备可以发起或接受 U1 或 U2 请求的超时时间。该参数按设备内所有等时端点的最大服务间隔计算。 | 2 | 服务间隔 | 秒 |
tPingResponse | 设备接收到 ping 的最后一个帧符号到 PING_RESPONSE 的第一个帧符号之间的时间。 | 400 | ns | 纳秒 |
tBELTDefault | 最佳努力延迟容忍度的默认值。 | 1 | ms | 毫秒 |
tBELTmin | Latency Tolerance 消息中允许的最佳努力延迟容忍度的最小值。 | 1 | ms | 毫秒 |
tNRDYorSTALLResponse | 设备接收到 ACK TP、DPP 或 STATUS TP 的最后一个帧符号到 NRDY 或 STALL 响应的第一个帧符号之间的时间。 | 400 | ns | 纳秒 |
tDPResponse | 设备接收到 ACK TP 的最后一个帧符号到 DP 响应的第一个帧符号之间的时间。 | 400 | ns | 纳秒 |
tACKResponse | 设备接收到 DPP 或 STATUS TP 的最后一个帧符号到 ACK 响应的第一个帧符号之间的时间。 | 400 | ns | 纳秒 |
tHostACKResponse | 主机接收到 DPP 的最后一个帧符号到 ACK 响应的第一个帧符号之间的时间。 | 3 | μs | 微秒 |
tERDYTimeout | 设备发送 ERDY 给主机后,直到它可以发起或接受 U1 或 U2 请求的超时时间(如果未服务)。 | 500 | ms | 毫秒 |
tNotification | 如果设备自上次发送功能唤醒通知以来未被访问,则设备应发送功能唤醒通知的周期。 | 2500 | ms | 毫秒 |
tMaxBurstInterval | 设备在 Gen 1 速度下运行时,设备端点与主机之间的 DPs 时间间隔,或主机与设备端点之间的 DPs 时间间隔。 | 100 | ns | 纳秒 |
tTimestampWindow | 如果根端口的链路在 U0 中,主机应从总线间隔边界传输等时时间戳,直到 tTimestampWindow 后。 | 0 | 8 | μs |
tIsochTimestampGranularity | 等时时间戳的粒度。 | 8 | 8 | USB 2.0 高速位 |
BusIntervalAdjustmentGranularity (已废弃) | 设备请求更改总线间隔的调整单位。 | 4.06901041 | ps | 皮秒 |
tIsochronousTimestampStart | 根端口链路从轮询进入 U0 或从 U3 进入 U0 后,主机开始传输等时时间戳的时间。 | 250 | μs | 微秒 |
tBeltRepeat | 设备限制发送多个 LTM TPs 的时间段。 | 1 | ms | 毫秒 |
tMinLTMStateChange | 外设必须在完成启用或禁用 LTM_Enable 功能选择器请求后发送 LTM 通知的时间。 | 10 | ms | 毫秒 |
tHostTransactionTimeout | 对于控制、批量和中断事务,这是在主机发送最后一个 DP 或 ACK TP 后未接收到响应时的超时时间,主机应假设事务已失败并停止端点。对于等时 IN 事务,这是在主机发送 ACK TP 后未接收到响应时的超时时间。计时器在主机接收到每个由 ACK TP 请求的 DP 时初始化并重新计时。如果发生超时,主机将在当前服务间隔内不再对端点进行任何事务,并将在下一个服务间隔重新开始对端点的事务。不会进行重试。 | 7.62 | 25 | ms |
tGen2MaxBurstInterval | 设备在 Gen 2 速度下运行时,设备端点与主机之间的 DPs 时间间隔。主机在 Gen 2 速度下运行时,主机与设备端点之间的 DPs 时间间隔。 | 50 | ns | |
tGen2MaxDeviceMultiPacketInterval | 设备链路在 Gen 2 速度下运行时,来自不同设备端点的 DPs 同时传输到主机的时间间隔。 | 50 | ns | |
tSSPMaxHubMultiPacketInterval | 当集线器链路在 SuperSpeedPlus 模式下运行时,集线器缓存 DPs 并将其传输到该链路时的时间间隔。 | 50 | ns | 纳秒 |
tHostTPFTimeout | 当主机在接收到设置了 TPF 的 TP 后等待设备通知包超时时的时间。 | 7.6 | 25 | ms |
tDeviceTPFNotification | 从发送带有 TPF 的 TP 的最后一个符号到发送相应设备通知包的第一个符号的时间。 | 400 | ns | 纳秒 |
tITPRegenerationLimit | 集线器在传输 ITP 时引入的 Delta 子字段的抖动。 | -0 | -33 | μs |
tLDMRequestTimeout | 上游端口超时等待先前发送的 LDM 请求的时间。 | 125 | μs | |
tLDMResponseDelay | 响应端超时生成 LDM 响应 LMP 的时间。 | 125 | μs | |
tLDMResponseTime | 接收到 LDM TS 请求 LMP 的最后一个帧符号到传输 LDM TS 响应 LMP 的第一个帧符号之间的时间。 | 3 | μs | |
tLMPTransmissionDelay | 软件用于传输 LMP 的默认传输延迟时间。 | 40 | 40 | ns |
- (tIsochTimestampGranularity/4096)
- 这个值被选择为大于链路挂起高优先级信用超时(参见第7章)。