【USB协议相关】xHCI1.1协议学习笔记(1)——数据结构

本文详细介绍了xHCI1.1协议中的关键数据结构,包括Device Context Base Address Array、Device Context、Slot Context、Endpoint Context、 Rings、Transfer Request Block(TRB)、出入队指针、Transfer Descriptor(TD)、Doorbell Array以及端点的相关概念和功能,为理解USB协议提供了深入的学习笔记。

eXtensible Host Controller Interface 1.1 for Universal Serial Bus协议学习笔记

(November 2017 Revision 1.1)

1.Device Context Base Address Array设备上下文基地址数组

最多支持255个USB设备或集线器,其中阵列中的每个元素都是指向设备上下文数据结构的指针。

设备上下文基地址阵列(DCBAA)为xHC提供了基于Slot ID的查找表,用于访问与每个插槽关联的设备上下文数据结构。该数据结构由指向设备上下文数据结构的指针数组组成。当检测到设备连接时:系统软件会初始化设备上下文数据结构,从xHC请求Slot ID,然后在Slot ID指示的位置将指向新创建的设备上下文的指针插入DCBAA。

2.Device Context设备上下文

设备上下文数据结构由xHC管理,用于向系统软件报告设备配置和状态信息。设备上下文数据结构由32个数据结构的数组组成。第一个上下文数据结构(索引=“0”)是Slot Context数据结构。其余上下文数据结构是“端点上下文”数据结构

在枚举USB设备的过程中,系统软件会在主机内存中为该设备分配设备上下文数据结构,并将其初始化为“0”。然后,使用地址设备命令将数据结构的所有权传递给xHC。xHC保留对设备上下文的所有权,直到使用“禁用插槽命令”禁用了设备插槽为止。设备上下文数据结构由xHC拥有时,应被系统软件视为只读。

3.Slot Context插槽上下文

这个比较抽象,Slot主要是有关 包含与整个设备有关的信息,或影响USB设备的所有端点的信息Slot Context提供的信息包括控制,状态,寻址和电源管理

  • 作为设备上下文成员,xHC使用插槽上下文数据结构将设备参数的当前值报告给系统软件。
  • xHC报告的插槽状态标识设备的当前状态,并与USB规范中描述的USB设备状态紧密对应。
  • 设备上下文的Slot Context数据结构也称为“Output Slot Context”。 作为输入上下文成员,系统软件使用Slot
  • Context数据结构将命令参数传递给主机控制器。 输入上下文的Slot Context数据结构也称为“Input Slot Context”。
  • 如果针对设备插槽的命令成功执行,则xHC将在生成Command Completion Event 之前更新输出插槽上下文,以反映其正在主动使用的参数值来管理设备。
  • 插槽上下文的xHCI保留区域可用作xHC实现定义的暂存器。
  • 插槽上下文中的所有保留字段仅供xHC使用,除非插槽处于“禁用”状态,否则不得由系统软件修改。

4.Endpoint Context端点上下文

端点上下文数据结构定义特定USB端点的配置和状态。该数据结构被定义为设备上下文和输入上下文数据结构的成员。

  • 端点上下文的大多数字段包含与端点相关的类型控制状态带宽信息,这些信息与设备报告的与端点相关的关联描述符中的信息相对应。

  • 端点上下文还定义了TR出队指针字段,该字段通常提供指向与通道关联的 Transfer Ring的指针。

  • USB3批量(Bulk)端点有一种特殊情况,其中Stream可能与端点关联。

  • Stream允许设备在 Transfer Ring 之间多路复用端点的数据流

  • 大多数设备仅声明少量端点,这意味着设备上下文或输入上下文中的许多端点上下文数据结构可能未使用。

  • 作为设备上下文成员,xHC使用端点上下文数据结构将端点相关参数的当前值报告给系统软件。

  • 在本文档中,设备上下文的端点上下文数据结构也称为“输出端点上下文”。

  • 如果引用输入上下文的命令成功执行,则xHC将更新输出端点上下文,以反映在生成Command Completion Event 之前它正在主动用于管理端点的参数值。

  • 端点上下文的xHCI保留区域可用作xHC实现定义的暂存器。

  • 流上下文数组用于定义支持流的USB3端点的 Transfer Ring。流上下文数组由流上下文数据结构组成。主要的流上下文数组中的流上下文数据结构的数量及其位置由父端点上下文中的字段定义。
    流上下文数据结构示意图
    在上图示例中,为了访问特定的Stream Context,xHCI将Stream ID分为两个子字段; 主流ID(Primary Stream ID, PSID)和辅助流ID(SSID)。主流ID用作主流阵列的索引。如果次要流ID等于“0”,则主要流数组中的流上下文应包含一个指向 Transfer Ring的指针(例如,主要流上下文1或15,SCT =“1”)。如果次要流ID不为零,则主要流阵列中的流上下文应包含一个指向次要流阵列的指针(例如,主要流上下文0或2,SCT =‘3’),并且次要流ID为 用作次要流数组的索引。另请注意,辅助流上下文数组0(SSID = 0,PSID = 0)中的第0个元素并不指向 Transfer Ring,因为它保留了流ID 0,但是辅助流上下文数组2中的第0个元素确实指向了环。Transfer Ring,因为它表示流ID 2(SSID = 0,PSID = 2)。
    PSID和SSID子字段之间的边界由端点上下文的MaxPStreams字段定义。PSID位于流ID的低位,而SSID位于高位。
    所有声明流的端点都应初始化为指向主流数组。辅助流数组可以在初始化或运行时定义。
    软件应将流ID的分配与端点的主要/次要流阵列布局相协调。请注意,在图4-20的示例中,主流上下文数组中的流上下文0和2指向辅助流上下文数组。为了访问由主流上下文0引用的辅助流数组中的流上下文,软件应将主流ID设置为0,并将辅助流ID设置为辅助流上下文的索引。请注意,流ID值“0”(即PSID和SSID =“0”)是USB3规范保留的,并且绝不应该由声明流端点的设备提供给xHC。因此,在图4-20的示例中,辅助流上下文数组0中的流上下文0被保留,并且不得由xHC访问。
    注意:
    如果启用了次要流阵列,则主要流上下文阵列的流上下文0将始终引用次要流阵列(即SCT>“1”)。SCT值“0”或“1”可能会导致行为不确定。

