系列文章目录
USB3.2 摘录(一)
USB3.2 摘录(二)
USB3.2 摘录(三)
USB3.2 摘录(四)
USB3.2 摘录(五)
USB3.2 摘录(六)
USB3.2 摘录(七)
USB3.2 摘录(八)
USB3.2 摘录(九)
USB3.2 摘录(10)
USB3.2 摘录(11)
USB3.2 摘录(12)
文章目录
- 系列文章目录
- 10 集线器、主机下游端口和设备上游端口规范
- 10.16 请求(Requests)
- 10.16.1 标准请求(Standard Requests)
- 10.16.2 特定于类的请求(Class-specific Requests)
- 10.16.2.1 清除 Hub 功能(Clear Hub Feature)
- 10.16.2.2 清除端口功能(Clear Port Feature)
- 10.16.2.3 获取 Hub 描述符(Get Hub Descriptor)
- 10.16.2.4 获取 Hub 状态(Get Hub Status)
- 10.16.2.5 获取端口错误计数(Get Port Error Count)
- 10.16.2.6 获取端口状态(Get Port Status)
- 10.16.2.6.1 端口状态位(Port Status Bits)
- 10.16.2.6.2 端口状态更改位(Port Status Change Bits)
- 10.16.2.6.3 扩展端口状态位(Extended Port Status Bits)
- 10.16.2.7 设置集线器描述符(Set Hub Descriptor)
- 10.16.2.8 设置 Hub 功能(Set Hub Feature)
- 10.16.2.9 设置集线器深度(Set Hub Depth)
- 10.16.2.10 设置端口功能(Set Port Feature)
- 10.17 主机根(下行)端口
10 集线器、主机下游端口和设备上游端口规范
10.16 请求(Requests)
10.16.1 标准请求(Standard Requests)
集线器对请求处理时间的限制比 Section 9.2.6 中规定的标准设备更严格,因为它们对于连接到 USB 的所有设备的 “可用时间” 至关重要。下面列出了最坏情况的请求计时要求(它们适用于标准请求和 Hub 类请求):
- 无数据阶段的请求的完成时间: 50 ms
- 有数据阶段的标准请求的完成时间:
- 从设置数据包到第一个数据阶段的时间: 50 ms
- 每个后续数据阶段之间的时间: 50 ms
- 最后一个数据阶段和状态阶段之间的时间: 50 ms
由于集线器在总线计数中起着如此关键的作用,因此建议所有请求的集线器平均响应时间小于 5 毫秒。
表 10-6 概述了各种标准设备请求。
集线器需要接受所有 “标准” 请求,而不会出错。集线器不应对格式良好的 SET_ISOC_DELAY 请求响应请求错误。集线器不需要保留或处理延迟值。未实现的可选请求应在请求的 Data stage 或 Status 阶段返回 STALL。
10.16.2 特定于类的请求(Class-specific Requests)
hub 类定义 hub 响应的请求,如表 10-7 中所述。表 10-8 定义了 Hub 类请求代码。下表中除 SetHubDescriptor() 之外的所有请求都是必需的。
表 10-9 给出了 hub 类的有效功能选择器。有关功能的说明,请参阅 Section 10.16.2.1 和 Section 10.16.2.8 。
10.16.2.1 清除 Hub 功能(Clear Hub Feature)
此请求将重置 hub status 中报告的值。
发送清除请求将禁用该功能;请参阅表 10-9 了解作为接收者应用于 Hub 的功能选择器定义。如果功能选择器与状态更改相关联,则清除该状态更改将确认该更改。此请求格式用于清除 C_HUB_LOCAL_POWER 或 C_HUB_OVER_CURRENT 功能。
如果 wValue 不是表 10-9 中列出的功能选择器,或者 wIndex 或 wLength 不是上面指定的,则为请求错误。
如果未配置 Hub ,则 Hub 对此请求的响应是 undefined。
10.16.2.2 清除端口功能(Clear Port Feature)
此请求将重置端口状态中报告的值。
端口号应为该集线器的有效端口号,大于零。port 字段位于 wIndex 字段的位 7…0 中。
发送清除请求将禁用该功能或启动与该功能关联的进程;有关功能选择器定义,请参阅表 10-9。如果功能选择器与状态更改相关联,则清除该状态更改将确认该更改。此请求格式用于清除以下功能:
- PORT_POWER
- C_PORT_CONNECTION
- C_PORT_RESET
- C_PORT_OVER_CURRENT
- C_PORT_LINK_STATE
- C_PORT_CONFIG_ERROR
- C_BH_PORT_RESET
- FORCE_LINKPM_ACCEPT
清除 PORT_POWER 功能会导致端口处于 DSPORT.Powered-off-reset 状态,并且可能会根据集线器的电源切换方法的限制,导致端口的电源断开。当处于 DSPORT.Powered-off 或 DSPORT.Powered-off-detect 或 DSPORT.Powered-off-reset 状态时,当此端口为接收方时,唯一有效的请求是获取端口状态 (请参阅 第 10.16.2.6 节) 和设置端口功能 (PORT_POWER) (请参阅 第 10.16.2.10 节)。
清除 FORCE_LINKPM_ACCEPT 功能会导致端口置低 Set Link Function LMPs 中的 Force_LinkPM_Accept 位。如果端口上未断言 Force_LinkPM_Accept 位,则集线器应将此请求视为功能性无操作。
如果 wValue 不是表 10-9 中列出的功能选择器,如果 wIndex 指定的端口不存在,或者 wLength 不是上面指定的,则为一个错误请求。请求尝试清除已清除的特性(feature)不是一个错误(集线器应将其视为功能性无操作)。
如果未配置 Hub ,则 Hub 对此请求的响应是 undefined。
10.16.2.3 获取 Hub 描述符(Get Hub Descriptor)
此请求返回 Hub 描述符。
Hub 类描述符的 GetDescriptor() 请求遵循与标准 GetDescriptor() 请求相同的使用模型(请参阅第 9 章)。标准 Hub 描述符使用第 10.15.2.1 节中定义的值 bDescriptorType 表示。所有 Hub 都需要实现一个 Hub 描述符,描述符索引为零。
如果 wLength 大于描述符的实际长度,则仅返回实际长度。如果 wLength 小于描述符的实际长度,则仅返回描述符的第一个 wLength 字节;即使 wLength 为零,也不会将其视为错误。
如果 wValue 或 wIndex 与上面指定的不同,则为请求错误。
10.16.2.4 获取 Hub 状态(Get Hub Status)
此请求返回当前 Hub 状态以及自上次确认以来已更改的状态。
Data 的第一个字(2 字节)包含 wHubStatus 字段(参见表 10-10)。Data 的第二个字包含 wHubChange 字段(参见表 10-11)。
如果 wValue、wIndex 或 wLength 与上面指定的值不同,则为错误请求。
这些状态位没有定义的功能选择器值,它们既不能被 USB 系统软件设置也不能清除。
集线器可能允许使用 SetHubFeature() 请求设置这些更改位,以便支持诊断。如果集线器不支持设置这些位,则应将 SetHubFeature() 请求视为请求错误或功能性无操作。设置后,这些位可以由 ClearHubFeature() 请求清除。设置已设置的功能或清除已清除的功能的请求无效,Hub 应将其视为功能无操作。
10.16.2.5 获取端口错误计数(Get Port Error Count)
此请求返回集线器在 wIndex 指示的端口上检测到的链接错误数。每当设备经历 Reset (请参阅 Section 7.3) 或在上电时,此值将重置为零。
端口号应为该集线器的有效端口号,大于零。
如果 wValue 或 wLength 不是上面指定的,或者 wIndex 指定的端口不存在,则会出现请求错误。
10.16.2.6 获取端口状态(Get Port Status)
此请求返回当前端口状态和端口状态更改位的当前值。
PORT_STATUS 或 EXT_PORT_STATUS 数据的第一个字包含 wPortStatus 字段(参见表 10-13)。PORT_STATUS 或 EXT_PORT_STATUS 数据的第二个字包含 wPortChange 字段(参见表 10-14)。EXT_PORT_STATUS 请求应返回包含 dwExtPortStatus 字段的附加数据 dword(请参阅表 10-15)。
wPortStatus 和 wPortChange 字段中的位位置在适用时以一对一的方式对应。
wValue 字段以低序字节指定 Port Status Type(请参阅表 10-12),高序字节被保留。
如果端口状态类型等于 EXT_PORT_STATUS 且集线器未定义 SuperSpeedPlus USB 功能描述符,或者端口状态类型等于保留值,或者 wValue 或 wLength 不是表 10-7 中指定的值,或者 wIndex 指定的端口不存在,则为请求错误。
10.16.2.6.1 端口状态位(Port Status Bits)
PORT_CONNECTION
当端口处于 DSPORT.Enabled 状态时,此位设置为 1。在 DSPORT.Resetting 或 DSPORT.Error 状态中,它保持先前状态的值。
SetPortFeature(PORT_CONNECTION) 和 ClearPortFeature(PORT_CONNECTION) 请求不得被 USB 系统软件使用,并且应被集线器标记为无操作请求。
PORT_ENABLE
当下游端口处于 DSPORT.Enabled 状态时,此位设置为 1,否则设置为 0。
请注意,增强型 SuperSpeed 集线器不支持 USB 2.0 ClearPortFeature (PORT_ENABLE) 请求,USB 系统软件也不能使用它来禁用端口。
PORT_OVER_CURRENT
当端口上存在过流情况时,此位设置为 1,否则设置为 0。
如果此端口上的电压受另一个端口上的过流条件影响,则此位设置为 1 并保持设置为 1,直到影响端口上的过流条件被消除。当影响端口上的过流条件被移除时,该位设置为零。
如第 10.12 节所述,自供电集线器需要过流保护(在总线供电集线器上是可选的)。
SetPortFeature (PORT_OVER_CURRENT) 和 ClearPortFeature (PORT_OVER_CURRENT) 请求不应由 USB 系统软件使用,并且可能被集线器视为无操作请求。
PORT_RESET
当端口处于 DSPORT.Resetting 状态时,此位设置为 1。此位在所有其他下游端口状态中都设置为零。
如果满足第 10.3.1.6 节中的条件,则 SetPortFeature(PORT_RESET 或 BH_PORT_RESET) 请求将启动 DSPORT.Resetting 状态。
ClearPortFeature (PORT_RESET) 请求不应由 USB 系统软件使用,并且可能被集线器视为无操作请求。
PORT_LINK_STATE
此字段反映链接的当前状态。
SetPortFeature (PORT_LINK_STATE) 请求可随时由 USB 系统软件发出,但仅具有第 10.16.2.10 节中指定的效果。
ClearPortFeature(PORT_LINK_STATE) 请求不应由 USB 系统软件使用,并且可能被集线器视为无操作请求。
PORT_POWER
此位反映端口的当前逻辑电源状态。无论是否存在实际的端口电源交换设备,此位在所有端口上实现。
当此位为零时,端口处于 DSPORT.Powered-off 状态、DSPORT.Powered-off-detect 状态或 DSPORT.Powered-off-reset 状态。同样,任何导致此端口进入这三种状态中的任何一种的因素都将导致此位设置为零。
SetPortFeature(PORT_POWER) 会将此位设置为 1,除非 C_HUB_LOCAL_POWER 和 Local Power Source(在 wHubStatus 中)都设置为 1,在这种情况下,请求被视为功能性无操作。
PORT_SPEED
仅当 PORT_ENABLE 位设置为 1 且 Port Status Type 设置为 PORT_STATUS 时,此字段中的此值才有效。此字段中的值为零表示已附加增强型 SuperSpeed 设备。此字段中的所有其他值都是保留的。
系统软件可以通过使用 Get Port Status 请求来确定设备运行的实际速度,请求时将其 Port Status Type 设置为 EXT_PORT_STATUS(请参阅 Section 10.16.2.6.3)。
此字段只能由 USB 系统软件读取。
10.16.2.6.2 端口状态更改位(Port Status Change Bits)
端口状态更改位用于指示端口状态位的更改,这些更改不是请求的直接结果。可以通过 ClearPortFeature() 请求或集线器重置来清除端口状态更改位。集线器可能允许使用 SetPortFeature() 请求设置状态更改位以进行诊断。如果集线器不支持设置状态更改位,则它可能会将请求视为请求错误或功能性无操作。表 10-14 介绍了 wPortChange 字段中的各个位。
C_PORT_CONNECTION
当 PORT_CONNECTION 位更改时,此位设置为 1。
此位应通过 ClearPortFeature(C_PORT_CONNECTION) 请求或在逻辑端口电源关闭时设置为零。
C_PORT_OVER_CURRENT
当 PORT_OVER_CURRENT 位从 0 变为 1 或从 1 变为 0 时,此位设置为 1。如果由于另一个端口上的过流情况而将端口置于 DSPORT.Powered-off-reset 状态,则也会设置此位。
此位应由 ClearPortFeature (C_PORT_OVER_CURRENT) 请求设置为零。
C_PORT_RESET
当端口从 DSPORT.Resetting 状态转换为 DSPORT.Enabled 状态以进行任何类型的重置时,此位设置为 1。
此位应通过 ClearPortFeature (C_PORT_RESET) 请求设置为零,或者在逻辑端口电源关闭时设置。
C_PORT_BH_RESET
当端口从 DSPORT.Resetting 状态转换为 DSPORT.Enabled 状态时,此位设置为 1,仅用于热重置。
该位应由 ClearPortFeature(C_PORT_BH_RESET) 请求清除,或者在逻辑端口电源关闭时清除。
C_PORT_LINK_STATE
当端口的链路由于 SetPortFeature(Port_Link_State) 请求而完成从 U3 状态到 U0 状态的转换时,或者完成到 Loopback 状态或 Compliance 或 eSS.Inactive 的转换(如果存在 Rx 终止)时,此位设置为 1。由于在面向下游的端口上接收到远程唤醒信号,因此从 U3 到 U0 的转换,因此此位未设置为 1。
该位将通过 ClearPortFeature(C_PORT_LINK_STATE) 请求或在逻辑端口电源关闭时清除。
C_PORT_CONFIG_ERROR
如果无法成功配置连接到端口的链路,例如,如果两个仅支持下行的端口相互连接,或者无法完成链路配置,则此位设置为 1。此外,发生这种情况时,端口应转换为 DSPORT.Error 状态。
此位将通过 ClearPortFeature(C_PORT_CONFIG_ERROR) 请求或在逻辑端口电源关闭时清除。
10.16.2.6.3 扩展端口状态位(Extended Port Status Bits)
仅当 Get Port Status 请求的 Port Status Type (端口状态类型) 设置为 EXT_PORT_STATUS 时,才会返回扩展端口状态位。
请注意,对于增强型 SuperSpeed 设备,“端口速度” 是链路速度乘以通道数。
TX_SUBLINK_SPEED_ID and RX_SUBLINK_SPEED_ID
仅当 PORT_ENABLE 位设置为 1 时,此字段中的值才有效。通道速度(即单个通道的比特率)是通过评估 SuperSpeedPlus USB 功能描述符中子链路速度属性的参数来确定的,其子链路速度属性 ID 值与子链路速度 ID 值匹配,例如,如果子链路速度属性 LSE 和 LSM 字段分别等于 3 和 10,则链路以 10 Gb/s 的速度运行。Sublink Speed Attribute 未引用的所有值都将被保留。
此字段只能由 USB 系统软件读取。
TX_LANE_COUNT and RX_LANE_COUNT
此字段中的此值仅在 PORT_ENABLE 位设置为 1 时有效。端口的速度是通过将 Sublink Speed(由 SUBLINK_SPEED_ID 定义)乘以 Lane Count 来确定的。
此字段只能由 USB 系统软件读取。
10.16.2.7 设置集线器描述符(Set Hub Descriptor)
此请求将覆盖 Hub 描述符。
Hub 类描述符的 SetDescriptor 请求遵循与标准 SetDescriptor 请求相同的使用模型(请参阅第 9 章)。标准 Hub 描述符使用第 10.15.2.1 节中定义的值 bDescriptorType 表示。所有 Hub 都需要实现一个描述符索引为零的 Hub 描述符。
此请求是可选的。此请求将数据写入特定于类的描述符。主机提供在控制事务的数据传输阶段要传输到集线器的数据。此请求一次写入整个 Hub 描述符。
Hubs 应缓冲从此请求接收的所有字节,以确保已从主机成功传输整个描述符。成功完成总线传输后,集线器将更新指定描述符的内容。
如果 wIndex 不为零或 wLength 与主机发送的数据量不匹配,则为请求错误。不支持此请求的 Hub 在请求的 Data 阶段使用 STALL 进行响应。
如果未配置 Hub ,则 Hub 对此请求的响应是 undefined。
10.16.2.8 设置 Hub 功能(Set Hub Feature)
此请求设置 Hub 状态中报告的值。
设置定义的特征将启用该功能。使用此请求可能无法确认状态更改。
如果 wValue 不是定义的功能选择器,或者 wIndex 或 wLength 未按上面指定,则为请求错误。
10.16.2.9 设置集线器深度(Set Hub Depth)
此请求设置 Hub 用于确定 Hub 的路由字符串索引的索引的值。
wValue 包含 Hub Depth 的值。左移 2 的 Hub Depth 是 Route String 的偏移量,用于标识集线器的 Route String Port Field 的 lsb。
如果 wValue 大于 4,或者 wIndex 或 wLength 未按上面指定,则为请求错误。
10.16.2.10 设置端口功能(Set Port Feature)
此请求设置端口状态中报告的值。
端口号应为该集线器的有效端口号,大于零。端口号位于 wIndex 字段的最低有效字节 (位 7…0) 中。wIndex 的最高有效字节为零,除非功能选择器为 PORT_U1_TIMEOUT 或 PORT_U2_TIMEOUT 或 PORT_LINK_STATE 或 PORT_REMOTE_WAKE_MASK 。
设置功能会启用该功能或启动与该功能关联的进程;请参阅表 10-9,了解作为接收方应用于端口的功能选择器定义。使用此请求可能无法确认状态更改。可通过此请求设置的功能包括:
- PORT_RESET
- BH_PORT_RESET
- PORT_POWER
- PORT_U1_TIMEOUT
- PORT_U2_TIMEOUT
- PORT_LINK_STATE
- PORT_REMOTE_WAKE_MASK
- FORCE_LINKPM_ACCEPT
PORT_U1_TIMEOUT
功能选择器是 PORT_U1_TIMEOUT 时,wIndex 字段的最高有效字节 (位 15…8) 指定 U1 非活动计时器的超时值。有关如何使用 U1 非活动计时器值的详细说明,请参阅 Section 10.4.2.1 。
以下是允许的值:
PORT_U2_TIMEOUT
功能选择器是 PORT_U2_TIMEOUT 时,wIndex 字段的最高有效字节 (位 15…8) 指定 U2 非活动计时器的超时值。在收到带有 PORT_U2_TIMEOUT 功能选择器的 Set Port Feature 请求后,端口的链路应向其具有指定超时值的 LMP 发送 LMP。有关如何使用 U2 非活动计时器值的详细说明,请参阅 Section 10.4.2.1 。
以下是允许的值:
注意:软件有责任为连接到集线器的下游端口正确设置 U2 超时。如果超时设置不正确,可能会导致链路状态不一致。建议软件将上游 U2 超时设置为至少是集线器上下游端口的 U2 超时值的两倍。
PORT_LINK_STATE
当功能选择器是 PORT_LINK_STATE 时,wIndex 字段的最高有效字节(位 15…8)指定主机软件要将连接到端口的链路置于的 U 状态。仅当设置了 PORT_ENABLE 位且 PORT_LINK_STATE 未设置为 eSS.Disabled、Rx.Detect 或 eSS.Inactive 时,此请求才有效,除非另有说明:
- 如果值为 0,则 Hub 应将链接从任何 U 状态转换为 U0。
- 如果值为 1,则主机软件希望将链接转换为 U1 状态。 Hub 应尝试将链接从 U0 转换为 U1。如果在收到值为 1 的请求时,链接处于 U0 以外的任何状态,则行为未定义。
- 如果值为 2,则主机软件希望将链接转换为 U2 状态。 Hub 应尝试将链接从 U0 转换为 U2。如果在收到值为 2 的请求时,链接处于 U0 以外的任何状态,则行为未定义。
- 如果值为 3,则主机软件希望选择性地挂起连接到此端口的设备。 Hub 应使用允许的链接状态转换将链接从任何其他 U 状态转换为 U3。如果端口尚未处于 U0 状态,则它应将端口转换为 U0 状态,然后启动到 U3 的转换。当此状态处于活动状态时,集线器不会将下游定向流量传播到此端口,但集线器将响应来自端口的恢复信令。
- 如果值为 4 (eSS.Disabled),则 Hub 应将链接转换为 eSS.Disabled。当值为 4 时,该请求始终有效。收到此请求后,下游端口应转换为 DSPORT.Disabled 状态。
- 如果值为 5 (Rx.Detect),则 Hub 应将链接转换为 Rx.Detect。仅当下游端口处于 DSPORT.Disabled 状态时,此请求才有效。如果在收到具有此值的请求时链接处于任何其他状态,则行为未定义。收到此请求后,下游端口应转换为 DSPORT.Disconnected 状态。
- 如果值为 10 (启用合规模式),则 Hub 应为下一个连接启用进入合规模式。仅当下游端口处于 DSPORT.Disconnected 状态时,此请求才有效。如果在收到具有此值的请求时链接处于任何其他状态,则行为未定义。一旦链路进入合规模式或 Polling.LFPS 成功,将禁用进入合规模式。
- 如果集线器在 wIndex 字段的上字节中看到任何其他值,则应以请求错误进行响应。
PORT_REMOTE_WAKE_MASK
当功能选择器是 PORT_REMOTE_WAKE_MASK 时,wIndex 字段的最高有效字节 (位 15…8) 指定导致集线器在其上游端口上发出远程唤醒事件信号的条件。端口远程唤醒掩码的编码如下:
注意,上电后或 hub 复位后,远程唤醒掩码设置为零(即启用掩码)。
集线器应满足以下要求:
- 如果端口处于 Powered-off 状态,集线器应将 SetPortFeature (PORT_RESET) 请求视为功能性无操作。
- 如果端口未处于 Enabled 状态,则 Hub 应将 SetPortFeature (PORT_LINK_STATE) U3 请求视为功能性无操作。
- 如果端口未处于 Powered-off 状态,集线器应将 SetPortFeature (PORT_POWER) 请求视为功能性无操作。
- 如果端口未处于 Enabled 状态,则集线器应将 SetPortFeature (FORCE_LINKPM_ACCEPT) 请求视为功能性无操作。
BH_PORT_RESET
当功能选择器是 BH_PORT_RESET 时,集线器应在此命令标识的端口上启动热重置(请参阅第 7.4.2 节)。此重置后的端口状态应与 SetPortFeature (PORT_RESET) 后的状态相同。完成 BH_PORT_RESET 后,集线器应将此端口的 PortStatus 中的 C_BH_PORT_RESET 字段设置为 1 。
如果 wValue 不是表 10-9 中列出的功能选择器,如果 wIndex 指定的端口不存在,或者 wLength 不是上面指定的,则为请求错误。
如果未配置 Hub ,则 Hub 对此请求的响应是 undefined。
10.17 主机根(下行)端口
Host Root (Downstream) Ports 。
USB 主机的根端口与 USB 集线器的下游端口具有类似的功能要求。本节总结了哪些要求也适用于主机的根端口,并确定了任何其他或不同的要求。
主机根端口应遵循第 10.2 节中面向下游的 Hub 端口的要求,但第 10.2.3 节除外。
主机根端口应遵循第 10.3 节中面向下游的 Hub 端口的要求,但有以下例外情况和补充内容:
- 基于 Hub 上游端口状态的转换和/或转换条件均不适用于根端口。
- 主机应在主机接口中具有控制机制,允许软件实现与 Hub 下游端口行为等效的行为,以响应第 10.3 节中记录的 SetPortFeature 或 ClearPortFeature 请求。
- 主机应实现与第 10.3 节中的下游端口状态描述一致的端口状态位。
- 主机需要提供一种机制,将每个 USB 2.0 端口与共享同一物理连接器的任何增强型 SuperSpeed 端口相关联。请注意,这类似于 Section 10.3.3 中对 USB Hub 的要求。
主机根端口应遵循第 10.4 节中面向下游的中心端口的要求,但与本节中已说明的一般例外情况相同。
主机应通过主机接口实现等效于本章中所有端口状态位定义的端口状态位。
主机应具有实现对其根端口的等效控制的机制,如本章中记录的 SetPortFeature、ClearPortFeature 和 GetPortStatus 请求所提供。
☆