第四章 运营模式(4)-TRB-流和设备通知
- 4 运营模式(Operational Model)
- 4.11 TRBs(Transfer Request Block)
- 4.11.1 TRB 模板(TRB Template)
- 4.11.2 传输 TRB(Transfer TRBs)
- 4.11.3 事件 TRB(Event TRBs)
- 4.11.4 命令 TRB(Command TRBs)
- 4.11.4.1 无操作命令 TRB(No Op Command TRB)
- 4.11.4.2 启用插槽命令 TRB(Enable Slot Command TRB)
- 4.11.4.3 禁用插槽命令 TRB(Disable Slot Command TRB)
- 4.11.4.4 寻址设备命令 TRB(Address Device Command TRB)
- 4.11.4.5 配置端点命令 TRB(Configure Endpoint Command TRB)
- 4.11.4.6 评估上下文命令 TRB(Evaluate Context Command TRB)
- 4.11.4.7 重置端点命令 TRB(Reset Endpoint Command TRB)
- 4.11.4.8 停止端点命令 TRB(Stop Endpoint Command TRB)
- 4.11.4.9 设置 TR Dequeue 指针命令 TRB
- 4.11.4.10 重置设备命令 TRB(Reset Device Command TRB)
- 4.11.4.11 强制事件命令 TRB(可选规范)
- 4.11.4.12 协商带宽命令 TRB(可选规范)
- 4.11.4.13 设置延迟容差值命令 TRB(可选规范)
- 4.11.4.14 获取端口带宽命令 TRB(可选规范)
- 4.11.4.15 Force Header 命令 TRB
- 4.11.4.16 获取扩展属性命令 TRB(可选规范)
- 4.11.4.17 设置扩展属性命令 TRB(可选规范)
- 4.11.5 其他 TRB(Other TRBs)
- 4.11.6 供应商定义的 TRB 类型(Vendor Defined TRB Types)
- 4.11.7 TD 使用规则(TD Usage Rules)
- 4.12 流(Streams)
- 4.13 设备通知(Device Notifications)
4 运营模式(Operational Model)
4.11 TRBs(Transfer Request Block)
本节讨论 TRB 的属性和用途,这些属性和用途超出了第 6.4 节中提供的一般数据结构描述的范围。
4.11.1 TRB 模板(TRB Template)
TRB 遵循图 4-13 中所示的广义模板。

TRB 由 3 个基本组件组成:参数(Parameter)、状态(Status)和控制(Control)。以下小节标识了每个组件的属性。
4.11.1.1 命令和传输 TRB 组件
Command and Transfer TRB Components 。
命令(Command)和传输(Transfer) TRB 组件遵循以下一般规则,其中生产者是系统软件,消费者是 xHC。
创建命令环或传输环时,系统软件应将所有命令和传输 TRB 的所有组件初始化为 “0” 。
xHC 应将所有命令和传输 TRB 的所有组件视为只读。
所有命令或传输 TRB 组件的格式/内容应由控制组件 TRB 类 型(TRB Type)字段定义。TRB 类型字段应始终位于控制组件的 10-15 位中。
4.11.1.2 事件 TRB 组件(Event TRB Components)
事件 TRB 组件遵循以下一般规则,其中消费者是系统软件,生产者是 xHC。
创建事件环时,系统软件应将所有事件 TRB 的所有组件初始化为 “0” 。
事件环初始化后,系统软件应将事件 TRB 的所有组件视为只读。
所有事件 TRB 组件的格式/内容应由控制组件 TRB 类型(TRB Type)字段定义。TRB 类型字段应始终位于控制组件的 10-15 位中。
4.11.2 传输 TRB(Transfer TRBs)
传输 TRB 应位于传输环(Transfer Ring)上。传输环上的工作项称为传输描述符(TD,Transfer Descriptor),由一个或多个传输 TRB 数据结构组成。本节介绍与传输相关的 TRB。
系统软件是所有 Transfer TRB 的生产者,而 xHC 是消费者。
完成传输 TRB 后,以下 4 种情况之一将导致在事件环上生成相关传输事件:
- 完成中断 (IOC,Interrupt On Completion) 标志已设置。
- 已收到短数据包(Short Packet),并且设置了短数据包中断 (ISP,Interrupt-on Short Packet) 标志。
- 执行传输 TRB 时发生错误。
在每种情况下,完成代码(Completion code)都将指示成功或传输事件生成的原因。
IOC 标志通常仅在事务描述符 (TD) 的最后一个 TRB 中设置(“1”),以最大限度地减少事件 TRB 生成和系统中断。
如果 MaxPStreams 字段 = ‘0’,则每个端点上下文(Endpoint Context)定义一个传输环(Transfer Ring);如果 MaxPStreams 字段 > ‘0’,则每个端点上下文定义多个传输环。
表 6-91 定义了传输环上的 TRB 类型。表 6-92 定义了允许的传输环 TRB 类型作为端点类型的函数。
注意:软件应仅利用传输事件来确定 TRB 完成情况。软件不得根据帧 ID、MFINDEX 或其他信息推断 TRB 完成情况。
有关 TRB 要求的更多信息,请参阅第 4.11.7 节。
4.11.2.1 普通 TRB(Normal TRB)
普通 TRB 有多种使用方式;专门用于普通和分散/聚集操作的批量和中断传输环,为 Isoch 中的分散/聚集操作和数据阶段 TD 定义额外的数据缓冲区。
与普通 TRB 关联的 数据传输 方向取决于与其关联的端点上下文或与控制端点关联的 TRB 环中的前一个数据阶段 TRB 定义的方向。
链位(图 6-8 中的 CH 字段)可以在普通、数据阶段、状态阶段和 Isoch TRB 中设置为 “1”,以形成多 TRB 传输描述符。链式操作允许分散/聚集操作。系统软件可以使用链式操作来连接虚拟内存页面,或连接字节对齐的数据。
有关普通 TRB 的定义,请参阅第 6.4.1.1 节。
4.11.2.2 设置阶段、数据阶段和状态阶段 TRB
Setup Stage, Data Stage, and Status Stage TRBs 。
所有 USB 设备都响应来自设备 Default Control Pipe 上主机的请求。这些请求是使用 Control Transfers 发出的。在 USB 数据包级别,控制传输由多个事务组成,这些事务分为多个阶段:设置阶段、可选数据阶段和终止状态阶段。xHCI 定义了设置阶段 TRB、数据阶段 TRB 和状态阶段 TRB,以提供到相应 USB 控制传输阶段的 1:1 映射。请参阅 第 3.2.9 节 以了解有关 xHCI Control 传输支持的概述。