MaxPStreams的值通知xHC主流阵列的大小。如果启用了次要流,则主要流阵列的最大大小为256个条目(MaxPStreams =“7”)。每个流上下文中的流上下文类型(SCT)字段标识主流阵列中的上下文指向 Transfer Ring 还是辅助流阵列。SCT字段还标识辅助流阵列中的条目数。这种灵活的机制必须由软件仔细管理,以确保其生成的SID不会导致xHC引用超出范围的辅助流上下文。
xHC实现所支持的最大大小的主流阵列由HCCPARAMS1寄存器中的MaxPSASize字段定义。

5.Input Context 输入上下文

系统软件使用输入上下文数据结构来定义设备配置和状态信息,这些信息将由地址设备,配置端点或评估上下文命令传递给xHC。它由一个输入控制上下文数据结构,一个Slot Context端点上下文数据结构组成。
输入控制上下文数据结构确定该命令会影响其余的哪些上下文。命令完成后,软件可以重新使用或释放输入上下文数据结构。
在整个文档中,输入上下文中包含的插槽上下文或端点上下文也称为“输入”插槽或端点上下文。

6.Rings

概念

Ring是数据结构的循环队列。——>TRB(传输请求块)Ring定义了一个队列,该队列用于在生产者(Producer)实体和消费者(Consumer)实体之间传输工作项目

  • TRB Ring的大小取决于组成该环的段的数量和大小。

作用:

  • 系统软件使用Ring来向xHC发出命令。
  • 所有环类型都采用相同的基本机制在xHC和主机内存之间传输信息

注意:

  • TRB Ring可能大于page,但是它们不得越过64K字节边界。
  • 由于主机控制器可支持255个USB设备每个设备最多可以声明31个端点,31个端点中的30个可以声明多达64K个流,这意味着单个xHC可能存在大约500M个 Transfer Ring。
Ring的分类

xHC使用三种类型的环来通信和执行USB操作:

  • Command Ring
    用于xHC的一种循环队列,使系统软件能够发出命令以枚举USB设备,配置xHC以支持这些设备以及协调虚拟化功能。
  • Event Ring
    每个中断器的一种循环队列,为xHC提供了一种向系统软件报告的方式:数据传输和命令完成状态,根集线器端口状态更改以及其他与xHC相关的事件。(或者说:xHC使用事件环返回状态和命令结果,并将其传输到系统软件。)
  • Transfer Ring
    每个端点或流的一种命令循环队列,提供了与USB设备之间的数据传输。

7.Transfer Request Block(TRB)

概念

