USB3.0接口——(2)数据结构

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)实体之间传输工作项目。

注意: Command和Event TRBs并不支持Chain bit(CH),因此所有的Command Descriptors (CDs)和Event Descriptor (EDs)只有单个TRB构成。

注意: 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以支持这些设备以及协调虚拟化功能。

1.1.1.1.CRCR

在这里插入图片描述
Command Ring Control Register,命令环控制寄存器。
Command Ring为系统软件提供发送命令来枚举USB设备,配置xHCI支持设备,以及协调虚拟化功能的能力。Command Ring由Operational register中的Command Ring Control Register来支持。

1.1.2.传输环(Transfer Ring)

每个端点或流的一种命令循环队列,提供了与USB设备之间的数据传输。
在这里插入图片描述

在这里插入图片描述

1.1.2.1.DCBAAP

在这里插入图片描述

DCBAAP,设备上下文及地址数组指针寄存器。

xhci里面的Operational 寄存器组里面的设备上下文基地址数组指针寄存器(Device Context Base Address Array Pointer Register,DCBAAP),用于保存设备上下文基地址数组(DCBAA)的指针(也就是这个数组的首地址)。

1.1.2.1.1.DCBAA

DCBAA,设备上下文基地址数组,内存数据结构。
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个条目。

设备上下文基地址数组元素0的位定义:
在这里插入图片描述
在这里插入图片描述
Scratchpad缓冲区是系统内存的PAGESIZE块,xHCI用来存储其内部状态。xHCI可以请求0到1024个缓冲区。所需的缓冲区数量在HCSPARAMS1寄存器中给出。每个缓冲区是一个与PAGESIZE边界对齐的PAGESIZE块(Page Size一般是4KByte,整个Scratchpad缓冲区大小为N*4KByte)。Scratchpad缓冲区数组是一个包含Scratchpad缓冲器地址的数组。它的大小等于硬件所需的最大暂存缓冲区的数量。指向此数组基的指针位于设备上下文基地址数组的开头。硬件使用此指针访问访问缓冲区的数组。分配后,系统软件不应干扰Scratchpad缓冲区。在将控制器置于运行状态之前,应分配临时缓冲区。

设备上下文基地址数组元素1~N的位定义:
在这里插入图片描述
在这里插入图片描述
每个slot又会对应一个Doorbell寄存器,软件可以通过写对应的寄存器,来告知xHCI使用对应slot,所对应的设备上下文。
当使用某个slot,也即是enable某个slot后,需要构造对应的设备上下文数据结构,然后将其首地址放入DCBAA数组里面对应的条目中。

1.1.2.1.1.1.DC

在这里插入图片描述
在这里插入图片描述
DC,设备上下文数据结构,内存数据结构。
设备上下文数据结构(Device Context data structure)被xHC管理并用来向系统软件报告设备配置和状态信息。
设备上下文数据结构由32个数据结构的数组组成。 第一个上下文数据结构(索引=“ 0”)是Slot上下文数据结构。 其余上下文数据结构(索引1-31)是端点上下文数据结构。

作为枚举USB设备的一部分,系统软件分配一个设备上下文数据结构给在Host内存中的设备并且将它初始化为“0”。数据结构的归属权就传给了xHC通过一个地址设备命令(Address Device Command)。xHC保持着设备上下文信息的归属权直到设备slot因为Disable Slot命令不能使用。
设备上下文数据结构由xHC拥有时,应被系统软件视为只读。
DCBAA里面的每个条目存放的是一个设备上下文数据结构的首地址(首地址,因为设备上下文也是一个数组)。

1.1.2.1.1.1.1.Slot Context

槽上下文(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)的调度。

7.1.2.1.1.1.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。

1.1.2.1.1.1.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)。

1.1.2.1.1.1.2.1.1.Stream Context

Stream上下文数据结构提供了一个指针,该指针指向流的Transfer Ring,并向xHC提供一些不透明(Opaque)(暂存,Scratchpad)的空间。
在这里插入图片描述
在这里插入图片描述

1.1.2.1.1.1.3.Input Context

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

1.1.2.1.1.1.3.1.Input Control Context

