10 集线器、主机下游端口和设备上游端口规范
10.13 集线器控制器(Hub Controller)
Hub Controller 的逻辑组织如图 10-21 所示。
10.13.1 端点组织(Endpoint Organization)
该 Hub 类定义了一个除默认控制管道之外的附加端点,该管道是所有 Hub 所必需的:Status Change 端点。此端点的最大突增大小设置为 1。主机系统通过 Status Change 端点接收端口和集线器状态更改通知。Status Change 端点是一个中断端点。如果未设置 Hub 或端口状态更改位,则当状态更改端点收到 IN(通过 ACK TP)请求时, Hub 将返回 NRDY。设置状态更改位后,集线器将向主机发送 ERDY TP。主机随后将向 Status Change 端点请求数据,该数据将指示设置了更改位的实体(集线器或端口)。USB 系统软件可以使用这些数据来确定要访问哪些状态寄存器,以确定状态更改中断的确切原因。
10.13.2 Hub 信息架构和操作(Hub Information Architecture and Operation)
图 10-22 显示了状态、状态更改和控制信息与设备状态的关系。集线器描述符和集线器/端口状态和控制可通过默认控制管道访问。可以随时读取 Hub 描述符。当集线器检测到端口发生更改或集线器更改其自身状态时, Status Change 端点会以第 10.13.4 节中指定的格式将数据传输到主机。
由于硬件或软件事件,可以设置集线器或端口状态更改位。设置后,这些位将保持设置状态,直到 USB 系统软件通过 ClearPortFeature() 请求或集线器重置直接清除。设置更改位后,当读取状态更改端点时,集线器将继续报告状态更改,直到 USB 系统软件清除所有更改位。
USB 系统软件使用与 Status Change 端点关联的中断管道来检测集线器和端口状态的变化。
10.13.3 端口更改信息处理(Port Change Information Processing)
Hub 通过端口命令按端口报告端口的状态。USB 系统软件通过清除与集线器报告的状态更改相对应的更改状态来确认端口更改。确认会清除该端口的更改状态,以便将来传输到 Status Change 终端节点的数据不会报告上一个事件。这允许重复该过程以进行进一步的更改(请参见图 10-23)。
10.13.4 集线器和端口状态更改位图(Hub and Port Status Change Bitmap)
Hub and Port Status Change Bitmap (如图 10-24 所示)指示 Hub 或 Port 的状态是否发生了变化。此位图还指示哪些端口的状态发生了变化。Hub 在 Status Change (状态更改) 端点上返回此值。Hub 以字节增量报告此值。例如,如果集线器有 6 个端口,它将返回字节数量,并在无效的端口号字段位置中报告零。USB 系统软件知道集线器上的端口数(这在集线器描述符中报告),并相应地解码集线器和端口状态更改位图。集线器在 Hub 状态的第 0 位 和 Port Status Change Bitmap 中报告集线器状态的任何变化。
Hub and Port Status Change Bitmap 大小为 2 字节。集线器仅报告与集线器上的端口数一样多的位。USB 集线器只能具有 nMaxHubPorts(最大为 15)。
每当任何 Status Changed 位为非零时,都会返回 ERDY(如果之前发送了 NRDY),通知主机 Hub and Port Status Change Bitmap 已更改。图 10-25 显示了 hub 和 port change bit 的创建机制示例。
10.13.5 过流报告和恢复(Over-current Reporting and Recovery )
USB 设备的设计应符合适用的安全标准。通常,这意味着自供电集线器在其面向下游的端口上实施电流限制。如果发生过流情况,则会导致一个或多个端口的状态发生变化。此更改将报告给 USB 系统软件,以便它可以采取纠正措施。
集线器可以设计为将过流报告为端口或集线器事件。支持一个或多个 USB Type-C 端口的集线器应按端口报告过流。 Hub 描述符字段 wHubCharacteristics 用于指示特定 Hub 的报告功能(请参阅 Section 10.15.2.1)。集线器或端口状态字段中的过流状态位表示返回状态时过流检测的状态。Hub 或 Port Change 字段中的过流状态更改位指示过流状态是否已更改。
当集线器遇到过流情况时,它应将所有受影响的端口置于 DSPORT.Powered-off-reset 状态。如果集线器具有每端口的电源切换和每端口的电流限制,则一个端口上的过流情况仍可能导致另一个端口的功率低于指定的最小值。在这种情况下,受影响的端口将处于 DSPORT.Powered-off-reset 状态,并为该端口设置了 C_PORT_OVER_CURRENT,但未设置 PORT_OVER_CURRENT。如果集线器具有基于集线器的过流检测,则集线器上的过流情况将导致所有端口进入任何 DSPORT.Powered-off-reset 状态。但是,在这种情况下,既没有为受影响的端口设置 C_PORT_OVER_CURRENT 也没有设置 PORT_OVER_CURRENT 。
针对过流事件的主机恢复操作应包括以下内容:
- 主机从 Hub 处,收到包含过流事件的更改通知。
- 主机提取相应的集线器或端口更改信息(取决于更改位图中的信息)。
- 主机等待过流状态位清零。
- 主机将打开所有必要端口的电源(例如,为每个端口发出 SetPortFeature(PORT_POWER) 请求)。
- 主机重新枚举所有受影响的端口。
10.13.6 枚举处理(Enumeration Handling)
集线器设备类命令用于操作其面向下游的端口状态。连接设备后,Hub 会检测到设备连接事件,并在 Status Change 端点上报告。主机将接受状态更改报告,并可能在端口上请求 SetPortFeature(PORT_RESET)。如果面向下游的端口连接了增强型 SuperSpeed 设备,则主机调用的 GetPortStatus 请求将返回 PORT_CONNECTION 指示以及 PORT_SPEED 字段设置为零。
当设备与端口分离时,端口会通过 Status Change 端点报告状态更改。然后,该处理过程已准备好在下一个设备连接检测中重复。
10.14 集线器配置(Hub Configuration)
集线器通过标准 USB 设备配置命令进行配置。未配置的集线器的行为与未在电源要求和寻址方面进行配置的任何其他设备一样。集线器需要根据多种因素为其下游端口供电,包括集线器是否支持电源切换和电源应用程序。有关何时需要集线器为下游端口供电的详细信息,请参阅第 10.3.1.1 节。配置 Hub 会启用 Status Change 端点。配置过程的一部分是设置 Hub 深度,该深度用于将索引(请参阅第 10.16.2.9 节)计算到路由字符串(请参阅第 8.9 节)中。集线器深度用于将偏移量派生为路由字符串(在 TP 或 DP 中),集线器应使用该偏移量来路由在其上游端口上接收的数据包。然后,USB 系统软件可能会向集线器发出命令,以在适当的时候打开和关闭端口电源。
USB 系统软件检查集线器描述符信息以确定集线器的特征。通过检查集线器的特性,USB 系统软件确保不允许非法的电源拓扑,如果这样做会违反 USB 电源拓扑,则不打开集线器的端口。设备状态和配置信息可用于确定是否可以在给定拓扑中使用集线器。表 10-4 总结了这些信息以及如何使用它来确定集线器的当前电源要求。
传统的自供电集线器具有本地电源,但可以选择从其上游连接获取一个单位负载。这允许接口在本地电源不可用时工作(请参阅第 11.4.1.1 节)。当删除本地电源时(集线器范围的过流情况或本地电源关闭),此类型的集线器将保持 Configured 状态,但会将所有端口(无论是可拆卸的还是不可移动的)转换为 Powered-off 状态。当本地电源关闭时,所有端口状态和更改信息都读取为零,并且所有 SetPortFeature() 请求都将被忽略(请求被视为无操作)。Hub 将使用 Status Change 端点将 Hub 事件通知 USB 系统软件(有关 Hub 状态的详细信息,请参阅第 10.13.4 节)。
配置描述符中的 MaxPower 字段用于向系统报告配置被选择时集线器将从 USB 电源获取的最大功率。连接到集线器的外部设备将报告其各自的电源需求。
从 USB PD (通过其上游端口) 或 USB Type-C Current 获取电源的集线器应使用其 BOS 描述符中的 PD 使用者端口描述符功能报告其运行功率。系统软件可以通过查询连接此类集线器的下行端口来确定当前的电源合同。复合设备可以通过 USB 电源或 USB PD(通过 UFP)或 USB Type-C 电流为集线器电子设备和永久连接的设备供电。
整个负载可以在集线器的配置和/或 BOS 描述符中报告,其中永久连接的设备每个都报告自供电,其各自的配置描述符中的 MaxPower 为零。
总线供电的集线器应能够将所选配置的集线器电子设备或永久连接设备未使用的任何电源提供给公开的下游端口。集线器应能够在暴露的下游端口之间提供任意分割的电源(即,如果集线器可以为两个暴露的下游端口提供 600 mA,则它必须能够为一个端口提供 450 mA,为另一个端口提供 150 mA,为每个端口提供 300 mA 的功率,依此类推)。
注意:软件应确保总线供电集线器上每个公开的下游端口至少有一个单位负载(ONE UNIT LOAD)可用。
自供电集线器应确保它能够为集线器上每个裸露的下游端口提供至少 6 个单位负载。此外,根据自供电集线器的类型,当集线器连接到 USB 下行端口时,它应:
- 传统(非 USB 连接器,例如桶形插孔):集线器独立管理其电源,并在接通外部电源时在 USB 2.0 和 USB 3.2 集线器上移至通电状态(根据第 9.1 节)。
- USB PD 供电 [通过其上游端口]:集线器从上游端口获取电源,如果它获得足够的电源成为自供电集线器,则应进入 Powered 状态。如果不能,则应使用 PD 机制通知系统功率不足的 Capability 不匹配。
- USB PD 供电 [通过其下游端口之一]:集线器从其下游端口之一获取电源,如果它获得足够的电源成为自供电集线器,则应进入 Powered 状态。如果不能,则它应:
- 仅将 USB 2.0 集线器移至 Powered 状态
- 设置 C_HUB_LOCAL_POWER 并将 Hub Status (集线器状态) 中的 local power source 字段设置为 1
- 将 Hub Status 中的 Downstream PD Capability Mismatch 字段设置为 1
USB Type-C 电流 [通过其上游端口]:集线器从上游端口获取电源,如果它获得足够的电源成为自供电集线器,则应进入 Powered 状态。如果不能,则它应:
- 仅将 USB 2.0 集线器移至 Powered 状态
- 设置 C_HUB_LOCAL_POWER 并将 Hub Status (集线器状态) 中的 local power source 字段设置为 1
- 将 Hub Status 中的 Insufficient USB Type-C current 字段设置为 1
10.15 描述符(Descriptors)
集线器描述符派生自通用 USB 设备框架。集线器描述符描述集线器设备以及该集线器上的端口。主机通过 Hub 的默认控制管道访问 Hub 描述符。
USB 规范(请参阅第 8 章)定义了以下描述符:
- 设备级描述符
- 配置
- 接口
- 端点
- 字符串(可选)
hub 类定义了额外的 Descriptors(请参阅 Section 10.15.2)。此外,USB 设备框架中允许使用特定于供应商的描述符。集线器支持第 8 章中定义的标准 USB 设备命令。
集线器是唯一允许同时以高速和 Gen X 速度运行的设备。本规范仅定义集线器应在 Enhanced SuperSpeed 总线上报告的描述符。
请注意,当以 Gen X 速度或 USB 2.0 速度运行时,增强型 SuperSpeed 集线器应始终支持 Get Descriptor (BOS)(请参阅第 9.6.2 节)。
10.15.1 Hub 类的标准描述符(Standard Descriptors for Hub Class)
Hub 类在标准 USB 描述符中预定义了某些字段。其他字段要么依赖于实现,要么不适用于此类。
集线器具有一个 bDeviceProtocol 字段设置为 3 的设备描述符和一个 bInterfaceProtocol 字段设置为 0 的接口描述符。
在 SuperSpeed 模式下运行的 USB 集线器的集线器描述符
如果 Hub 运行在 SuperSpeedPlus 模式下,则它还应返回在该模式下定义的设备功能和精确时间测量功能。
在 SuperSpeedPlus 模式下运行的 USB 集线器的集线器描述符
SuperSpeedPlus 比 SuperSpeed 多了 SuperSpeedPlus USB Device Capability 和 Precision Time Measurement 。
10.15.2 特定于类的描述符(Class-specific Descriptors)
10.15.2.1 集线器描述符(Hub Descriptor)
表 10-5 概述了 hub 描述符中包含的各种字段。