传输请求块(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。
    在这里插入图片描述
    上图说明了具有多个挂起TD的传输TRB环。入队指针标识系统软件可用的下一个TRB位置,用于安排到Transfer Descriptor的工作(TD)。出队指针标识xHC将执行的Transfer Ring中的下一个TRB。Transfer TRB完成后,可以选择在Transfer Event TRB中报告传输的长度和状态。

8.出入队指针

概念

入队指针和出队指针是用于指代TRB Ring中有效条目的逻辑开头和结尾的术语。
xHC拥有出队指针和入队指针之间的TRB

入队指针:

  • 是生产者可用的Ring中下一个TRB的地址。生产者在此位置从TRB开始构造新的工作项,并在构造完成时推进入队指针。
  • 入队指针标识软件可用于排队TD的下一个TRB位置的地址。

出队指针

  • 是消费者要服务的下一个TRB的地址。
    . 出队指针标识xHC要执行的下一个TRB的地址。
规则
  1. 入队和出队指针始终从其初始值指向的TRB条目开始前进。
  2. 如果出队指针等于入队指针,则TRB Ring为空。
  3. 如果“入队指针+1”=出队指针,则振铃已满。请注意,“入队指针+1”值的计算需要理解链接TRB。
  4. 入队指针-1和出队指针之间的TRB由工作项的使用者拥有。环中的所有其他TRB由工作项的生产者拥有。当生产者提前入队指针时,TRB所有权将传递给消费者。消费者提前出队指针时,TRB所有权将传递给生产者。
生产者/消费者(Producer/Consumer)

生产者(Producer)
一般管理入队指针。生产者维护一个“生产者循环状态”(PCS)标志,该标志标识它应写入TRB Cycle bit的值。
消费者(Consumer)
一般管理出队指针。消费者维护一个消费者循环状态(CCS)标志,将其与它所获取的TRB中的Cycle bit进行比较。

  • 如果CCS标志等于TRB Cycle bit的值,则消费者拥有出队指针指向的TRB并可以对其进行处理。
  • 如果它们不相等,则消费者应停止处理TRB,并等待更多工作的通知。

规则

  • **消费者应按顺序执行TRB,**从出队指针引用的TRB开始。
  • 消费者或生产者可以随时以任何顺序修改其拥有的任何TRB。
  • 出队指针和入队指针-1之间的所有TRB均归消费者所有,生产者不得对其进行修改。即生产者不得修改消费者所拥有的TRB消费者也绝不能修改生产者所拥有的TRB
  • 如果Ring为空(出队指针=入队指针),则消费者不拥有任何TRB。
  • 消费者所不拥有的Ring中的任何TRB均归生产者所有。

9.Transfer Descriptor(TD)

概念

TRB中的链标志用于标识组成TD的TRB。因此,TD指的是Transfer Ring上连续的TRB数据结构集(其中在TD的最后一个TRB之外的所有TRB中都设置了Chain标志)。

注意:
Command和Event TRB不支持链位(CH),因此所有命令描述符(CD)和事件描述符(ED)仅包含一个TRB。

组成:
  1. TD包含一个或者多个Transfer Request Blocks (TRBs):
  • 对于小型单缓冲区操作,TD将由单个TRB组成。
  • 对于大型的多缓冲区操作(例如分散/聚集),TRB可以链接形成一个复杂的TD。
  1. Transfer Ring 支持由1个或多个TRB组成的传输描述符(TD)
  • 除TD的最后一个TRB外,所有TRB链(C)位置1。
规则:
  • 传输描述符通过驻留在主机内存中的传输环进行管理。、
  • 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引用的缓冲区的状态,但是可能会有例外。

10.Doorbell Array

概念
  • xHCI提供了256个32位门铃寄存器的数组,位于MMIO空间中,并通过设备Slot ID进行索引。
  • 最多256个门铃寄存器的阵列,最多支持255个USB设备或集线器。
作用
  • 每个门铃寄存器Doorbell Register为系统软件提供了一种机制,用于通知xHC是否要执行与插槽或端点相关的工作。
  • 系统软件通过门铃寄存器中的“ DB Target”字段将写入一个值,该值标识“敲响”门铃的原因。
特征
  • 门铃寄存器0分配给主机控制器以进行命令环管理。
    • 此寄存器,DB Target字段只有一个有效值,即0(主机控制器命令)
  • 门铃寄存器1-255称为设备上下文门铃寄存器。
    • 设备上下文门铃寄存器与设备插槽之间存在1:1映射。
    • 系统软件在与各自的设备插槽关联的Transfer Ring(端点/流)上插入工作后,会响起设备上下文门铃。

11.端点

概念
  • 端点实际上是设备硬件上具有一定大小的数据缓冲区,是由设备地址和端点号给出的。
  • 默认端点零用作控制传输的端点,其他端点必须在设备被主机配置之后才能使用,除了端点0是双向数据传输之外,其他端点只能在一个方向传输数据,或者从主机到设备及out端点,或者从设备到主机即in端点。
  • USB设备最多支持31个端点(EP):例如15 IN,15 OUT和1 Control。
  • 默认控制EP(0)是为所有USB设备定义的双向EP。

端点上下文寻址示意图

  • USB端点描述符定义的端点地址最多允许31个值,其中4位端点号与一个方向位组合在一起
  • xHCI通过使用“端点号”选择16个“端点上下文”数据结构对之一和“方向”位选择一对的IN或OUT端点上下文来使该组织并行化

注意
处于“已停止”状态的端点不得生成“Transfer Event”

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值