在这里插入图片描述
在这里插入图片描述

1.1.2.2.DBOFF

Doorbell Array Offset,门铃寄存器数组偏移。
在这里插入图片描述

1.1.2.3.DB

Doorbell,门铃寄存器。(一个设备对应一个DB)
偏移地址:由xHC的capability寄存器空间里的DBOFF寄存器来指定。
数组大小:由xHC的capability寄存器空间里的HCSPARAMS1寄存器MAXSLOTS字段定义。

在这里插入图片描述

xHCI提供了256个32位门铃寄存器的数组,位于MMIO空间中,并通过设备Slot ID进行索引。
最多256个门铃寄存器的阵列,最多支持255个USB设备或集线器。
每个门铃寄存器Doorbell Register为系统软件提供了一种机制,用于通知xHC是否要执行与插槽或端点相关的工作。
系统软件通过门铃寄存器中的“ DB Target”字段将写入一个值,该值标识“敲响”门铃的原因。

门铃寄存器0分配给主机控制器以进行命令环管理。
此寄存器,DB Target字段只有一个有效值,即0(主机控制器命令)

门铃寄存器1-255称为设备上下文门铃寄存器。
设备上下文门铃寄存器与设备插槽之间存在1:1映射。
系统软件在与各自的设备插槽关联的Transfer Ring(端点/流)上插入工作后,会响起设备上下文门铃。

1.1.3.事件环(Event Ring)

每个中断器的一种循环队列,为xHC提供了一种向系统软件报告的方式:数据传输和命令完成状态,根集线器端口状态更改以及其他与xHC相关的事件。(或者说:xHC使用事件环返回状态和命令结果,并将其传输到系统软件。)
Transfer Request Block (TRB)

Event Rings为xHCI提供向系统软件报告的方式,报告的内容包括:数据传输和命令完成状态,root hub port状态改变,和其他xHCI相关的事件。一个Event Ring通过Runtime Registers中的Event Ring Segment Table Base Address,Segment Table Size和Dequeue Pointer Registers来定义。

1.1.3.1.RTSOFF

Runtime Register Space Offset Register,运行时间寄存器空间偏移寄存器。

1.1.3.2.IMAN

Interrupt Management Register,中断管理寄存器。

1.1.3.3.ERSTSZ

Event Ring Segment Table Size Register,事件环段表大小寄存器。

1.1.3.4.ERSTBA

Event Ring Segment Table Base Address Register,事件环段表的基地址寄存器

1.1.3.5.ERDP

Event Ring Dequeue Pointer Registers,事件环出队指针寄存器。

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引用的缓冲区的状态,但是可能会有例外。

  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
USB 3.0(也称为SuperSpeed USB)是一种高速数据传输接口,它提供了比USB 2.0更快的传输速度和更大的带宽。下面是USB 3.0接口硬件电路设计的一般步骤: 1. 电源供应:首先,USB 3.0接口需要一个稳定的电源供应。通常情况下,可以使用5V的直流电源。 2. 信号线:USB 3.0接口使用了9根信号线,其中4根用于数据传输(两对差分信号对),1根用于电源供应,1根用于地线,还有4根用于控制和同步。 3. PCB布局:在设计USB 3.0接口的硬件电路时,需要注意良好的PCB布局。差分信号对应该保持相等的长度,并且要避免干扰和串扰。同时,还需要考虑信号线的阻抗匹配和信号完整性。 4. 驱动器和接收器:USB 3.0接口需要使用特定的驱动器和接收器芯片来处理数据的发送和接收。这些芯片通常包含了差分信号线驱动和接收电路。 5. ESD保护:为了保护USB 3.0接口免受静电放电(ESD)的影响,需要在电路设计中添加ESD保护电路。这些保护电路可以帮助防止静电放电对接口和相关设备的损坏。 6. PCB层次:为了提高信号完整性和减少干扰,可以考虑使用多层PCB设计。通过将信号和电源层分离,可以减少信号间的干扰。 7. 信号完整性测试:在完成USB 3.0接口硬件电路设计后,需要进行信号完整性测试。这些测试可以帮助确保信号在传输过程中的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值