4.11.2.3 Isoch TRB(Isoch TRB)
Isoch 传输描述符 (TD) 应由链接到零个或多个普通 TRB 的 Isoch TRB 组成。
与 Isoch Transfer Ring(及其定义的 Isoch TD)关联的数据传输方向(direction)取决于与其关联的端点上下文(Endpoint Context)定义的方向(direction)。有关方向编码,请参阅表 6-9 中的 EP 类型字段定义。
USB 端点描述符 bInterval 和 wMaxPacketSize 以及 USB 超高速端点配套描述符 bMaxBurst 和 bmAttributes :Mult 参数定义同步管道的带宽要求。这些参数指定设备和主机之间的服务质量契约。此契约确保在间隔期间,主机和设备之间最多可以传输 Max ESIT Payload 字节。另一种看待它的方式是;USB 描述符字段; bInterval、wMaxPacketSize、bMaxBurst、Mult 定义 USB 上保证可用于移动与此端点关联的数据的带宽。xHCI 在端点上下文中定义了这些参数的更通用版本:间隔(Interval)、最大数据包大小(Max Packet Size)、最大突发大小(Max Burst Size)和 Mult 字段。系统软件负责将 USB 端点和超高速端点配套描述符中定义的端点类型和速度相关值转换为 xHCI 使用的通用值。有关端点上下文(Endpoint Context)字段及其与 USB 描述符字段的关系的更多信息,请参阅第 6.2.3 节。
Isoch TD 定义将在单个间隔内发生的等时数据传输。Isoch TD 由一个或多个 TRB 组成,其中 TD 的第一个 TRB 始终是 Isoch TRB 。如果与 Isoch TD 相关的数据不连续或大于 64K 字节,则其他 Normal TRBs 可以链接到初始 Isoch TRB,形成多 TRB Isoch TD。
xHC 应在 Isoch 传输环上每个间隔消耗一个 Isoch TD 。为了确保流式传输数据,系统软件需要在每个间隔在传输环上放置至少一个 Isoch TD,在同步调度阈值之前(请参阅 IST,第 4.14.2.1 节)。
对于 Isoch OUT 端点,如果关联的传输环为空,则在中间间隔期间不应通过 USB 安排任何 Isoch 传输,应从 xHC 的管道调度中删除端点,并为 EP 的传输环生成环欠载事件以标记该情况。
对于 Isoch IN 端点,如果传输环为空,则在中间间隔期间可能已传输的任何 Isoch 数据都将丢失,端点将从 xHC 的管道调度中移除,并且将为 EP 的传输环生成环溢出事件。无论哪种情况,端点都应保持运行状态。xHC 应从 Isoch 管道调度中移除端点,并在下次端点的门铃响起时重新启动同步传输。
注意:仅在检测到空传输环的第一个间隔中生成环欠载或环溢出事件。
4.11.2.4 TD 大小(TD Size)
Transfer TRB 之 Normal TRB :
TRB 的 TD Size 字段定义了在处理完当前 TRB 和所有先前 TRB 中的所有最大数据包大小(Max Packet Sized)数据包后,TD 中剩余的要传输的数据包数量。xHC 可以使用此字段来估计 TD 的大小,而无需提前读取 TRB 到 TD 末尾。TD Size 字段应由软件在传输 TRB 中初始化,并使用以下方法为 TRB 计算值:
TD 数据包计数(TD Packet count)定义了必须传输才能完成 TD 的数据包数量。

其中,ROUNDUP (x) 将小数 x 从 0(零)向上舍入为最接近的整数值。
x 是 TD 中的传输 TRB 数量。
n 是 TD 中传输 TRB 的索引,其中 n = 1 表示 TD 的第一个传输 TRB。
TRB 传输长度 Sum (n) 是 TRB 1 至 n 中 TRB 传输长度字段的总和。
Packets Transferred (n) 定义了已为 TD 传输的 Max Packet Sized 数据包的数量,包括 TRB (n) 描述的数据。

TRB Residue (n) 定义在处理当前 TRB 和 TD 的所有先前 TRB 中的所有最大数据包大小数据包后,TRB (n) 缓冲区中剩余的字节数。

