1.数据结构
在 USB 3.0 及更高版本的 xHCI 协议中,“Rings”、“Transfer Request Block (TRB)” 和 “Transfer Descriptor (TD)” 是用于管理 USB 数据传输和事件的重要概念。
1.1.Rings
Rings是指一种数据结构,用于组织和管理 USB 数据传输和事件。在 xHCI 协议中,存在多个Rings,每个 Ring 用于特定类型的数据传输或事件。
Ring是数据结构的循环队列。——>TRB Ring定义了一个队列,该队列用于在生产者(Producer)实体和消费者(Consumer)实体之间传输工作项目。
注意:
TRB Ring可能大于page,但是它们不得越过64K字节边界。
由于主机控制器可支持255个USB设备,每个设备最多可以声明31个端点,31个端点中的30个可以声明多达64K个流,这意味着单个xHC可能存在大约500M个 Transfer Ring。
1.1.1命令环(Command Ring)
用于xHC(eXtensible Host Controller,可扩展主机控制器)的一种循环队列,使系统软件能够发出命令以枚举USB设备,配置xHC以支持这些设备以及协调虚拟化功能。
备注:host模式下才有命令环概念???——xhci1.1标准里仅定义了host模式下的控制器实现标准,device模式下的控制器则由厂商自定义实现。
1.1.2.传输环(Transfer Ring)
每个端点或流的一种命令循环队列,提供了与USB设备之间的数据传输。
1.1.3.事件环(Event Ring)
每个中断器的一种循环队列,为xHC提供了一种向系统软件报告的方式:数据传输和命令完成状态,根集线器端口状态更改以及其他与xHC相关的事件。(或者说:xHC使用事件环返回状态和命令结果,并将其传输到系统软件。)
Transfer Request Block (TRB)
1.2.Transfer Request Block (TRB)
Transfer Request Block(TRB)是描述 USB 数据传输或事件的数据结构。TRB 包含了传输或事件的各种参数、状态和控制信息,如端点地址、数据缓冲区、传输长度、传输类型、方向等。TRB 是用于与 xHCI 控制器进行通信的重要数据结构。
传输请求块(TRB)是一种通过软件在内存中构造的数据结构,其主要用于在主机内存和xHC之间传输单个物理上连续的数据块。
每个TRB包含单个数据缓冲区指针,缓冲区的大小以及一些其他控制信息。
TRB数据结构的小尺寸允许在4K段(内存页)中最多定义256个单独的缓冲区。
所有TRB数据结构的大小应为16个字节。
TRB的“数据缓冲区指针”字段为数据寻址提供了字节粒度。TRB的“数据缓冲区指针”字段为数据寻址提供了字节粒度。
“Length”字段可以包含的最大值是64K。传输“长度”字节后,xHC将自动访问环中的下一个TRB。系统软件有责任确保“长度”字段与可能遇到的任何页面交叉都一致。
TRB中的“控制字”应包含一个TRB类型字段,并且可以包含以下一个或多个字段:链(CH),完成中断(IOC),立即数据(IDT),无监听(NS),中断 短数据包(ISP),启动Isoch ASAP(SIA)和帧ID。
1.2.1.TRB类型
EP允许的TRB类型:
Transfer Descriptor Type允许的TRB类型:
1.2.1.1.Transfer TRB
1.2.1.1.1.Normal TRB
Normal TRB用于块/控制(数据阶段)/中断端点传输。
1.2.1.1.2.Control TRBs
1.2.1.1.2.1.Setup Stage TRB
1.2.1.1.2.2.Date Stage TRB
1.2.1.1.2.3.Status Stage TRB
1.2.1.1.3.Isoch TRB
1.2.1.1.4.No Op TRB
1.2.1.2.Event TRBs
1.2.1.2.1.Transfer Event TRB
1.2.1.2.2.Command Completion Event TRB
1.2.1.2.3.Port Status Change Event TRB
1.2.1.2.4.Bandwidth Request Event TRB
1.2.1.2.5.Doorbell Event TRB
1.2.1.2.6.Host Controller Event TRB
1.2.1.2.7.Device Notification Event TRB
1.2.1.2.8.MFINDEX Wrap Event TRB
1.2.1.3.Command TRBs
1.2.1.3.1.No Op Command TRB
1.2.1.3.2.Enable Slot Command TRB
1.2.1.3.3.Disable Slot Command TRB
1.2.1.3.4.Address Device Command TRB
1.2.1.3.5.Configure Enapoint Command TRB
1.2.1.3.6.Evaluate Context Command TRB
1.2.1.3.7.Reset Endpoint Command TRB
1.2.1.3.8.Stop Endpoint Command TRB
1.2.1.3.9.Set TR Dequeue Pointer Command TRB
1.2.1.3.10.Reset Device Command TRB
1.2.1.3.11.Force Event Command TRB
1.2.1.3.12.Negotiate Bamdwidth Command TRB
1.2.1.3.13.Set Latency Tolerance Value Command TRB
1.2.1.3.14.Get Port Bandwith Command TRB
1.2.1.3.15.Force header Command TRB
1.2.1.3.16.Get Extended Property Command TRB
1.2.1.3.17.Set Extended Property Command TRB
1.2.1.4.Other TRB
1.2.2.2.1.Link TRB
1.2.2.2.2.Event Data TRB
1.3.Transfer Descriptor (TD)
Transfer Descriptor(TD)也是描述 USB 数据传输的数据结构。
TRB中的链标志用于标识组成TD的TRB。
因此,TD指的是Transfer Ring上连续的TRB数据结构集(其中在TD的最后一个TRB之外的所有TRB中都设置了Chain标志)。
注意:
Command和Event TRB不支持链位(CH),因此所有命令描述符(CD)和事件描述符(ED)仅包含一个TRB。
传输描述符通过驻留在主机内存中的传输环进行管理。
TD中的Normal,Data Stage或Isoch TRB指向的任何缓冲区的大小可以在0到64K字节之间。
如果在处理含有多个TRB 的TD时检测到错误,则xHC应为TRB生成一个Transfer Event,并使用适当的错误条件代码检测到该错误,然后才可以前进到下一个TD。
如果在前进到下一个TD的过程中遇到了带有其IOC标志的传输TRB,则为该传输TRB生成的 Transfer Event 的条件代码应为“成功”,因为与该TRB实际无关的错误生成了事件。但是,xHC实现可能会多余地声明原始错误条件代码。
通常,Transfer Event的完成代码代表生成它的传输TRB引用的缓冲区的状态,但是可能会有例外。