10 集线器、主机下游端口和设备上游端口规范
10.3 面向 Hub 下游的端口(Hub Downstream Facing Ports)
注意,对于根 Hub,来自面向上游的端口状态机的信号依赖于实现。
10.3.1 面向 Hub 下游的端口状态描述
Hub Downstream Facing Port State Descriptions 。
10.3.1.1 DSPORT.Powered-off
DSPORT.Powered-off 状态是逻辑 power-off 状态。这是默认状态,如果集线器支持电源切换,则 DSPORT 端口将在通电后处于该状态。可能仍需要集线器,或者选择为处在 DSPORT.Powered-off 的下游端口提供 VBUS 。
如果发生以下任何情况,端口应转换为 DSPORT.Powered-off 状态:
- 任何状态下,当从集线器上游端口移除 VBUS 并且集线器支持 DS 端口上的电源切换。
- 满足任何 “断电” 条件:
- 任何状态下,当端口失去本地电源。
- 任何状态下,如果集线器的上游端口链路转换为 eSS.Disabled 状态并且上游端口 VBUS 处于打开状态。
- 任何状态下,如果集线器的上行端口链路已尝试连续 8 个 Rx.Detect 事件,但未检测到远端接收器终端,并且集线器下行端口的接收器终端(近端)已准备好关闭。
当满足以下任一条件时,下游端口的终端被视为已准备好关闭。
- 热复位信令已完成。
- 可选地,当端口进行电源切换并且 USB 2.0 集线器也关闭了端口的电源时。
- 端口处于开机状态,未执行热复位
- 未连接任何设备。
端口应保留在 DSPORT.Powered-off 状态,直到满足以下条件。
- 集线器的 Upstream Port 链路检测到远端接收器终端。请注意,这需要上游端口 VBUS 处于打开状态。
- 没有 “power-off” 条件是真的。
- 无过流条件处于活动状态。
如果在本地电源存在的情况下配置了集线器,然后如果本地电源丢失,则集线器应将所有端口置于 Powered-off 状态(如果仍供电以运行集线器控制器)。
在 DSPORT.Powered-off 状态时,端口的链路处于 eSS.Disabled 状态。
表 10-2 显示了集线器下游 USB 标准 A 端口的 VBUS 允许状态,以及集线器上游端口的可能状态以及下游 USB 标准 A 端口的逻辑端口电源。下表介绍了集线器具有足够功率为下游端口供电(存在本地电源)的情况。对于未实现每端口功率控制的 Hub,在 Hub 移除 VBUS 之前,所有受移除 VBUS 影响的下行端口都应处于可能关闭电源的状态(参见表 10-2)。
10.3.1.2 DSPORT.Disconnected(正在等待 eSS Connect)
DSPORT.Disconnected (Waiting for eSS Connect) 。
在以下任何情况下,端口都会转换为此状态:
在 DSPORT.Powered-off 状态下,当集线器的上行端口链路检测到远端接收器终端时,上行端口 VBUS 处于打开状态(由接收器检测暗示),
- 不满足关机条件,不存在过流情况。
- 除了 DSPORT.Powered-off-detect 情况下,能够并且确实检测到断开连接时。
- 在 DSPORT.Powered-off-reset 下,当满足第 10.3.1.10 节中定义的重新供电条件,并且 DSPORT.Powered-off-reset 状态被 tReset 维护时。
- 在 DSPORT.Powered-off-detect 下,当满足第 10.3.1.10 节中定义的重新供电条件时。
- 在 DSPORT.Resetting 下,在重置期间,当端口的链接从 Rx.Detect.Active 超时时。也就是说,它会检测到断开连接。
- 在 DSPORT.Disabled 下,当从端口收到 SetPortFeature(PORT_LINK_STATE) Rx.Detect 请求时。
- 在 DSPORT.Disabled 下,当集线器的上行端口重置时。注意:如果在进入此状态后在第一个 Rx.Detect 中检测到设备,则集线器应在下游端口上发出热重置,即使上游端口重置是热重置。
- 在 DSPORT.Powered-off 或者 DSPORT.Disabled 下,当集线器的上行端口重置时。注意:集线器在将端口转换为 DSPORT.RxDetect 后检测到远端接收器,集线器应在下游端口上发出热重置,即使上游端口重置是热重置。
- 在 DSPORT.Resetting 下,当端口的链路在重置期间从任何 Polling 子状态超时。
- 在 DSPORT.Training 下,当如果端口的链路从任何 Polling 子状态超时,并且
cPollingTimeout 小于 2,并且未启用该端口进入合规性或 Polling 子状态超时时不是 Polling.LFPS 时。 请参阅第 7.5.4.2 节和第 10.16.2.10 节中 PollingTimeout 的定义,定义设置端口功能以启用合规性条目。
- 在 DSPORT.Loopback 下,当端口的链路在 Loopback.Exit 中成功执行 LFPS 握手时。
在此状态下,端口的链接应处于 Rx.Detect 状态。
注意:如果集线器上行端口的链路在 U3 中,则端口的链路仍应从 Rx.Detect 正常执行连接检测。
10.3.1.3 DSPORT.Training
当检测到远端接收器终端时,端口从 DSPORT.Disconnected 转换为此状态。
在此状态下,端口的链接应处于 Polling(轮询) 状态。
10.3.1.4 DSPORT.ERROR
仅当连接了增强型 SuperSpeed 设备,并且在尝试操作链路时发生严重错误情况时,端口才会转换到此状态。
在以下任何情况下,端口都会转换为此状态:
- 在 DSPORT.Enabled 下,当链路进入 recovery 并超时而不恢复时。
- 在 DSPORT.Enabled 下,当U1 或 U2 退出失败时。
- 在 DSPORT.Loopback 下,当端口是 loopback master,并且 Loopback.Exit 中的 LFPS 握手失败时。
- 在 DSPORT.Enabled 下,当端口配置失败,如第 8.4.6 节中所述时。
- 在 DSPORT.Training 下,当如果端口的链接从任何 Polling 子状态超时,并且 cPollingTimeout 为 2。有关 cPollingTimeout 的详细信息,请参见 7.5.4.2 时。
10.3.1.5 DSPORT.Enabled
在以下任何情况下,端口都会转换为此状态:
- 在 Training 状态下,当端口的链路成功进入 U0 时。
- 在 DSPORT.Resetting 状态下,当重置成功完成时。
在设置其当前连接状态 (CCS,Current Connect Status) 后,处在 DSPORT.Enabled 状态下的端口将在上游和下游方向传播数据包。当集线器下行端口在开机或热复位后首次转换为 DSPORT.Enabled 状态时,它应传输第 8.4.6 节中定义的端口配置 LMP。如果在进入 DSPORT.Enabled 状态之前设置了 CCS,则它将保持设置状态。如果未设置 CCS,则只有在端口配置 LMP 交换成功后才能设置 CCS。
当集线器下游端口在开机重置后首次转换为 DSPORT.Enabled 状态时,U1 和 U2 非活动计时器的值应重置为零。
进入启用状态时,链接应为 U0。
如果下行端口进入 DSPORT.Enabled 时,集线器上行端口的链路在 U3 中,并且集线器未启用远程唤醒,则下行端口应在 tDSPortEnabledToU3 内的链路上启动到 U3 的转换。
10.3.1.6 DSPORT.Resetting
在以下任一情况下,下游端口将转换为 DSPORT.Resetting 状态:
在 DSPORT.Error 状态下,当收到 SetPortFeature(PORT_RESET) 请求或 SetPortFeature(BH_PORT_RESET) 时,端口应在下游端口链接上发送热复位时。
在 DSPORT.Enabled 状态下,并且在收到 SetPortFeature (BH_PORT_RESET) 时,端口的链接处于任何状态。在这种情况下,端口应在下游端口链路上启动热重置。
在除了 DSPORT.Powered-off-reset 或 DSPORT.Powered-off-detect 或 DSPORT.Powered-off 或 DSPORT.Disabled 或 DSPORT.Disconnected 的任何状态下,当集线器在其上游端口上检测到 Reset 时。在这种情况下,端口应根据在集线器的上游端口上检测到的 Reset 类型以及下游端口的当前状态,在下游端口链路上启动热/热重置。此转换应在上游端口链接转换为 U0 之前发生。
在除了 DSPORT.Powered-off 或 DSPORT.Powered-off-reset 或DSPORT.Powered-off-detect 或 DSPORT.Disabled 或 DSPORT.Disconnected 的任何状态下下,当它收到 SetPortFeature(PORT_RESET) 或 SetPortFeature(BH_PORT_RESET) 时。如果下游端口在 DSPORT.Powered-off , DSPORT.Powered-off-reset ,DSPORT.Powered-off-detect , DSPORT.Disabled , DSPORT.Disconnected 状态中,并且它收到上述请求之一,则该请求将被忽略。
在 DSPORT.Enabled 状态下,并且在收到 SetPortFeature (PORT_RESET) 时,端口的链接状态处于 U3 以外的任何状态。在这种情况下,端口应在下游端口链路上启动热重置。
在 DSPORT.Enabled 状态下,并且在收到 SetPortFeature (PORT_RESET) 时,端口的链接状态为 U3。在这种情况下,端口应在下游端口链路上启动热重置。
注意:如果端口在链路上启动热重置,并且在链路恢复状态期间热重置失败,则将自动尝试热重置。有关此过程的详细信息,请参阅第 7 章。在整个过程中,端口将保持 DSPORT.Resetting 状态,直到热重置完成。
当下游端口链路在热复位期间进入 Rx.Detect.Active 时,集线器应启动一个计时器来计算它在 Rx.Detect.Active 或 Rx.Detect.Quiet 中的时间。如果此计时器超过 tTimeForResetError,而链路仍保留在 Rx.Detect 中,则端口应转换为 DSPORT.Disconnected 状态。
10.3.1.7 DSPORT.Compliance
在以下任何情况下,端口都会转换为此状态:
- 当链路进入 Compliance Mode 状态时。
10.3.1.8 DSPORT.Loopback
在以下任何情况下,端口都会转换为此状态:
- 在 DSPORT.Training 状态下,当接收到的 TS2 有序集中设置了环回位时。
在此状态下,端口的链路应处于 Loopback 状态。
10.3.1.9 DSPORT.Disabled
当端口收到 SetPortFeature(PORT_LINK_STATE) eSS.Disabled 请求时,端口将转换为此状态。
在此状态下,端口的链接应处于 eSS.Disabled 状态。
10.3.1.10 DSPORT.Powered-off-detect
当下游电源状态在逻辑上处于关闭状态,并且需要增强型 SuperSpeed 连接而不是 USB 2.0 连接时,将进入此状态。为了确保建立增强型 SuperSpeed 连接,与 DSPORT.Powered-off 状态不同,在此状态下将保持终止。如果集线器不支持电源切换,则这是通电时的默认 DSPORT 状态。此状态应使用 Rx.Detect 中的链路执行远端接收器检测,直到满足以下任一条件:
检测到接收器。
满足 “power-off” 的任何条件。
满足下面描述的 “重新供电” 端口的条件。
当满足 tReset 时间且不满足 “repower” 条件时,端口应从 DSPORT.Powered-off-reset 状态过渡到此状态。
“repower” 应满足以下所有条件:
满足所有 “power” 条件。
收到 SetPortFeature(PORT_POWER) 请求,或收到 SetConfig(1) 请求,或检测到上行端口重置,或上行端口 VBUS 从关闭转换为打开。
请注意,当 Upstream Port VBUS 在上电时处于打开状态时,它被认为已从 off 转换为 on。
当不满足 “power-off” 条件且满足以下任一条件时,无论之前的状态如何,都会进入此状态。
在此端口上或全局检测到过流情况,并且存在上游端口远端接收器终端,并且上游 VBUS 已打开。注意:如果上游 VBUS 在过流处于活动状态时关闭,如果支持 ds 电源开关,则端口会立即转换为关机状态(无需等待 tReset 完成)。
上行端口 VBUS 处于关闭状态,Hub 不支持电源切换。
集线器接收此端口的 ClearPortFeature(PORT_POWER) 请求。在这种情况下,仅当端口的电源不会影响集线器上任何下游端口的低速、全速或高速运行,并且不会影响除目标端口之外的任何端口上的 SS 操作时,才会从端口断开电源。
集线器上游端口收到 SetConfiguration(0) 请求。在这种情况下,下游端口将保持此状态或在此状态和 DSPORT.Powered-off-reset 状态之间转换,而不考虑其他条件,直到集线器重置或集线器上游端口收到非零 SetConfiguration 请求。
注意:如果在 DFP 上实现了 USB Type-C 端口,并且相应的 USB 2.0 集线器端口电源在逻辑上也处于关闭状态,则可能会由于 USB Type-C 控制器进入 USB Type-C 禁用状态而禁用终止以及 Rx.Detect 完成的能力。
10.3.1.11 DSPORT.Powered-off-reset
当下游电源状态在逻辑上处于关闭状态,并且需要增强型 SuperSpeed 连接而不是 USB 2.0 连接时,将进入此状态。为了确保建立增强型 SuperSpeed 连接,与 DSPORT.Powered-off 状态不同,终端在此状态下保持不变,并避免链路训练失败,这将允许下游设备进入合规模式或 USB 2.0 操作,应在 tReset 持续时间内驱动热复位信号。此状态应使用 Rx.Detect.Reset 子状态中的链接驱动热重置,直到满足 tReset 持续时间。
每当检测到远端接收器时,都会从 DSPORT.Powered-off-detect 进入此状态。
10.3.2 断开连接检测机制(Disconnect Detect Mechanism)
断开连接检测机制在 Section 7.5 中介绍。
10.3.3 标签(Labeling)
USB 系统软件使用端口号通过 ClearPortFeature 或 SetPortFeature 请求引用单个端口。如果供应商提供标签来识别各个面向下游的端口,则每个端口连接器都应标有其各自的端口号。集线器分配给特定端口的端口号应在 USB 2.0 集线器和增强型 SuperSpeed 集线器之间保持一致。
10.4 面向 Hub 下行端口电源管理
Hub Downstream Facing Port Power Management 。
以下部分提供了状态机的功能说明,该状态机为面向下游的端口提供正确的链路电源管理行为。
10.4.1 面向下行的端口 PM 计时器(Downstream Facing Port PM Timers)
每个下游端口都维护逻辑非活动计时器,用于跟踪何时 U1 和 U2 超时。U1 或 U2 超时值可由软件随时使用 SetPortFeature (PORT_U1_TIMEOUT) 或 SetPortFeature (PORT_U2_TIMEOUT) 命令设置。每次收到 SetPortFeature (PORT_U1_TIMEOUT) 或 SetPortFeature (PORT_U2_TIMEOUT) 请求时,PM 计时器都会重置为 0。每次通过端口链路发送或接收除同步时间戳数据包之外的任何类型的数据包时,都应重置计时器。U1 定时器应精确到 +1/−0 μs。U2 定时器应精确到 +500/−0 μs。计时器的其他要求在下行 PM 状态机描述中定义。
10.4.2 面向 Hub 下行的端口状态描述
Hub Downstream Facing Port State Descriptions 。
10.4.2.1 Enabled U0 States
有四种已启用的 U0 状态,它们仅在为 U1 和 U2 超时配置的值上有所不同。对于 U1 和 U2 超时值的各种组合,端口的行为如下:
U1_TIMEOUT = 0, U2_TIMEOUT = 0
这是集线器收到端口的任何 SetPortFeature(PORT_U1/U2_TIMEOUT) 请求之前的默认状态。
端口的链路应拒绝链路伙伴的所有 U1 或 U2 转换请求。
PM 定时器可以被禁用,PM 定时器值应被忽略。
端口的链接不得尝试启动到 U1 或 U2 的转换。
U1_TIMEOUT = X > 0, U2_TIMEOUT = 0
端口的链路应拒绝链路伙伴的所有 U2 转换请求。
当进入此状态并处于活动状态时,PM 计时器将重置。
端口的链路应接受其链路伙伴的 U1 进入请求,除非集线器有一个或多个数据包/链路命令要在端口上传输。
如果 U1 超时值是 0xFF,则端口应禁止启动 U1 条目,但应接受链路伙伴的 U1 条目请求,除非集线器有一个或多个数据包/链路命令要在端口上传输。
如果 U1 超时值不是 0xFF,并且 U1 计时器达到 X,则端口的链路应启动到 U1 的转换。
U1_TIMEOUT = 0, U2_TIMEOUT = Y > 0
端口的链接应拒绝链接合作伙伴的所有 U1 转换请求。
当进入此状态并处于活动状态时,PM 定时器将重置。
端口的链路应接受其链路合作伙伴的 U2 输入请求,除非集线器有一个或多个数据包/链路命令要在端口上传输。
如果 U2 超时值是 0xFF,则端口应禁止启动 U2 条目,但应接受链路伙伴的 U2 条目请求,除非集线器有一个或多个数据包/链路命令要在端口上传输。
如果 U2 超时值不是 0xFF,并且 U1 计时器达到 Y,则端口的链路应启动从 U0 到 U2 的直接转换。在这种情况下,PORT_U2_TIMEOUT 表示 U0 中的非活动时间量。
U1_TIMEOUT =X > 0, U2_TIMEOUT = Y > 0
当进入此状态并处于活动状态时,PM 计时器将重置。
端口的链路应接受其链路合作伙伴的 U1 或 U2 输入请求,除非集线器有一个或多个数据包/链路命令要在端口上传输。
如果 U1 超时值是 0xFF,则端口应禁止启动 U1 条目,但应接受链路伙伴的 U1 条目请求,除非集线器有一个或多个数据包/链路命令要在端口上传输。
如果 U1 超时值不是 0xFF,并且 U1 计时器达到 X,则端口的链路应启动到 U1 的转换。
如果 U2 超时值是 0xFF,则端口应禁止启动 U2 条目,但应接受链路伙伴的 U2 条目请求,除非集线器有一个或多个数据包/链路命令要在端口上传输。
在以下任何情况下,端口将转换为 Enabled U0 状态之一(取决于 U1 和 U2 超时值):
在任何状态下,当 hub 收到 SetPortFeature(PORT_LINK_STATE) U0 请求时。
在 U1 状态下,当链接伙伴成功启动到 U0 的转换。
在 U2 状态下,当链接伙伴成功启动到 U0 的转换。
在 U1 状态下,当集线器在收到路由到端口的数据包后成功启动到 U0 的转换。
在 U2 状态下,当集线器在收到路由到端口的数据包后成功启动到 U0 的转换。
如果下游端口的链路伙伴拒绝尝试从 U0 转换为 U1 时。
如果下游端口的链路伙伴拒绝尝试从 U0 转换为 U2 时。
在 U3 状态下,如果集线器的上行端口接收到唤醒信号,并且正在转换的集线器下行端口在 U3 中时收到唤醒信号。
在 U3 状态下,如果下游端口的链路伙伴发起了唤醒信号,并且上游中心端口的链路不在 U3 中。
10.4.2.2 尝试 U0 – U1 转换(Attempt U0 – U1 Transition)
在此状态下,端口尝试将其链接从 U0 状态转换为 U1 状态。
在以下任何情况下,端口应尝试转换为 U1 状态:
- U1 计时器达到 U1 超时值。
- 集线器接收 SetPortFeature(PORT_LINK_STATE) U1 请求。
- 下游端口的链路伙伴启动 U0-U1 转换。
如果转换尝试失败,端口将返回到相应的已启用 U0 状态。但是,如果由于 SetPortFeature 请求而进入此状态,则端口将继续尝试在其链接上进行 U0-U1 转换。
注意:SetPortFeature 请求通常仅用于用于测试目的的 U1 条目。
10.4.2.3 尝试 U0 – U2 转换(Attempt U0 – U2 Transition)
在此状态下,端口会尝试将链接从 U0 状态转换为 U2 状态。
在以下任何情况下,端口应尝试转换为 U2 状态:
- U2 计时器达到 U2 超时值。
- 集线器接收 SetPortFeature(PORT_LINK_STATE) U2 请求。
- 下游端口的链路伙伴启动 U0-U2 转换。
如果转换尝试失败,端口将返回到相应的已启用 U0 状态。但是,如果由于 SetPortFeature 请求而进入此状态,则端口将继续尝试在其链接上进行 U0-U2 转换。
注意:SetPortFeature 请求通常仅用于用于测试目的的 U2 条目。
10.4.2.4 U1 中的链接(Link in U1)
每当下游端口进入 U1 并且所有下游端口现在都处于 U1 或低功耗状态时,如果上游端口启用了 U1 ,则 Hub 应在 tHubPort2PortExitLat 内的上游端口上启动到 U1 的转换。
当 Link 进入 U1 时, U2 计时器重置为零,并启动。
如果 U2 的超时值不是 0xFF ,并且 U2 计时器达到 Y,则端口的链接应启动从 U1 到 U2 的直接转换。在本例中,PORT_U2_TIMEOUT 表示 U1 中的时间量。
10.4.2.5 U2 中的链接(Link in U2)
当下游端口进入 U2 时,适用以下规则:
如果所有下游端口现在都处于 U2 或低功耗状态,则集线器应在 tHubPort2PortExitLat 内启动上游端口到 U2 的转换(如果上游端口上启用了 U2 )。如果上游端口上未在启用 U2,但启用了 U1,则 Hub 应使用相同的计时要求启动到 U1 的转换。
如果所有下游端口现在都处于 U1 或更低的功率状态,并且上游端口上启用了 U1 ,则集线器应在 tHubPort2PortExitLat 内的上游端口上启动到 U1 的转换。
10.4.2.6 U3 中的链接(Link in U3)
当下游端口进入 U3 时,适用以下规则:
如果所有下游端口现在都位于 U2 或 U3 中,则集线器应在 tHubPort2PortExitLat 内的上游端口上启动到 U3 以上的最低启用电源状态的转换。
如果所有下游端口现在都处于 U1 或更低的功率状态,并且上游端口上启用了 U1,则集线器应在 tHubPort2PortExitLat 内的上游端口上启动到 U1 的转换。
注意:如果集线器的上行端口收到路由到下行端口(处在 U3 状态)的数据包,则该数据包将被静默丢弃。在这种情况下,集线器应执行报头数据包的正常链路级别确认。