TD Size (n),对于 TD 中除最后一个传输 TRB 之外的所有传输 TRB,TD Size 标识在发送 TRB Residue (n) + TRB n+1 到 x 的数据后仍需要调度以完成此 TD 的数据包数量。TD 的最后一个传输 TRB 中的 TD Size 值(TD Size (x))应清除为 “0”,以明确指示它是 TD 的最后一个传输 TRB 。由于 TD 大小字段只有 5 位,如果要调度的数据包数量大于 31,则其值必须强制为 31。
对于 TD 的所有传输 TRB(最后一个除外)(n = 1 到 x-1):
if (TD PacketCount - PacketsTransferred(n) > 31)
TD Size(n) = 31;
else
TD Size(n) = TD PacketCount - PacketsTransferred(n);
对于 TD 的最后一个传输 TRB:TD Size(x) = 0 。
4.11.2.5 帧号(Frame ID)
4.11.2.5.1 帧 ID ESIT 规则(Frame ID ESIT Rules)
4.11.2.5.2 重新同步(Resynchronization)
4.11.3 事件 TRB(Event TRBs)
事件 TRB 应在事件环(Event Ring)上找到。事件环上的工作项称为事件描述符 (ED,Event Descriptor)。ED 应仅由一个 Event TRB 数据结构组成。本节介绍事件相关 TRB 的操作特征。
xHC 是所有 Event TRB 的生产者,而系统软件是使用者。
事件 TRB 用于报告与命令环和传输环相关的事件,以及各种其他与主机控制器相关的事件(端口状态更改、带宽请求等)。
事件 TRB 的控制组件的参数(Parameter)、长度和高位字的字段定义均取决于事件类型。有关这些定义的更多信息,请参阅下面的特定事件定义。事件类型字段应定义事件类型相关字段的内容。
事件类型字段应指示表 6-91 中定义的事件环 TRB 类型。主事件环(Primary Event Ring)上可以找到任何事件类型。辅助事件环(Secondary Event Ring)上只能找到传输(Transfer)、带宽请求(Bandwidth Request)和设备通知事件(Device Notification Events)。有关主事件环和辅助事件环的讨论,请参阅第 4.9.4.3 节。
4.11.3.1 传输事件 TRB(Transfer Event TRB)
传输事件 TRB 生成仅在以下条件下发生:
- 如果设置了完成中断 (IOC) 标志。
- 在执行传输 TRB 期间发生短传输,并且设置了短数据包中断 (ISP) 标志。
- 如果在执行传输 TRB 期间发生错误。
可能会检测到几个无法归因于特定 TRB 的传输相关错误,例如环溢出、环欠载等。在这些情况下,xHC 应将 TRB 指针设置为 “0”,软件应将其视为无效。当与传输 TRB 相关的数据传输完成时,如果 TRB IOC 或 ISP 标志设置为 “1”,或者与 TRB 相关的传输发生错误,则 xHC 应生成传输事件。并且在生成此事件后前进到当前 TD 末尾时,遇到的每个 IOC 标志设置为“1”的传输 TRB 都应生成传输事件。 “当前”传输事件的条件代码应设置为原始传输事件中条件代码的值,当前传输事件的TRB传输长度应设置为原始传输事件中TRB传输长度字段的值。
4.11.4 命令 TRB(Command TRBs)
除非特定命令另有说明,否则系统软件应将 Parameter、Status 和 Length TRB 组件清除为 ‘0’。
控制组件的 TRB Type 字段应指示命令类型。表 6-91 定义了可用的命令 TRB,即命令环上允许的 TRB Type 。
对于每个命令,xHC 通过在事件环上放置命令完成事件 TRB 来通知系统软件其完成。
当命令 TRB 在命令环上初始化时,循环位将设置为命令环的生产者循环状态 (PCS) 标志的值。
如果端点定义了流,则影响端点上下文的命令也可能影响相关的流上下文。 在两个上下文都可能受到影响的情况下,组合上下文称为“端点/流”上下文。
其余字段应由系统软件根据命令类型进行管理,如下所述。
注意:寻址设备、配置端点和评估上下文命令使用输入上下文数据结构。
4.11.4.1 无操作命令 TRB(No Op Command TRB)
No Op Command TRB 提供了一种简单的方法来验证 xHC 提供的基本 TRB Ring 机制的运行情况,或报告命令环出队指针的当前值。
4.11.4.2 启用插槽命令 TRB(Enable Slot Command TRB)
启用插槽命令 TRB 使 xHC 选择可用的设备插槽,并在命令完成事件中将所选插槽的 ID 返回给主机。
启用插槽命令使用与 No Op Command TRB 相同的格式,如第 6.4.3.1 节所述。

