系列文章目录
XHCI 1.2b 规范摘要(一)
XHCI 1.2b 规范摘要(二)
XHCI 1.2b 规范摘要(三)
XHCI 1.2b 规范摘要(四)
XHCI 1.2b 规范摘要(五)
XHCI 1.2b 规范摘要(六)
XHCI 1.2b 规范摘要(七)
XHCI 1.2b 规范摘要(八)
XHCI 1.2b 规范摘要(九)
XHCI 1.2b 规范摘要(十)
XHCI 1.2b 规范摘要(11)
XHCI 1.2b 规范摘要(12)
XHCI 1.2b 规范摘要(13)
XHCI 1.2b 规范摘要(14)
XHCI 1.2b 规范摘要(15)
文章目录
- 系列文章目录
- 4 运营模式(Operational Model)
- 4.14 管理传输环(Managing Transfer Rings)
- 4.15 挂起-恢复(Suspend-Resume)
- 4.16 带宽管理(Bandwidth Management)
- 4.17 中断(Interrupters)
- 4.18 传输定义和属性(Transfer Definition and Attributes)
4 运营模式(Operational Model)
4.14 管理传输环(Managing Transfer Rings)
本节概述了主机控制器如何与传输环交互。
系统软件应将设备端点描述符(和 SuperSpeed 端点伴侣描述符)字段转换为适当的端点上下文间隔、最大数据包大小、最大突发大小和倍数值。请参阅 Section 6.2.3 以了解 Endpoint Context 的定义。
xHC 使用端点上下文中的最大数据包大小和最大突发大小字段来管理 USB 上的事务。
传输描述符 (TD) 允许软件定义由非连续主机内存缓冲区构成的连续数据块,这些数据块应传递到 USB 设备或从 USB 设备传递。
TD 传输大小由组成 TD 的所有 TRB 中的 TRB 传输长度字段的总和定义。
对于 IN 管道,设备可以通过在 TD 耗尽之前发出短数据包来截断与 TD 相关的数据传输。在这种情况下,xHC 应退出接收短数据包的 TD,并前进到传输环或入队指针(即循环位转换)上的下一个 TD,以先遇到的为准。
如果在接收短数据包的 TRB 中设置了完成时中断 (IOC) 或短数据包中断 (ISP) 标志,则应生成传输事件,并将完成代码设置为短数据包。
当端点在 xHC 的管道调度中时,它被视为活动端点,否则被视为非活动端点。按响运行状态端点的门铃将激活它,xHC 应将端点置于其管道调度中。当端点处于活动状态时,xHC 应主动处理其传输环上的 TD。如果端点的传输环已耗尽或端点退出运行状态,则端点将从 xHC 的管道调度中拉出并置于非活动状态。软件可以按响运行状态端点的门铃,以激活非活动端点。
总线实例 (BI) 表示 BI 支持速度的“单位”总线带宽。USB 总线的比特率(例如 SS 5Gb/s、HS 480Mb/s 等)不应与“总可用带宽”相混淆,后者是实际通过 BI 移动数据的最大可用带宽。
总可用带宽确定 BI 移动实际数据的能力。根据经验,总可用带宽将至少比 BI 的比特率低 20%,甚至更多,具体取决于数据包大小的组合。另请注意,多个根集线器端口可能共享单个 BI 的带宽。BI 到根集线器端口的映射取决于 xHC 实现,不会暴露给软件。
在每个 IN 事务期间,xHC 应使用最大数据包大小来检测数据包杂音错误。如果检测到串扰错误,则应为有问题的 TRB 生成传输事件,并将完成代码设置为“串扰检测到错误”。
当 xHC 检测到传输环在执行 TP 或 DP 后将耗尽时(例如,传输环上最后一个 TD 的最后一个 TRB 的最后一个数据包),它应将 ACK TP 或 DP 数据包待处理 (PP) 位清除为“0”。如果最大退出延迟大于“0”,则 xHC 应清除每个 Isoch TD 的最后一个数据包中的数据包待处理标志。在 xHC 生成的所有其他 ACK TP 或 DP 中,数据包待处理位应设置为“1”。
4.14.1 通用调度模型(General Scheduling Model)
当正在运行的端点的门铃响起时,xHC 会将端点放在管道调度中。xHC 通常为每个总线实例维护两个管道调度,一个用于周期性管道(Isoch 和中断端点),另一个用于异步管道(控制和批量)。
每次通过管道调度时,端点都会获得一个“服务机会”。服务机会 (SO) 是 xHC 为特定端点在 USB 上移动数据包分配的时间段。
根据端点类型和设置,服务机会 (SO) 期间可能会执行 1 到 3 个 USB 事务。USB 标准事务传输单个数据包 (DP),但单个 USB 突发事务可以传输多个 DP。
最大服务机会数据包数 (MSOPC) 是 xHC 在一个服务机会 (SO) 期间应安排的最大 DP 数。端点的 MSOPC 值由端点上下文字段定义的数据包数设置; (最大突发大小 +1)(乘数 + 1)。
传输描述符数据包计数 (TDPC) 是移动 TD 定义的所有数据所需的数据包数量。请注意,部分或零长度数据包会将此计数增加 1。
传输环数据包计数 (TRPC) 是传输环上所有 TD 的 TDPC 的总和。
服务机会数据包计数 (SOPC) 是 xHC 在 SO 期间实际调度的数据包数量。SOPC 值应在 SO 开始时初始化,并在 SO 的每个事务或重试完成时递减。当 SOPC 达到零时,当前端点的 SO 已完成,xHC 应为计划中的下一个端点启动 SO。重试可能会终止当前 SO 并继续下一个 SO。
通常 SOPC 小于或等于 MSOPC,但 xHC 可以将 SOPC 限制为小于 MSOPC 的值。如果只有一个端点在管道调度中,SOPC 可能会大于 MSOPC,例如,总线上的连续突发。有关 SOPC 使用的更多详细信息,请参阅下面的各个管道类型讨论。
分配给定期调度的端点由 xHC 通过寻址设备和配置端点命令严格控制,以确保定期管道调度消耗的总可用带宽不超过最大百分比。任何未被定期管道消耗的 USB 带宽都可用于异步管道。
注意:总可用带宽的“最大百分比”取决于定期管道的速度。有关更多信息,请参阅第 4.14.2 节。
分配给异步调度的端点被视为“尽力而为”,可能会消耗任何未被定期管道消耗的 USB 带宽。异步管道调度中的每个端点在每次通过调度时都会获得一个服务机会 (SO)。
4.14.1.1 系统总线带宽调度(System Bus Bandwidth Scheduling)
系统总线带宽是有限的,尤其是在 xHC 通过总线连接到系统的情况下,该总线提供的带宽低于它支持的 USB 总线实例。为确保 USB 端点的一致和可靠运行,xHC 应使用类似于管理与端点关联的 USB 带宽的方法来管理与端点关联的系统总线活动。
4.14.2 周期传输环调度(Periodic Transfer Ring Scheduling)
Isoch 和 Interrupt 端点定义 “定期” 传输。定期传输可在 USB 上提供有保证的带宽。
周期性 TD(Periodic TD) 是 Isoch TD 或中断端点传输环上调度的 TD。
周期性管道(Periodic Pipe)是 Isoch 或中断端点。
微帧索引寄存器 (MFINDEX,Microframe Index Register) 在最小间隔时间 (MIT,Minimum Interval Time) 时前进。MIT 等于 125 µs,对应于高速和增强型超高速微帧时序。微帧索引寄存器前进的时间定义为 MIT 边界(MIT Boundary)。
MIT 乘以端点上下文 Interval 字段作为底数为 2 的指数,定义端点服务间隔时间 (ESIT,Endpoint Service Interval Time)。
E
S
I
T
=
2
I
n
t
e
r
v
a
l
∗
125
µ
s
ESIT = 2^{Interval} * 125 µs
ESIT=2Interval∗125µs
所有 ESIT 在时间上都与 MIT 边界对齐。
xHC 使用端点上下文中的最大端点服务时间间隔有效负载 (Max ESIT Payload) 和间隔(Interval)字段来计算它应为周期性端点保留的 USB 带宽。周期性管道可能会持续使用比保留带宽更少的带宽。如果需要,USB 设备会通过其正常的非 USB 定义机制报告实际使用的带宽。
软件应定义每个 ESIT 的最大定期负载,如下所示 USB2 定期端点:
M a x E S I T P a y l o a d i n B y t e s = M a x P a c k e t S i z e ∗ ( M a x B u r s t S i z e + 1 ) Max\ ESIT\ Payload\ in\ Bytes = Max Packet Size * (Max Burst Size + 1) Max ESIT Payload in Bytes=MaxPacketSize∗(MaxBurstSize+1)
4.14.2.1 同步传输环调度(Isochronous Transfer Ring Scheduling)
如果 Isoch 端点上下文处于活动状态,则 xHC 应在每个 ESIT 中处理来自其传输环的一个 Isoch TD 。
软件不得为超过最大 ESIT 有效负载(Max ESIT Payload)的 Isoch 端点 TD 定义 TD 传输大小。
xHC 可以为每个 ESIT 安排多个服务机会 (SO,Service Opportunities)。SOPC 设置为 TDPC 或 MSOPC 中较小的一个。
xHC 应在处理 TD 时计算 TD 传输大小。如果在执行 TD 的 TRB 的过程中,TD 传输大小超过了最大 ESIT 有效负载(Max ESIT Payload)或允许的最大 ESIT 有效负载(Maximum Allowed ESIT Payload),则应为有问题的 TRB 生成带宽超限错误(Overrun Error),并且 xHC 应将其出队指针推进到下一个 Isoch TD 边界或入队指针(即循环位转换),以先遇到的为准。请注意,管道在此错误之后保持活动状态,xHC 只是截断传输并前进到下一个 TD。
如果传输环为空,且未定义 TD 来接收 Isoch IN 数据,则 xHC 应从定期计划中移除该端点,并生成单个传输事件,并将完成代码设置为环溢出(Ring Overrun)。
如果传输环为空,且未定义 TD 来传输 Isoch OUT 数据,则 xHC 应从定期计划中移除该端点,并生成单个传输事件,并将完成代码设置为环欠载(Ring Underrun)。
响起遇到环溢出或环欠载情况的定期端点的门铃应将其重新置于定期计划中。
间隔(Interval)值限制为 2 的倍数。ESIT 边界由 MFINDEX 寄存器的最低有效位转换为 “0” 时定义。例如,如果间隔等于 2 微帧,则 ESIT 边界由 MFINDEX 寄存器的最低有效位转换为 “0” 时定义。如果间隔等于 4 微帧,则 ESIT 边界由 MFINDEX 寄存器的最低有效两位转换为 “0” 来定义。依此类推。
注意:USB3 规范第 8.12.6 节规定 “如果在服务间隔期间没有数据要发送到等时 OUT 端点,则主机不会在间隔期间发送任何内容。” USB2 规范对此问题保持沉默。当 xHC 在传输环上遇到零长度 Isoch OUT TD 时,无论总线速度如何,它都应将零长度 DP 传输到 USB 总线,并在服务间隔内消耗 Isoch TD。如果在 xHC 尝试为 Isoch TD 提供服务时传输环为空,则不应发送任何 DP,并应生成欠载事件(Underrun Event)。
4.14.2.1.1 高速端点(High-speed endpoints)
4.14.2.1.2 全速/高速端点(Full-speed or High-speed endpoints)
4.14.2.1.3 增强的SuperSpeed端点(Enhanced SuperSpeed endpoints)
4.14.2.1.4 同步调度阈值(Isochronous Scheduling Threshold)
4.14.3 中断传输环调度(Interrupt Transfer Ring Scheduling)
端点上下文间隔(Interval)字段的值被 xHC 视为中断端点的限制参数或截止时间。中断传输环调度适用以下规则:
- 如果中断传输环处于空闲状态,则 xHC 接收端点的门铃响铃和为第一个发布到传输环的 TD 在 USB 上调度第一个相关中断事务之间的最大时间应等于 IST + ESIT。
- 如果有多个中断 TD 发布到中断端点传输环,则 xHC 在每个 ESIT 中消耗的 TD 不应超过一个。
- 软件可以为超过最大 ESIT 有效负载的中断端点 TD 定义 TD 传输大小。
- 中断管道每个 ESIT 执行一个 SO。
- SOPC 设置为 TDPC 或 MSOPC 中较小的一个。
- 中断管道应在每个 ESIT 上传输或接收不超过一个最大 ESIT 有效负载,例如,如果中断 TD 传输大小大于最大 ESIT 有效负载,则 TD 可能需要多个 ESIT 才能完成。
- 短数据包应终止 IN 中断 TD,下一个 TD(如果存在)应安排在下一个 ESIT 中。
- 意外的 ERDY 应被默默丢弃。
注意:由于中断管道提供可靠的数据传输,但每个 ESIT 的数据包(包括重试)数量受 MSOPC 值限制,因此数据包重试可能会导致中断 TD 需要比预期更多的 ESIT 才能完成。如果在发生这种情况时传输环上有第二个 TD 处于待处理状态,则应延迟到第一个 TD 成功传输为止。为了最大限度地减少重试对中断管道的延迟影响,即使初始 SOPC 值小于 MSOPC,也可以在 ESIT 中传输最多 MSOPC 数据包(包括退出)。如果 xHC 实现能够保证额外的数据包不会影响与其他周期性端点建立的带宽保证,则其可能超过每个 ESIT 的 MSOPC 数据包。
4.14.3.1 低、全、高速端点(Low-, Full-, and High-speed Endpoints)
4.14.3.2 增强的SuperSpeed端点(Enhanced SuperSpeed Endpoints)
4.14.4 异步传输环调度(Asynchronous Transfer Ring Scheduling)
4.14.4.1 增强的超高速突发事务(Enhanced SuperSpeed Burst Transactions)
4.15 挂起-恢复(Suspend-Resume)
xHC 提供与 USB 集线器中单个端口定义的挂起和恢复模型相同的挂起和恢复模型。提供控制机制以允许系统软件挂起和恢复单个端口。这些机制允许通过软件启动完全恢复单个端口。提供其他控制机制以参数化主机控制器对外部恢复事件的响应(或敏感度)。在此讨论中,主机启动或软件启动的恢复称为恢复事件/操作(Resume Events/Actions)。总线启动的恢复事件称为唤醒事件。唤醒事件的类别包括:
-
支持远程唤醒的设备断言恢复信号,类似于 USB 集线器,xHC 应始终响应明确的设备恢复信号并唤醒系统(如有必要)。
-
端口连接和断开以及过流事件。可以使用 PORTSC(Port Status and Control Register) 寄存器中的每个端口控制位打开或关闭对这些事件的敏感度。
选择性挂起是每个 PORTSC 寄存器都支持的功能。它用于将特定端口置于挂起模式。此功能用作功能组件,用于在特定操作系统中实施适当的电源管理策略。
当系统软件打算暂停整个总线时,它应该有选择地暂停所有启用的端口,然后通过将 USBCMD 寄存器中的运行/停止 (R/S) 位设置为 “0” 来关闭主机控制器。然后可以通过 PCI 电源管理接口将 xHC 置于较低的设备状态(请参阅附录 A 和 PCI PM)。
当发生唤醒事件时,系统软件最终将运行/停止 (R/S) 位设置为 “1” ,并通过将 “0” 写入其 PLS 字段来恢复暂停的端口。在确认主机控制器的时钟稳定之前,软件不应将运行/停止 (R/S) 位设置为 “1” 。这通常在系统实施中得到确认,因为在重新启动 CPU 之前系统中的所有时钟都是稳定的。因此,根据定义,如果软件正在运行,系统中的时钟是稳定的,并且 USBCMD 寄存器中的运行/停止 (R/S) 位可以设置为 “1” 。PCI PM 规范中还定义了最小系统软件延迟。有关更多信息,请参阅此规范。
4.15.1 端口挂起(Port Suspend)
系统软件通过将 “3” 写入相应的 PORTSC 寄存器端口链路状态 (PLS) 字段(请参阅第 5.4.8 节)将各个端口置于挂起模式。当端口处于启用状态时,软件应仅将 PLS 字段设置为 “3” 。
xHC 可以立即评估 PLS 字段写入,也可以等到出现微帧或帧边界。如果立即评估,则端口不会挂起,直到当前事务(如果正在执行)完成。因此,在 xHC 评估 PLS 字段之前,端口上可能会有多个微帧的活动。xHC 应至少在每个帧边界评估 PLS 字段。有关更多信息,请参阅表 5-27 中 PLS 的描述。当 PLS 字段写入 U3(“3”)时,PLS 位的状态不会更改为目标 U 状态 U3,直到挂起信号已完成发送到连接的设备(可能长达 10 毫秒)。除非端口报告其处于启用状态(PED = ‘1’,PLS < ‘3’),否则软件不应尝试暂停端口(有关 PED 和 PLS 的更多信息,请参阅第 5.4.8 节)。请注意,端口链路状态写入选通脉冲 (LWS) 位应设置为‘1’以写入 PLS 字段。
软件需要等待 U3 转换完成,然后才能将 xHC 置于低功耗状态,并恢复端口。软件可以轮询 PLS 字段以了解 U3 转换是否完成;但是,紧密的轮询循环可能会阻止处理器上的任何其他活动,从而减慢断电过程。启用 OS 计时器也会减慢断电过程,因为最小 OS 超时(~15 毫秒)与 U3 转换时间相比很长,因此软件要么最终占用 CPU,要么给主机控制器的 D3 条目增加显着的延迟。 U3 进入功能 (U3C) 通过在 PLS 转换到 U3 时断言 PLC 来消除这些延迟,其中 PLC 的断言会生成端口状态更改事件。如果 HCCPARAMS2 寄存器支持 U3 进入功能 (U3C)(U3C =“1”),则软件可以通过将 CONFIG 寄存器中的 U3 进入启用 (U3E) 标志设置为 “1” 来启用 PLS 转换到 U3 时断言 PLC。
Port Link State (PLS) – RWS 。
4.15.1.1 选择性挂起(Selective Suspend)
软件应在选择性挂起设备之前,使用 Stop Endpoint 命令并将挂起 (SP) 标志设置为“1”来停止设备的所有端点。设备恢复后,软件应按端点的门铃以重新启动它。有关使用 Stop Endpoint 命令的更多信息,请参阅第 3.3.8 节。
4.15.1.2 功能挂起(Function Suspend)
在向设备发出 SetFeature(FUNCTION_SUSPEND) 请求之前,软件应通过使用 Stop Endpoint Command 并将 Suspend (SP) 标志设置为“1”来停止与该功能关联的设备的端点。功能恢复后,软件应按端点的门铃以重新启动它。有关使用 Stop Endpoint 命令的更多信息,请参阅第 3.3.8 节。
4.15.2 端口恢复(Port Resume)
4.15.2.1 设备初始化(Device Initiated)
以下步骤描述了典型的设备启动的端口恢复过程:
-
当端口处于 U3 状态并且检测到来自设备的恢复信号时,端口将转换为恢复(Resume)状态 (PLS = ‘15’),并且端口链路状态更改 (PLC) 标志设置为 ‘1’。如果 PLC 的断言导致 PSCEG,Port Status Change Event Generation (4.19.2) 从 ‘0’ 转换为 ‘1’,则 xHC 将生成端口状态更改事件。
请注意,USB3 U3 唤醒需要 LFPS 握手。设备生成 LFPS 以启动恢复过程。在 U3 状态下检测到 LFPS 将使 USB3 端口转换为恢复状态1。xHC 不得向设备发送 LFPS 响应,这将允许 LFPS 握手完成,直到软件发出指令。 -
收到端口状态更改事件后,系统软件将评估端口 ID 字段以确定生成事件的端口。
-
然后,系统软件读取生成事件的端口的 PORTSC 寄存器。如果事件是由于设备启动的恢复引起的,则 PLC = ‘1’ 且 PLS = Resume:
-
对于 USB3 协议端口,软件应将 ‘0’ 写入 PLS 字段,以指示 xHC 向设备启动 LFPS 并启动 LFPS 握手。
-
对于 USB2 协议端口,当检测到来自设备的恢复信号时,xHC 应在 1 毫秒内传输恢复信号 (TURSM)。软件应确保恢复信号至少持续 20 毫秒 (TDRSMDN)。请参阅 USB2 规范的第 7.1.7.7 节。软件应从通知转换到恢复状态开始计时 TDRSMDN。TDRSMDN 完成后,软件应将‘0’写入 PLS 字段。
-
-
恢复信号的完成应导致端口转换到 U0 状态,即 PORTSC 寄存器 PLS 字段应设置为 U0(“0”),PLC 标志应设置为 “1” 。如果 PLC 的断言导致 PSCEG(4.19.2)从 “0” 转换为 “1” ,则 xHC 应生成端口状态更改事件。
注意:在将根集线器端口从恢复状态转换为 U0 状态之前,软件应确保 xHC 处于运行(R/S =“1”)模式。此操作可确保 xHC 能够在设备进入 U0 状态时传输 ITP 并立即接收数据包。
4.15.2.2 主机初始化(Host Initiated)
系统软件可以通过写入 PLS 字段启动选择性暂停端口的恢复(请参阅第 4.15.2 节)。除非端口报告其处于暂停(PED =“1”,PLS =“3”)状态(请参阅第 5.4.8 节),否则软件不得尝试恢复已启动暂停过程的端口。
如果系统软件在端口未处于暂停状态 (U3),而是处于低功耗链路状态(例如 U2 或 U1)时将 “0” 写入 PLS 字段,则端口应生成适当的信号,如果成功,则应转换到 U0 状态(PLS =“0”)。PLS 字段从 U3 到 U0 的转换应导致端口链路状态更改 (PLC) 位从 “0” 转换为 “1” 。如果 PLC 的断言导致 PSCEG(端口状态更改生成)从 “0” 转换为 “1” ,则应生成端口状态更改事件以反映链路状态的变化。如果中断器 0 未被屏蔽,事件的生成也会导致主机中断。
以下步骤描述了典型的主机启动端口恢复过程:
-
当端口处于 U3 状态时:
- 对于 USB3 协议端口,软件应将 “0”(U0)写入 PLS 字段以启动恢复信号。端口应转换到 U3Exit 子状态,xHC 应立即启动设备的 LFPS 生成。
- 对于 USB2 协议端口,软件应将 “15” (恢复)写入 PLS 字段以启动恢复信号。端口应转换到恢复子状态,xHC 应在 1 毫秒内传输恢复信号(TURSM)。软件应确保恢复信号至少持续 20 毫秒(TDRSMDN)。软件应从将 “15”(恢复)写入 PLS 开始计时 TDRSMDN。 TDRSMDN 完成后,软件应将“0”(U0)写入 PLS 字段。
-
恢复信号的完成应导致端口从 U3 状态转换为 U0 状态,即 PORTSC 寄存器 PLS 字段应设置为 U0(“0”),PLC 标志应设置为 “1”。如果 PLC 的断言导致 PSCEG(端口状态变化生成)从“0”转换为“1”,则 xHC 应生成端口状态变化事件。
4.15.2.3 唤醒事件(Wakeup Events)
外部 USB 事件也可能启动系统级恢复。系统唤醒事件定义如下。当挂起端口检测到恢复信号时,会发生系统唤醒事件,端口将转换到恢复状态。
对于 USB2 协议端口:
- 如果检测到恢复信号,则 xHC 会在 1 毫秒内将该信号反射到所有启用的端口(TURSM),并保持该信号直到软件将端口从恢复状态转换为 U0 状态。
对于 USB3 协议端口:
- 如果检测到恢复信号(接收到符合 USB3 规范表 6-22 中有效 t12-t10 规范的 LFPS),则端口应立即转换为恢复状态,并将端口链路状态更改 (PLC) 位设置为 “1” 。软件可以通过采样 PORTSC 寄存器并观察端口启用/禁用 (PED) 标志是否为 “1” 且端口链路状态 (PLS) 字段是否小于 “3” 来确定端口已启用(未暂停)。表 4-10 总结了系统唤醒事件,定义了 PORTSC 寄存器中的端口链路状态 (PLS,Port Link State)、当前连接状态 (CCS,Current Connect Status)、端口启用/禁用 (PED,Port Enabled/Disabled)、过流活动 (OCA,Over-Current Active) 字段的状态以及 USBSTS 寄存器中的端口变化检测 (PCD,Port Change Detect) 位,这些字段与相应的 Wake Enable 标志 (WDE、WCE、WOE) 有关。表值表示相应事件发生后字段的状态。xHC 状态列表示 xHC 对系统的响应,这些响应与事件发生时其 (PCIe) 电源状态有关。
注意:端口恢复不受唤醒启用标志的控制。
4.16 带宽管理(Bandwidth Management)
在过去几代 USB 主机控制器实现中,主机控制器接口和 USB 带宽之间存在 1:1 的对应关系。xHCI 与此模型不同,它使供应商能够根据供应商的目标应用空间需求定制通过其根集线器端口提供的带宽。xHCI 可以支持传统模型(其中单个 USB 的带宽在其所有根集线器端口之间共享)、“每端口总线”模型(其中 USB 的全部带宽在每个根集线器端口上都可用)或两者之间的任何组合。
通过 xHCI 确定可用带宽更加复杂,因为接口可以支持多种 USB 速度,每种速度都有自己的带宽限制。枚举 USB 设备时可用带宽的计算取决于根集线器端口分配给 xHCI 的哪个内部 USB 实例,以及已连接到该 USB 实例的其他设备的带宽要求。
示例 xHC 实现可能定义一个 8 端口实现,其中包含 1 个 SS、4 个 HS 和 8 个 LS/FS USB 实例,总共 13 个独立 USB 实例。或者,如果实现选择关注性能,则可能定义“每个端口一个总线”,即 8 个 SS、8 个 HS 和 8 个 LS/FS USB 实例,即 24 个独立 USB 实例。
xHCI 架构向系统软件隐藏了主机控制器实现的内部复杂性。给定 xHC 支持的一组 USB 实例,它负责管理和分配可用的 USB 带宽。软件使用配置端点命令询问 xHC 是否有特定设备配置所需的带宽。xHC 负责根据其内部组织和设备所连接的 USB 实例上的可用带宽来评估请求。
如果配置端点命令由于带宽错误或辅助带宽错误而失败,系统软件可能会使用其他端点设置重试该命令或发出协商带宽命令。协商带宽命令允许软件识别 xHC 中连接到同一 USB 实例的具有周期性端点的设备。协商带宽命令会为连接到同一 USB 实例的每个设备生成带宽请求事件,这些设备当前正在消耗周期性带宽,即声明的 Isoch 或中断端点。使用此信息,软件可以重新分配带宽以允许配置初始设备。
有关协商带宽命令的更多信息,请参阅第 4.6.13 节,有关带宽请求事件 TRB 的更多信息,请参阅第 6.4.2.4 节。
禁用插槽命令将导致释放分配给设备插槽的周期性端点的任何带宽。
4.16.1 带宽协商(Bandwidth Negotiation)
许多 USB 设备提供多种配置和/或备用接口设置,以满足各种带宽需求。例如,USB 摄像头可能提供十几种备用接口设置,以匹配其支持的各种分辨率和帧速率。通常,视频类驱动程序将选择一种接口设置,为用户提供最高质量的图像,但是如果由于可用带宽不足而拒绝此设置,则类驱动程序将尝试设置需要较少带宽的较低质量设置。如果尝试了所有备用设置,而类驱动程序仍然无法枚举摄像头,则它可能会决定发出协商带宽命令。
协商带宽命令会为同一 USB 实例上具有定期端点的每个设备插槽生成带宽请求事件。
当收到设备插槽的带宽请求事件(Bandwidth Request Event)时,系统软件应将其视为评估设备当前带宽要求的请求,如果设备能够在减少的带宽预算下有效执行其任务,则释放部分带宽。没有要求设备因带宽请求事件而放弃带宽,但是“好公民”会尽力遵守。为了释放带宽,软件可以为设备的周期性端点选择另一种配置或备用接口设置。当设备重新配置时,它们将发出配置端点命令,这些命令将释放其当前分配的部分或全部带宽。当 xHC 处理命令时,它将重新计算 USB 实例的可用带宽。协商带宽命令可能允许设备枚举,如果没有它,设备将无法枚举。
协商带宽命令使用协商带宽命令 TRB 中的插槽 ID 字段的值来识别需要带宽的设备所连接的 USB 实例。
协商带宽命令不会阻止命令环执行,例如,该命令不应等待所有 BW 请求都已交付,然后再生成相关的命令完成事件。
4.16.2 带宽域(Bandwidth Domains)
4.17 中断(Interrupters)
中断器(Interrupter)管理事件及其向主机发出的通知。xHCI 支持最多 1024 个中断器。HCSPARAMS1 中的 MaxIntrs 字段决定 xHC 中实现的中断器数量。每个中断器由一个中断器管理寄存器(Interrupter Management Register)、一个中断器调节寄存器(Interrupter Moderation Register)和一个事件环(Event Ring)组成。每个中断器应映射到单个 MSI 或 MSI-X 中断向量。如果中断器已启用并且其关联的事件环包含需要中断的事件 TRB,则中断器应断言中断。
4.17.1 中断器映射(Interrupter Mapping)
xHC 实现可能支持中断器映射(Interrupter Mapping)。中断器映射是指使用特定传输请求块(Transfer Request Block)生成的传输事件(Transfer Events)来定位中断器(Interrupter)及其事件环(Event Ring)的能力。
如果中断器数量 (MaxIntrs) 字段大于 1,则应支持中断器映射。
传输 TRB 中的 Interrupter Target 字段的值决定哪个中断器应接收由相应设备槽或传输 TRB 生成的传输事件(Transfer Events)。
如果不支持中断器映射,xHC 应忽略中断器目标字段,所有针对中断器 0 的事件均应忽略。
槽上下文(Slot Context)或 TRB 中断器目标(Interrupter Target)字段的有效值介于 0 和 MaxIntrs-1 之间。如果中断器目标字段超出 TRB 的范围,则 xHC 的行为应为未定义。建议在检测到这种情况时 xHC 不要生成任何事件,并让软件超时检测端点的错误。如果支持虚拟化,xHC 实现应确保此“未定义行为”不会影响其他功能(VFx 的 PF0)。
当命令输入 Input Slot Context 时,应检查槽上下文中断目标(Slot Context Interrupter Target)值是否在有效范围内。
有关中断目标(Interrupter Target)字段的更多信息,请参阅第 6.4.1 节。
此机制可用于促进多核平台中跨核心的中断分配。
4.17.2 中断调节(Interrupt Moderation)
中断调节(Interrupt Moderation)允许在单个中断服务请求 (ISR,Interrupt Service Request) 上下文中处理多个事件,而不是为每个事件生成一个 ISR。
由中断待处理 (IP,Interrupt Pending,IMAM 中) 标志的断言导致的中断生成可能会受到相关中断器的中断调节 (IMOD,Interrupter Moderation) 寄存器设置的限制。IMOD 寄存器由两个 16 位字段组成:中断调节计数器 (IMODC,Interrupt Moderation Counter) 和中断调节间隔 (IMODI,Interrupt Moderation Interval)。
软件可以使用 IMOD 寄存器来限制向主机 CPU 传送中断的速率。无论 USB 流量状况如何,此寄存器都提供了主机控制器断言的中断之间的保证中断间延迟。
以下算法将中断间间隔(inter-interrupt interval)值转换为常见的 “中断/秒(interrupts/sec)” 性能指标:
I n t e r r u p t s / s e c = ( 250 × 1 0 − 9 s e c × I M O D I ) − 1 Interrupts/sec = (250×10^{-9}sec × IMODI) -1 Interrupts/sec=(250×10−9sec×IMODI)−1
例如,如果 IMODI 被编程为 512,则主机控制器保证主机在上次中断后至少 128 微秒内不会被 xHC 中断。xHC 的最大可观察中断率不应超过 8000 次中断/秒。
相反,中断间隔值可以计算如下:
I n t e r − i n t e r r u p t i n t e r v a l = ( 250 × 1 0 − 9 s e c × i n t e r r u p t s / s e c ) − 1 Inter-interrupt interval = (250×10^{-9}sec × interrupts/sec) -1 Inter−interruptinterval=(250×10−9sec×interrupts/sec)−1
4.17.3 中断引脚支持(Interrupt Pin Support)
PCI 中断引脚是可选的。PCI 支持四个中断引脚,但 PCI 仅允许将一个中断引脚分配给单个 PCI 功能。如果 xHC 实现支持 PCI INTx# 中断引脚,则 xHC 在向其设备驱动程序请求注意时会断言其 INTx# 线,除非 xHC 启用了消息信号中断(MSI,即 MSI 消息控制 MSI 启用或 MSI-X 消息控制 MSI-X 启用标志为真)(有关更多信息,请参阅第 5.2.8.1 和 5.2.8.2 节)。一旦断言 INTx# 信号,它将保持断言状态,直到设备驱动程序清除中断挂起 (IP) 标志。当中断挂起 (IP) 被清除时,设备会取消断言其 INTx# 信号。
如果启用了中断引脚支持,则仅启用中断器 0,而禁用任何其他中断器。
PCI 配置空间头文件中的中断引脚寄存器(请参阅 PCI 规范第 6.2.4 节中的中断引脚描述)标识设备(或设备功能)使用的中断引脚。值 1 对应于 INTA#,2 对应于 INTB#,依此类推。如果 xHC 实现不使用中断引脚,则应在此寄存器中声明“0”。
4.17.4 中断目标识别(Interrupter Target Identification)
事件的目标中断器(target Interrupter)以以下三种方式之一确定:
- 固定且始终是主中断器(Primary Interrupter)。
- 由 TRB 数据结构中的中断器目标(Interrupter Target)字段定义。
- 由槽上下文中断器目标(Slot Context Interrupter Target)字段定义。
第 6.4.2 节中描述的每个事件 TRB 都指定了它使用上述三种方法中的哪一种。传输事件除外。有些与端点或传输相关的条件是使用传输事件 TRB 报告的,但它们报告的条件不能与特定的传输事件 TRB 相关联。在这些情况下,槽上下文中断器目标字段应用于识别应接收事件的中断器。
这些条件由以下完成代码指示:
- USB 事务错误 - 由于在流协议 HISPSM Prime Pipe 状态或 HOSPSM Prime Pipe 或 Start Stream End 状态下检测到事务超时。
- 停顿错误 - 由于在流协议 HISPSM Prime Pipe 状态或 HOSPSM Prime Pipe 或启动流结束状态下检测到停顿情况。
- 无效流 ID 错误。
- 无效流类型错误。
- 已停止 - 长度无效。请注意,槽上下文中断器目标字段仅适用于表 4-2 中的“在等待为 TD 发布更多 TRB 时停止”条件,而不适用于条件“在 TD 内的链接 TRB 上停止”和“在 TD 内的无操作 TRB 上停止”
- 环溢出。
- 环欠载。
4.17.5 中断阻塞(Interrupt Blocking)
通常情况下,如果事件环为空或处于下一个中断阈值,则将事件 TRB 放置在事件环上会导致立即向主机发出中断。但是,有些情况下,软件需要传输事件 TRB 报告的传输 TRB 的完成状态和 TRB 传输长度,但不希望传输事件生成中断。为了方便这种使用,Normal 和 Isoch 传输 TRB 以及 Event Data TRB 支持阻止事件中断 (BEI) 标志,允许它们将事件 TRB 放置在事件环上但不向主机发出中断。
BEI 标志可以消除不需要的系统中断的一个例子是 Isoch 传输。对于声明 ESIT 为 1 毫秒并以 44.1 KHz 速率生成 16 位样本的 USB 麦克风,软件可以一次向设备的 Isoch IN 传输环发布 10 个 Isoch TD。小数采样率意味着超过 10 毫秒。周期内,麦克风完成 9 个 Isoch TD,每个 TD 有 44 个样本(88 字节),第 10 个 TD 有 45 个样本(90 字节)。由于每个 Isoch TD 的样本数量各不相同,软件必须在每个 Isoch TD 中设置 ISP 或 IOC 标志,以生成传输事件来报告传输的字节数。但是,由于软件能够一次安排 10 个 TD,因此每 10 个 TD 只需要中断一次。通过在每 10 个 TD 中的 9 个中设置 BEI 标志,可以降低因 Isoch 传输而导致的中断率。
请注意,软件可以通过调整中断器的中断调节间隔 (IMODI) 来降低中断率,但这会影响共享事件环的所有端点的中断延迟。BEI 标志允许软件有选择地降低传输的中断率,而不会影响延迟敏感的传输。
- 如果 TRB 中的 BEI = ‘1’,则 TRB 生成的事件被视为 “阻塞事件” 。
- 如果 BEI = ‘0’,则 TRB 生成的事件被视为 “非阻塞事件”。
- 任何未定义 BEI 标志的 TRB 类型始终会生成非阻塞事件。
- 如果在处理 BEI = ‘1’ 的 TRB 时检测到生成事件的错误,则应忽略 BEI,并且 TRB 生成的事件应为非阻塞事件。
- 任何与传输或事件数据 TRB 不关联的传输事件 TRB 应为非阻塞事件。
为了便于中断阻塞,xHC 可以为每个中断器实现中断挂起启用 (IPE) 标志。IPE 是一个内部中断器标志,不通过任何寄存器公开。有关 IPE 如何影响中断生成和中断调节机制,请参阅中断调节部分。
中断器的 IPE 标志管理如下:
- IPE 应被清除为‘0’:当事件环初始化时。如果事件环转换为空。
- 当事件 TRB 插入事件环且 BEI =‘0’时:IPE 应设置为‘1’。
注意:只有 Normal、Isoch 和 Event Data TRB 支持 BEI 标志。
注意:未与 Transfer TRB 关联的 Transfer Event(即使用 Slot Context Interrupter Target 的 Transfer Event)始终是 Non-blocking Event 。
4.18 传输定义和属性(Transfer Definition and Attributes)
4.18.1 禁止窥探(No snoop)
此功能对于 PCIe 实现是可选的。
如果设置了 PCI Express 功能结构 (5.2.8) 设备控制寄存器 (PCIe 规范第 7.8.4 节) 中的启用无监听位 (位位置 11,表 7-12),则允许 xHC 在其发起的不需要硬件强制缓存一致性的 PCIe 事务的请求者属性中设置无监听位 (请参阅 PCIe 规范第 2.2.6.5 节)。请注意,将此位设置为“1”不会导致 xHC 在其发起的所有 PCIe 事务上设置无监听属性。即使此位为“1”,也仅当 xHC 能够保证事务的地址未存储在系统中的任何缓存中时,才允许其在 PCIe 事务上设置无监听属性。
如果在 PCI Express 功能结构中启用并由软件控制(例如,TRB 无侦听 (NS) 标志设置为“1”),则 xHC 可以在其发起的不需要硬件强制缓存一致性的 PCIe 事务的请求者属性中设置无侦听位。请参阅表 4-11 了解建议的无侦听行为。
对于消息信号中断和消息请求的内存请求(除非特别允许),xHC 不得在 PCIe 事务上声明无侦听属性。
4.18.2 无窥探和宽松的 USB 流量排序
No Snoop and Relaxed Ordering for USB Traffic 。
4.18.2.1 负载没有 Snoop 选项(No Snoop option for payload)
4.18.2.2 Scratchpad 引用没有 Snoop 选项
No Snoop option for Scratchpad reference 。
☆
请参阅 Section 4.19.1.2.13 以了解有关 Resume 状态的更多信息。 ↩︎