赞
踩
在 USB 3.0 及更高版本的 xHCI 协议中,“Rings”、“Transfer Request Block (TRB)” 和 “Transfer Descriptor (TD)” 是用于管理 USB 数据传输和事件的重要概念。
Rings是指一种数据结构,用于组织和管理 USB 数据传输和事件。在 xHCI 协议中,存在多个Rings,每个 Ring 用于特定类型的数据传输或事件。
Ring是数据结构的循环队列。——>TRB Ring定义了一个队列,该队列用于在生产者(Producer)实体和消费者(Consumer)实体之间传输工作项目。
注意:
TRB Ring可能大于page,但是它们不得越过64K字节边界。
由于主机控制器可支持255个USB设备,每个设备最多可以声明31个端点,31个端点中的30个可以声明多达64K个流,这意味着单个xHC可能存在大约500M个 Transfer Ring。
用于xHC(eXtensible Host Controller,可扩展主机控制器)的一种循环队列,使系统软件能够发出命令以枚举USB设备,配置xHC以支持这些设备以及协调虚拟化功能。
备注:host模式下才有命令环概念???——xhci1.1标准里仅定义了host模式下的控制器实现标准,device模式下的控制器则由厂商自定义实现。
每个端点或流的一种命令循环队列,提供了与USB设备之间的数据传输。
每个中断器的一种循环队列,为xHC提供了一种向系统软件报告的方式:数据传输和命令完成状态,根集线器端口状态更改以及其他与xHC相关的事件。(或者说:xHC使用事件环返回状态和命令结果,并将其传输到系统软件。)
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。
EP允许的TRB类型:
Transfer Descriptor Type允许的TRB类型:
Normal TRB用于块/控制(数据阶段)/中断端点传输。
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引用的缓冲区的状态,但是可能会有例外。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。