4.11.4.3 禁用插槽命令 TRB(Disable Slot Command TRB)
禁用插槽命令 TRB 释放分配给已禁用插槽的任何带宽,释放分配给该插槽的任何内部 xHC 资源,并将关联插槽上下文的 Slot State 字段设置为 Disabled。
4.11.4.4 寻址设备命令 TRB(Address Device Command TRB)
Address Device Command TRB 将选定的 Slot Context 从 Default 转换为 Addressed 状态。它还会导致 xHC 为 USB 设备选择一个地址,并向 USB 设备发出 SET_ADDRESS 请求。
4.11.4.5 配置端点命令 TRB(Configure Endpoint Command TRB)
Configure Endpoint Command TRB 用于启用和/或禁用设备插槽的选定端点。启用端点时,xHC 会评估命令中所选端点上下文标识的主机控制器资源和 USB 带宽要求。如果可以满足要求,则启用终端节点。
4.11.4.6 评估上下文命令 TRB(Evaluate Context Command TRB)
系统软件使用 “评估上下文命令 TRB” 来通知 xHC 与所选上下文关联的参数已被修改。执行 Evaluate Context 命令不会更改上下文的当前状态。有关使用此命令的更多信息,请参阅 Section 4.3 。
4.11.4.7 重置端点命令 TRB(Reset Endpoint Command TRB)
系统软件使用 Reset Endpoint Command TRB 命令重置单个端点。此命令可用于重新启动 Halted 终端节点。
4.11.4.8 停止端点命令 TRB(Stop Endpoint Command TRB)
系统软件使用 Stop Endpoint Command TRB 命令来停止单个端点的数据包流,并将关联 Transfer Ring 上所有 TD 的所有权转移给软件。
4.11.4.9 设置 TR Dequeue 指针命令 TRB
Set TR Dequeue Pointer Command TRB 。
系统软件使用 Set TR Dequeue Pointer Command TRB 命令将单个终端节点的 TR Dequeue Pointer 字段设置为新值。
4.11.4.10 重置设备命令 TRB(Reset Device Command TRB)
Reset Device Command TRB 。
系统软件使用 Reset Device Command TRB 命令通知 xHC 它已重置 USB 设备。
4.11.4.11 强制事件命令 TRB(可选规范)
Force Event Command TRB (Optional Normative) 。
强制事件命令 TRB 允许 VMM 在所选虚拟函数的事件环上注入事件 TRB。VMM 在将 USB 设备模拟到 VM 时使用此命令。有关虚拟化的更多信息,请参阅第 8 节。
4.11.4.12 协商带宽命令 TRB(可选规范)
Negotiate Bandwidth Command TRB (Optional Normative) 。
系统软件使用 Negotiate Bandwidth Command TRB 为定期终端节点启动带宽请求事件。此命令可用于从系统中恢复未使用的 USB 带宽。
4.11.4.13 设置延迟容差值命令 TRB(可选规范)
Set Latency Tolerance Value Command TRB (Optional Normative) 。
系统软件使用设置延迟容差值命令 TRB 为 xHC 提供尽力而为延迟容差 (BELT) 值。此命令是可选的规范性命令,但是,如果 xHC 还支持相应的主机互连 LTM 机制,则应支持此命令。
4.11.4.14 获取端口带宽命令 TRB(可选规范)
Get Port Bandwidth Command TRB (Optional Normative) 。
获取端口带宽命令 TRB 由软件发出,用于检索 xHC 的每个根集线器端口上可用的定期带宽百分比。如果系统软件由于带宽错误或辅助带宽错误而无法枚举设备,则系统软件可以使用此信息向用户推荐拓扑更改。
4.11.4.15 Force Header 命令 TRB
Force Header Command TRB 。
Force Header Command TRB 由软件发出,用于将链路管理或事务数据包发送到 USB 设备。例如,它可用于发送供应商设备测试 LMP。
4.11.4.16 获取扩展属性命令 TRB(可选规范)
Get Extended Property Command TRB (Optional Normative) 。
系统软件使用“获取扩展属性”命令来发现 xHC 支持的特定扩展功能,并枚举和读取这些扩展功能的特定属性。
4.11.4.17 设置扩展属性命令 TRB(可选规范)
Set Extended Property Command TRB (Optional Normative) 。
系统软件使用“设置扩展属性”命令来控制 xHC 支持的特定扩展功能的属性。
4.11.5 其他 TRB(Other TRBs)
4.11.5.1 链接 TRB(Link TRB)
Link TRB 支持调整大小和非连续传输环和命令环。链路 TRB 通过提供指向环开头的指针来指示环的结束。
如果系统软件无法分配连续的页以形成一个大的传输环,则也可以使用链接 TRB 将多个内存页链接在一起,以形成一个传输环。
非连续的 TRB 环由环段(Ring Segments)组成。

4.11.5.2 事件数据 TRB(Event Data TRB)
事件数据 TRB 允许系统软件生成软件定义的事件,并完全指定生成事件的参数组件。

事件数据 TRB 具有独特的属性,即继承在环上执行的上一个(非事件数据)TRB 的完成代码,并累积前面 TRB 的传输长度。
事件数据 TRB 的典型用途是在 TD 完成后提供 64 位软件定义标识符(或地址)。为此,事件数据 TRB 将作为 TD 的最后一个 TRB 链接,并且 IOC 标志将仅在事件数据 TRB 中设置。当 TD 完成时,将生成一个事件,其中完成代码由上一个执行的 TRB 提供,并且事件的参数组件将加载事件数据 TRB 提供的值。
传输事件(Transfer Event)的事件数据 (ED,Event Data) 字段指示事件是由 Transfer TRB 还是 Event Data TRB 生成的。ED 标志等于 “1” 的传输事件称为事件数据传输事件(Event Data Transfer Event)。

