一、DCBAAP(设备上下文及地址数组指针 寄存器):
xhci里面的Operational 寄存器组里面的设备上下文基地址数组指针寄存器(Device Context Base Address Array Pointer Register,DCBAAP),用于保存设备上下文基地址数组(DCBAA)的指针(也就是这个数组的首地址)。
P418
二、DCBAA(设备上下文基地址数组,内存数据结构):
DCBAA和xHCI的设备槽相关联(Device Slot),也就是一个Slot对应DCBAA里面的一个条目,可以通过Slot ID来索引对应的设备上下文(Device Context)数据结构,也就是可以将DCBAA看为是一个查找表。在初始化xHCI时每个条目都会初始化为0。注意DCBAA的首个条目(Slot ID=0)是被xHCI的暂存机制(xHCI Scratchpad Mechanism)使用的。
并且设备上下文基地址数组的首地址,在xHCI被设置为“run”模式(也就是USBCMD寄存器的R/S bit位置1)之前,应该被写入到DCBAAP寄存器中,同时Scratchpad Buffer Array的首地址也要在此之前放入到设备上下文及地址数组的第0个条目。如下图xHCI协议中所示。
每个slot又会对应一个Doorbell寄存器,软件可以通过写对应的寄存器,来告知xHCI使用对应slot,所对应的设备上下文。
当使用某个slot,也即是enable某个slot后,需要构造对应的设备上下文数据结构,然后将其首地址放入DCBAA数组里面对应的条目中。
三、DC(设备上下文数据结构,内存数据结构)
设备上下文数据结构(Device Context data structure)被xHC管理并用来向系统软件报告设备配置和状态信息。 设备上下文数据结构由32个数据结构的数组组成。 第一个上下文数据结构(索引=“ 0”)是Slot上下文数据结构(6.2.2)。 其余上下文数据结构(索引1-31)是端点上下文数据结构(6.2.3)。
作为枚举USB设备的一部分,系统软件分配一个设备上下文数据结构给在Host内存中的设备并且将它初始化为“0”。数据结构的归属权就传给了xHC通过一个地址设备命令(Address Device Command)。xHC保持着设备上下文信息的归属权直到设备slot因为Disable Slot命令不能使用。
设备上下文数据结构由xHC拥有时,应被系统软件视为只读。
DCBAA里面的每个条目存放的是一个设备上下文数据结构的地址(首地址,因为设备上下文也是一个数组),设备上下文的数据结构如下图所示:
如图所示,设备上下文数据结构,也相当于是一个数组,这里面一共有32个条目,第0个条目是槽上下文(Slot Context),第一个条目是端点0对应的端点上下文(Endpoint Context)(也就是Default Control endpoint,每个USB设备都会有这样一个默认端点,用来最初配置设备,该端点是支持双向的)。
3.1 槽上下文(Slot Context)的结构如下:
槽上下文包含与整个设备相关的信息,或影响一个USB设备的所有端点。这个数据结构作为设备上下文的成员(也作为Input Context的成员,这里我们只讲作为设备上下文的成员)。槽上下文数据结构提供的信息包括:控制(Control),状态(State),寻址(Addressing),和功耗管理(Power Management)。xHC使用Slot State来标识当前设备的状态并映射到USB协议中描述的USB 设备的状态(如下图)。
xHC分配的USB设备地址,可以被开发者使用总线分析仪来跟踪设备相关的USB活动。Route String被hubs用来路由Packets到下游端口,即定位Super Speed Packet的目标。Route Srting的形式在USB3协议规范的8.9节有介绍。Speed, TT Port Number和TT Hub Slot ID允许xHC执行address连接到高速hub后面的低速(low)和全速(full)设备时所必须的拆分事务(Split Transactions)。功耗管理信息包括Max Exit Latency,被xHC用于总线上等时包(Isoch packets)的调度。
3.2 端点上下文(Endpoint Context)数据结构如下:
端点上下文数据结构定义一个具体USB端点(Endpoint)的配置(Configuration)和状态(State),这个数据结构作为设备上下文的成员(也作为Input Context的成员,这里我们只讲作为设备上下文的成员)。端点上下文数据结构被xHC用来向系统软件报告端点相关的参数值。
大多数端点上下文(Endpoint Context)包含端点相关的类型(Type),状态(State),带宽(Bandwidth)的信息,这些信息对应着设备报告的相关的端点描述符中的信息。在端点描述符中,也定义了TR Dequeue Pointer字段,这个指针指向与Pipe相关联的Transfer Ring。对于USB3的Bulk端点有一个特殊的情况,因为USB3的Bulk Pipe支持Streams,所以TR Dequeue Pointer也可能指向一个Stream Context Array。
注意设备上下文提供USB设备所能声明的31个端点的设备上下文。但是大多数设备只有声明少部分的端点,也就说设备上下文中大部分端点上下文是没有被使用的。
端点上下文也包含一些和Debug与Pip相关的Transfer操作的字段。Error Counter(CErr)字段可以用来强制对USB事务的无限制的Retry。
3.2.1 Stream Context Array
流山下文数组被用来定义USB3中支持Streams的端点的Transfer Ring。一个流上下文数组(Stream Context Array)由流上下文数据结构组成(Streams Context Data Structures)。在一个主流上下文数组(Primary Streams Context Array)中,其流上下文数据结构(Streams Context Data Structures)数量和其位置,都是被定义在其父端点上下文数据结构中(Parent Endpoint Context)。
3.2.1.1 Stream Context
Stream上下文数据结构提供了一个指针,该指针指向流的Transfer Ring,并向xHC提供一些不透明(Opaque)(暂存,Scratchpad)的空间。