Event Data Transfer Event 的一个关键特性是它能够报告 TD 传输的字节数,而不是单个 TRB 的字节数。为了实现这一点,xHC 为每个端点维护一个内部 24 位事件数据传输长度累加器 (EDTLA,Event Data Transfer Length Accumulator)。EDTLA 管理规则如下:
- 在执行 TD 的第一个传输 TRB 之前或执行设置 TR 出队指针命令时,应立即将 EDTLA 清除为“0”。
- 传输 TRB 完成后,应将 TRB 传输的字节数添加到 EDTLA。如果传输的总字节数大于 16,777,215 (16MB-1),则 EDTLA 应回绕。
- 遇到 Event Data TRB 时,应生成 Event Data Transfer Event ,其中 TRB 传输长度字段应包含 EDTLA 的值。然后应将 EDTLA 清除为 “0” 并再次开始累积。
- 如果生成了停止传输事件(Stopped Transfer Event)且条件代码(Condition Code,是 completion code 吗?) = Stopped —— 短传输,则传输事件的 TRB 传输长度字段应包含 EDTLA 的值。
请注意,对于大于或等于 16MBytes 的 TD,EDTLA 将翻转。系统软件负责定期在 TD 内插入“中间”事件数据 TRB(“Intermediate” Event Data TRBs),以在发生翻转条件之前报告传输长度。软件还负责累积事件数据传输事件的长度字段,以确定声明多个事件数据 TRB 的 TD 传输的总字节数。
如果在执行多 TRB TD 期间检测到短数据包,则 xHC 应前进到下一个 TD 的第一个 TRB 或入队指针(即循环位转换),以先遇到的为准。如果发生短数据包的 TD 由事件数据 TRB(其 IOC 标志已设置)终止,则 xHC 应生成事件数据传输事件(Event Data Transfer Event),其中长度字段应反映实际传输的字节数。
除非另有说明,否则以下规则适用于传输环上的事件数据 TRB:
- 如果 Event Data TRB 的 IOC 标志设置为 “1”,则应由 Event Data TRB 生成事件。
- 由 Event Data TRB 生成的 event (Event Data Transfer Event)应使用 Transfer Event TRB 的格式。应为传输环上的 Event Data TRB 设置适当的插槽 ID 和端点 ID 字段,并将 Event Data (ED) 标志设置为 “1” 。
- 当 Event Data TRB 的 IOC 标志设置为 “1” 时,生成的事件应报告先前执行传输 TD 中的 TRB 的 Completion Code,或者如果作为 Event Data TD(即仅由一个事件数据 TRB 组成的 TD)插入环中则报告成功。“previously executed Transfer TRB” 要么是 TD 的最后一个传输 TRB 或生成错误并迫使 TD 提前完成的传输 TRB。Intermediate Event Data TRBs 应报告“成功”。
- Event Data TRB 生成的 Transfer Event 的参数组件应包含 Event Data TRB 参数组件的值。
- Event Data Transfer Event 的长度字段应反映从 TD 开头或自 TD 中遇到的最后一个事件 TRB 以来传输的字节数。
注意:上述规则也适用于中间事件数据传输事件 TRB(Intermediate Event Data Transfer Event TRBs)。
注意:Transfer Event TRB 中的事件数据 (ED) 标志向系统软件指示相应事件的参数组件是否应解释为指向系统内存或软件定义数据的指针。
注意:IOC 标志由 xHC 一般处理。如果它在 TRB 中设置,则 xHC 将为该 TRB 生成事件。如果事件数据 TRB 中未设置 IOC 标志,则 xHC 将越过它,在此过程中清除 EDTLA。
注意:Event Data TRB 只能在传输环(Transfer Ring)上找到。
注意:Event Data TRB 不得紧跟另一个 Event Data TRB 。
注意:有关如何使用评估下一个 TRB (ENT,Evaluate Next TRB) 标志来管理事件数据 TRB 的信息,请参阅第 4.12.3 节。
注意:有关在执行 TD 时发生短数据包情况时如何处理事件数据 TRB 的更多信息,请参阅第 4.10.1.1 节。
注意:软件不得在 Isoch 传输环上定义 “独立(stand-alone)” 事件数据 TD(即仅包含单个事件数据 TRB 的 TD),但事件数据 TRB 可以包含在 Isoch TD 中。
4.11.6 供应商定义的 TRB 类型(Vendor Defined TRB Types)
xHC 供应商可以使用表 6-91 中标识的供应商定义的 TRB 类型代码来定义专有的 TRB 类型。供应商定义的 TRB 类型可用于定义命令、事件或传输 TRB。
供应商应使用表 7-3 中标识的 xHCI 扩展功能代码定义专有 xHCI 扩展功能结构,以枚举任何供应商定义的 TRB 类型或 xHC 功能。如果 xHC 遇到无法识别的供应商定义 TRB :
- 在传输环上,如果供应商定义的 TRB 前面有一个传输 TRB,并且传输 TRB 的链位 (CH,Chain bit) 已设置(“1”),则供应商定义的 TRB 也需要支持有效的链位,xHC 将评估该链位以确定是否已到达 TD 的末尾。否则,xHC 应越过传输环上未识别的供应商定义的 TRB 并将其忽略。
- xHC 应将命令环上遇到的供应商定义的 TRB 视为无操作命令 TRB。
- 软件应跳过并忽略事件环上遇到的供应商定义的 TRB。
xHC 供应商可以使用供应商定义的 TRB 类型(Vendor Defined TRB Type)代码来定义专有 xHCI 命令。所有供应商定义的命令都应使用命令完成事件 TRB (Command Completion Event TRB)来报告完成情况。
多个供应商可以定义相同的 xHCI 扩展功能代码或供应商定义的 TRB 代码来执行不同的操作。所有供应商定义的 xHCI 扩展功能代码和 TRB 类型都应由系统软件使用 PCI 配置空间头供应商 ID 和子系统供应商 ID 进行限定。
供应商还可以定义完成代码。供应商定义的完成代码分为两组:错误和信息。这种划分允许软件推断供应商定义的完成代码的用途,即使它不具备供应商特定的知识。请参阅表 6-90。
如果软件不具备供应商特定的知识,则供应商定义的信息代码定义范围内的完成代码应与成功完成代码相同地解释。
如果软件没有供应商特定的知识,则供应商定义错误代码定义范围内的完成代码应被解释为未定义错误完成代码,例如,如果在命令完成事件中报告了供应商定义的错误代码,则软件应假定相关命令未成功完成。
4.11.7 TD 使用规则(TD Usage Rules)
传输描述符 (TD) 可以由 1 个或多个 TRB 组成。TRB Chain 标志用于标识 TD 的 TRB,其中 Chain 标志在 TD 的所有 TRB(最后一个除外)中都设置。在最简单的情况下,TD 由单个 TRB 组成。较大的传输可能需要由许多 TRB 组成的 TD。如果 TD 跨越 TRB 环段边界,则它可能包含一个或多个 Link TRBs 。
设置 TRB 完成中断 (IOC,Interrupt on Completion) 标志允许 TRB 完成后生成事件。可以在第 4.11.7.1 节中标识的 TD 的 TRB 中设置 IOC 标志。
注意:“Transfer TRB” 是第 6.4.1 节中定义的 TRB。链接(Link)和事件数据(Event Data) TRB 不是 “Transfer TRB” 。
Transfer TRB 之 Normal TRB :


在 IN 端点上,如果设备类允许设备提供的数据少于主机提供的缓冲区空间,则软件在形成 TD 时有两种选择。
在 TD 的所有 TRB 中设置短数据包中断 (ISP,Interrupt-on Short Packet) 标志,并在最后一个 TRB 中设置 IOC 标志。如果在执行 TD 中的任何 TRB 时检测到短数据包条件,则此操作将导致 xHC 生成传输事件(Transfer Event),或者如果设备完全填满缓冲区,则生成传输事件(Transfer Event)。
要确定实际传输的字节数,软件应将所有 TRB 的 TRB Transfer Length 字段相加,直至生成 Transfer Event 的 TRB,并减去 Transfer Event TRB Transfer Length 字段。使用设置了 IOC 标志的 Event Data TRB 终止 TD,并且不要在 TD 的任何传输 TRB 中设置 ISP 或 IOC 标志。如果在执行 TD 中的任何 TRB 时检测到短数据包(Short Packet)条件或设备完全填满缓冲区,此操作将导致 xHC 生成 Event Data Transfer Event 。
Event Data Transfer Event 的 TRB Transfer Length 字段标识从 TD 开头或自上次 Event Data Transfer Event 以来实际传输的字节数。 Event Data Transfer Event 的 TRB 传输长度字段最多可定义 16,777,215 字节的传输。
一个 TD 内可以定义多个 Event Data TRB 。
如果在 TD 内定义了 Event Data TRB ,则不应在 TD 的任何传输 TRB 中设置 IOC 或 ISP 标志。也就是说,使用 Event Data Transfer Events 和正常 Transfer Events 来报告 TD 完成是互斥的。
注意:软件可以在 TD 后立即插入 Event Data TD,以提供与前一个 TD 相关的其他信息。Event Data TD 是仅由一个 Event Data TRB 组成的 TD。
如果在 TD 的一个 TRB 中设置了 IDT 标志,则它应是 TD 的唯一传输 TRB。事件数据 TRB 可以包含在 TD 中。
软件应在 TD 的所有 TRB 中指定相同的 Interrupter Target 。如果在 TRB 中定义了无效的 Interrupter Target,则如果 TRB 生成传输事件(Transfer Event),则 xHC 的行为未定义。如果支持虚拟化,xHC 实现应确保此 “未定义行为” 不会影响其他功能(PF0 或 VFx)。
Transfer TRB TD Size 字段应在定义它的所有 Transfer TRB 中有效。请参阅第 4.11.2.4 节。
软件不得在 multi-TRB TD 中定义无操作传输 TRB (No Op Transfer TRB),也就是说,软件不得将无操作 TRB 的链位(Chain bit)设置为 “1” ,并且无操作 TRB 前面的 TRB 也必须设置为 “0” 。
软件不得将 Link TRB 定义为 multi-TRB TD 的第一个 TRB。
软件不得将 Link TRB 定义为 multi-TRB TD 的最后一个 TRB。
一个或多个 Link TDs 可能位于 TD 之前或之后。Link TDs 是仅由一个 Link TRB 组成的 TD。
软件不得在 TD 中定义连续的 Link TRB ,也就是说,软件不得将连续的 Link TRB 的链位(Chain bit)设置为 “1” 。
如果不满足本节中定义的要求,则可能会出现未定义的 xHC 行为。
注意:除了报告错误或 TD 完成之外,软件还可以使用事件定期更新出队指针的值,以指示传输环段(Transfer Ring Segment)边界的交叉,以便它可以添加或删除段等,因此 xHC 每次遇到等于 “1” 的 IOC 标志时都会生成一个事件,而不管可能强制用于未设置 IOC 标志的 TD 中较早 TRB 的任何错误事件。
例如,软件可以定期在大型 TD 的 TRB 中设置 IOC 标志,以便它可以更新其出队指针并重新使用 xHC 已使用的 TRB(而不必扩展传输环)。除非遇到错误,否则所有中间事件都应报告成功。如果 TD 生成的任何事件报告错误,则该完成代码将覆盖与 TD 关联的其他 TRB 可能已断言的任何成功完成代码,无论它们是在错误事件之前还是之后。
注意:软件不得将错误事件解释为表明与其关联的 TD 已 “完成”(即,xHC 已放弃 TD 的所有 TRB 的所有权),除非错误传输事件的 TRB 指针字段引用 TD 的最后一个 TRB。
4.11.7.1 TD 片段(TD Fragments)
xHCI 架构允许 TRB 引用任意长度的缓冲区;但是,硬件在处理常规大小的缓冲区(例如,最大数据包大小或最大突发大小)时工作效率最高。此外,为传输环定义的事件生成机制非常灵活,但是必须施加约束以确保硬件门数和验证要求在 xHC 实现中最小化。TD 片段需要软件以允许 xHC 硬件优化其内部缓冲区管理和操作的方式组织 TD 的 TRB。
TD 片段旨在:
- 通过确保当软件将 TRB 添加到传输环时,以突发友好单元进行添加,最大限度地提高 xHC 的突发机会。
- 通过限制 TD 中可以设置 IOC 标志的频率和位置来简化事件生成。
最大突发有效负载 (MBP,Max Burst Payload) 是最大突发移动的字节数,即 ( M a x B u r s t S i z e + 1 ) ∗ M a x P a c k e t S i z e (Max Burst Size + 1) * Max Packet Size (MaxBurstSize+1)∗MaxPacketSize 字节。
TD 由一个或多个 TD 片段(TD Fragments)组成。如果 TD 传输大小是 MBP 的偶数倍,则所有 TD 片段都应定义 MBP 数据字节的精确倍数。如果不是,则唯一的最后一个 TD 片段应定义少于 MBP 数据(或残余)字节。
每个 TD 片段由一个或多个 TRB 组成。TD 片段的第一个 TRB 最后写入,确保 TD 片段的所有其他 TRB 都是完整的并引用主机内存中的有效缓冲区。
TD 片段需要软件将 TD 构建为连续的 TRB 组。如果 TD 传输大小大于 MBP,则 TD 由 1 个或多个 TD 片段组成。
TD 片段可以引用超过 MBP 字节;如果它是 TD 的最后一个或唯一的 TD 片段,或者如果它引用了 MBP 字节的整数倍。
TD 片段可以引用少于 MBP 字节,如果它是 TD 的最后一个或唯一的 TD 片段。
软件可以构建单个 TD 片段,该片段是 MPB 字节的整数倍,或者定义一个完整的 TD。
- TD 片段的第一个 TRB 应始终是传输 TRB。
- TD 片段不应跨越传输环段。
- TD 中的链路 TRB 放置应遵循本节和第 4.11.7 节中描述的规则。
- TD 片段中的事件数据 TRB 放置应遵循本节以及第 4.11.5.2 节和第 4.11.7 节中描述的规则。
- TD 中的 TRB 数据包边界紧接在传输 TRB 之前,其中传输 TRB 引用的缓冲区的第一个字节也是 USB 数据包的第一个字节。
- TD 片段的第一个 TRB 应为 TD 的第一个 TRB 或紧跟在 TRB 数据包边界之后。
- TD 片段的最后一个 TRB 紧接在 TRB 数据包边界之前或为 TD 的最后一个 TRB。IOC 标志只能在 TD 片段的一个 TRB 中设置,条件如下:
- IOC 标志可以在紧接在 TRB 数据包边界之前的传输 TRB 或 TD 片段的最后一个传输 TRB 中设置。
- IOC 标志可以在位于形成 TRB 数据包边界的两个传输 TRB 之间或位于 TD 的最后一个传输 TRB 之后的非传输 TRB(例如,链接 TRB、事件数据 TRB 等)中设置。

图 4-16 的示例说明了由两个 TD 片段组成的 TD 。TD 片段 1 以边界结束,该边界也是最大数据包大小字节的倍数,而 TD 片段 2 以 TD 的末尾结束。两个 TD 片段都以 TRB 数据包边界(红线)结束。每个 TD Fragment 中都定义了一个额外的 TRB 数据包边界,即 TD Fragment 1 中的 TRB 2 和 3 之间以及 TD Fragment 2 中的 TRB 5 和 6 之间。按照上述规则,IOC 标志只能在 TD Fragment 中设置一次,即在 Transfer TRB 2、Transfer TRB 4 或 TD Fragment 1 的 Link TRB 中,以及在 Transfer TRB 5、Transfer TRB 7 或 TD Fragment 2 的 Event Data TRB 中。IOC 标志不能在 Transfer TRB 1、3 或 6 中设置,因为它们不紧接在 TRB 数据包边界之前。
上述 TD Fragment 规则还确保 TD Fragment 的最后一个 Transfer TRB 应描述以最大数据包大小边界(Transfer TRB 4)结束或终止 TD(Transfer TRB 7)的数据缓冲区。

示例 1 说明了将为最大数据包大小 = 1KB 且最大突发大小为 16 个数据包的端点生成的 TD 片段。第一个 TD 片段描述 MBP(16K)字节的缓冲区空间。第二个 TD 片段描述 TD 的 TD 片段残余,或 15K 字节的缓冲区空间。请注意,两个 TRB(5 和 6)用于在 MBP 边界上分割第 5 个物理内存页。
示例 2 说明了单个 TD 片段完全描述 TD 或 31K 字节的缓冲区空间的情况。在这种情况下,当写入 TRB 1 时,TD 已完全形成,并且 xHC 将根据端点生成最大突发大小事务。
示例 3 和 4 说明了可能为最大数据包大小 = 1KB 且最大突发大小为 8 个数据包的端点生成的 TD 片段。示例 3 中的前三个 TD 片段分别描述 MBP (8K) 字节的缓冲区空间,最后一个 TD 片段描述 TD 的残差,即 7K 字节的缓冲区空间。在示例 4 中,软件决定使用 TD 片段 2 来描述 2 x MBP 字节的缓冲区空间。
4.12 流(Streams)
Streams 扩展了 SS 批量 USB 端点可以访问的传输环的数量。标准端点定义单个 Transfer Ring。流允许单个端点使用线性流数组或主/次流数组定义最多 65533 个传输环。
流允许批量管道的数据流在与端点关联的多个传输环之间进行多路复用。USB 设备随时确定哪个流处于活动状态,即使用哪个流上下文传输环来移动数据。
支持流的端点上下文的 TR 出队指针字段指向流上下文数据结构数组,称为流上下文数组或流数组。使用流 ID 选择流(即流上下文),其中流 ID 用于索引流数组。
流上下文数据结构还包含 TR 出队指针字段,该字段指向与流关联的传输环。
xHC 和 SS USB 设备之间维护的流协议允许设备建立端点的当前流 (CStream) 并控制该流的数据移动。设备可以随时终止流数据传输并切换到另一个流。在端点转换为已停止、已暂停或错误状态之前,xHC 应确保流上下文 TR 出队指针、DCS 和(如果 SEC =“1”)已停止 EDTLA40 字段反映在端点处于运行状态时进入移动数据状态的任何流的前进进度,例如,当流退出移动数据状态(例如,在流切换之后或由于错误)时,或在端点进入已停止、已暂停或错误状态之前,流上下文字段将使用 CStream 状态进行更新。有关停止端点命令后的流上下文状态要求的更多信息,请参阅第 3.3.8 节。
由于与端点关联的所有流共享同一个批量管道,因此如果当前流导致管道停滞,则与管道关联的所有流也会停滞。在流协议中,有些情况下可能会发生停滞,并且没有可直接归因的 TRB 可供报告错误的传输事件 TRB 引用(例如,由于发送 Prime Pipe 事务)。在这种情况下,应使用 Slot Context Interrupter Target 字段来生成事件,并且传输事件的 TRB Pointer 和 TRB Transfer Length 字段应设置为“0”。请参阅第 4.17.4 节。
流上下文可以是“活动的”或“非活动的”。非活动的流上下文应由空的传输环标识,或者通过带外(设备类)定义的机制,软件知道 USB 设备不会选择流上下文作为当前流(CStream)。活动的流上下文不符合上述非活动流上下文的标准。可靠地确定流上下文是否处于活动状态是设备类的责任。没有 xHCI 定义的方法。
例如,在软件按响门铃(其 DB 流 ID 等于流上下文的流 ID)后,UASP 数据流上下文变为活动状态(即,设备可随时选择并成为当前流)。当与流上下文相关的 UASP 命令完成时,或者在 UASP 设备成功完成流上下文的中止任务命令后,流上下文将变为非活动状态(即,不得被设备选为当前流)。
4.12.1 xHCI 流协议(xHCI Stream Protocol)
USB 流协议遵循标准 SS 批量协议的语义,因此支持流的 SS 批量管道上的数据包交换类似于不支持流的 SS 批量管道。Stream Protocol 通过操作数据包报头 Stream ID 字段进行严格管理。

4.12.1.1 主机发起的数据迁移(Host Initiated Data Move)
4.12.2 流 ID 管理(Stream ID Management)
4.12.2.1 流数组边界检查(Stream Array Bounds Checking)
4.12.3 评估下一个 TRB (ENT)
Evaluate Next TRB (ENT) 。
Evaluate Next TRB (ENT) 标志适用于所有传输环,它对流上下文尤为重要。它提供了一种在终止 Stream 时强制执行终止事件数据 TRB (4.11.5.2) 的方法。
4.13 设备通知(Device Notifications)
USB3 规范定义了一个 Device Notification Transaction Packet 。此数据包中的 Notification Type 字段定义了 16 种可能的通知类型。某些通知类型由 xHC 直接处理,而其他通知类型可能会报告给软件。Device Notification Control (DNCTRL) 寄存器允许系统软件单独选择哪些通知对其重要,并应生成 Device Notification Event。有关设备通知事件 TRB 的更多信息,请参阅第 6.4.2.7 节。
4.13.1 容忍延迟消息处理(Latency Tolerance Message Handling)
延迟容差消息传递 (LTM,Latency Tolerance Messaging) 代表了一种新的、更强大的系统技术,用于管理平台上的功耗。当前的平台电源管理策略被迫猜测何时休眠以及休眠多长时间。这些猜测通常会迫使平台以牺牲平台性能(尤其是连接设备的性能)为代价来牺牲节能。LTM 为连接的设备添加了提供信息的功能,这些信息可以提高主机平台选择休眠时间和时间的能力。这是通过连接的设备通知主机其可接受的访问之间的服务延迟、设备的延迟容忍度来实现的。
4.13.2 功能唤醒(Function Wake)
USB3 设备发送 FUNCTION_WAKE 设备通知事务包,以通知主机 “函数远程唤醒”。软件应在 DNCTRL 寄存器中设置标志 N1,以便在收到设备通知时生成设备通知事件 FUNCTION_WAKE 以便于此启用。
本文链接为:http://www.usbzh.com/article/detail-1693.html ,欢迎转载,转载请附上本文链接。
XHCI 1.2b 规范





