XHCI:eXtensible Host Controller Interface(未完成)

2024-06-15 22:52

本文主要是介绍XHCI:eXtensible Host Controller Interface(未完成),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

本文参考了 XHCI on OS Dev 以及 《USB: The Universal Series Bus》。代码存储于 github.com/juruohejiarui/VCPP-2.git 中的 VOS/kernel/hardware/USB .

需要先简单了解 PCIe 的数据结构和枚举、检测 UEFI 提供的 PCIe 信息的方法。

可以遵循下列步骤设置你的XHCI控制器:

  1. 找到所有 XHCI 的数据结构
  2. 获取所需要的信息,建立所需要的额外的数据结构
  3. 重置控制器,并设置控制器
  4. 启动控制器
  5. 开启监测进程

数据结构和注释

XHCI 控制器有大量的寄存器组和描述,需要一定的耐心。但是我们不需要全部了解,只需要知道一些基本的,可以用于设备枚举,检测和通信的寄存器就可以了。但是为了查阅方便,这里我还是几乎完全摘抄了《USB: The Universal Series Bus》对于每一个描述符的解释。当我们需要某些功能的时候再回来查阅表格即可。如果学习过程中发现一些不懂得名词,可以先把它记下来,之后遇到了定义或解释的时候再返回来看,如果之后都没有出现,那么就可以认为它并不重要。

PCIe

从 UEFI 提供的 MCFG 表中,可以读出一个 PCIe 数据表头的结构,我们称之为 PCIeConfig,对于 XHCI 设备,其结构一般如下:

OffsetSize(Byte)NameDescription
0x0 2 2 2Vendor ID制造商 ID
0x2 2 2 2Device ID制造商申请的设备特定的 ID
0x4 2 2 2Command用于操作该PCIe设备的寄存器
0x6 2 2 2Status该设备的状态
0x8 1 1 1Revision ID我也不懂,应该不太重要,可以忽略
0x9 1 1 1Prog IFProgram Interface Byte, 只读,用于寄存器级别下指定该设备的类别
0xa 1 1 1Subclass子类 ID
0xb 1 1 1Class Id类 ID
0xc 1 1 1Cache Line Size我也不懂,应该不太重要,可以忽略
0xd 1 1 1Latency Timer用于PCI,PCIe不支持,固定为 0 0 0
0xe 1 1 1Header Type指示该表头剩余内容的结构
0xf 1 1 1BISTBuilt-in self test, 设备的内建自检状态和控制寄存器
0x10 4 4 4Bar0Base Address 0
0x14 4 4 4Bar1Base Address 1 1 1
0x18 4 4 4Bar2Base Address 2 2 2
0x1c 4 4 4Bar3Base Address 3
0x20 4 4 4Bar4Base Address 4 4 4
0x24 4 4 4Bar5Base Address 5
0x28 4 4 4Cardbus CIS Pointer指向 Cardbus 结构的指针,该值被 PCI 和 Cardbus 共享(机翻)
0x2c 2 2 2Subsystem Vendor ID子系统的Vendor ID, 不重要
0x2e 2 2 2subsystem ID子系统ID,不重要
0x30 4 4 4Expansion ROM base address不懂,应该不太重要
0x34 1 1 1Capabilities Pointer使能寄存器的偏移量
0x35 7 7 7Reserved保留位置,不能读写
0x3c 1 1 1Interrupt Line用于指定该设备连接到 PIC (不是I/O APIC) 的 (IRQ0,IRQ1…IRQ15) 哪个(些)引脚, 0xff \texttt{0xff} 0xff 则表示无连接
0x3d 1 1 1Interrupt PIN用于指定该设备使用哪个中断引脚, 0x0 → does not use , 0x1 → INTA , 0x2 → INTB \texttt{0x0}\rightarrow \text{does not use},\texttt{0x1}\rightarrow \texttt{INTA}, \texttt{0x2}\rightarrow \texttt{INTB} 0x0does not use,0x1INTA,0x2INTB, 0x3 → INTC \texttt{0x3}\rightarrow \texttt{INTC} 0x3INTC, 0x4 → INTD \texttt{0x4}\rightarrow \texttt{INTD} 0x4INTD
0x3e 1 1 1Min Grant用于 PCI ,PCIe 下不可用,固定为 0 0 0
0x3f 1 1 1Max Latency用于 PCI ,PCIe 下不可用,固定为 0 0 0

Class Id, subClass, Prog IF \text{Class Id, subClass, Prog IF} Class Id, subClass, Prog IF 三者共同确认一个设备的类别,网上有对照表,这里就不粘出来了。对于 XHCI 设备, Class Id = 0xC , Subclass = 0x3 , Prog IF = 0x30 \text{Class Id}=\texttt{0xC}, \text{Subclass}=\texttt{0x3}, \text{Prog IF}=\texttt{0x30} Class Id=0xC,Subclass=0x3,Prog IF=0x30

Header Type 结构

Bit 7Bit 0 : 6
该设备是(1)/否(0)为多功能(multi-function)设备表头剩余结构的类型

对于 Bit 0 : 6 0:6 0:6 ,只有 0x0 , 0x1 , 0x2 \texttt{0x0},\texttt{0x1},\texttt{0x2} 0x0,0x1,0x2 三种取值,分别表示该 PCIe 设备是一个 General Device, PCI-to-PCI bridge, PCI-to-Cardbus bridge ,对于 XHCI 设备,其 Header Type \text{Header Type} Header Type 值一定为 0x0 \texttt{0x0} 0x0 0x80 \texttt{0x80} 0x80 。而上述展示的PCIe表结构就是 Bit 0 : 6 = 0x0 0:6=\texttt{0x0} 0:6=0x0 时的结构,对于其他情况,可以参考 PCI on OS Dev 。

XHCI

Capability Registers

可以翻译为使能寄存器组,这些寄存器均为只读(RO)寄存器。存储了大量的控制器支持信息。其基地址可以使用 PCIeConfig bar0 , bar1 \text{bar0}, \text{bar1} bar0,bar1 组合获取,计算方式如下:

// 将两个地址的值拼接起来,然后对 4K 下取整对齐
addr=(bar0 | (bar1 << 32)) & (~((1 << 12) - 1))

这个 addr 可以记录为 baseAddr \text{baseAddr} baseAddr ,稍后依然会用到。接下来直接列出这些寄存器的信息:

OffsetSize(Byte)NameDescription
0x01CapLen使能寄存器组的大小
0x11RSVD保留
0x22hciVersion接口的版本数字,不需要关注
0x44hcsParams1结构化的参数组 #1
0x84hcsParams2结构化的参数组 #2
0xc4hcsParams3结构化的参数组 #3
0x104hccParams1使能参数组 #1
0x144dbOffDoorbell 寄存器组的偏移,对 4 4 4 对齐(相对于 baseAddr \text{baseAddr} baseAddr
0x184rtsOff运行时寄存器空间的偏移,对 64 64 64 对齐(相对于 baseAddr \text{baseAddr} baseAddr
0x1c4hccParams2使能参数组 #2

上面的表中提到了五个参数组,实际上就是将一些值比较小的信息拼接起来,节省空间,接下来给出每个参数组的具体内容。

hcsParams 1, 结构化的参数组 #1
BitNameDescription
0:7MaxSlots最大插槽的编号
8:18MaxIntrs最大的中断编号
19:23Reserved保留
24:31MaxPorts最大端口的编号

这三个最大值可以用于枚举端口和中断,但注意,可用的端口和选择使用的中断可能并不连续。

hcsParams 2, 结构化的参数组 #2
BitNameDescription
0:3Isochronous Scheduling Threshold (IST)告诉软件它可以在多远的帧中修改 TRB(传输请求块)并且仍能正确执行
4:7Event Ring Segment Table Max (ERST Max)Event Ring Segment Table Base Size registers (稍后会有解释) 可以支持的最大值
8:20Reserved保留
21:25Max Scractchpad Buffer (High 5 bits)
26Scratchpad Restore (SPR)表示是否支持暂存器保存/恢复缓冲区
27:31Max Scractchpad Buffer (Low 5 bits)

将 Max Scractchpad Buffer 拼接起来可以得到软件需要申请的用于暂存器缓冲区的内容大小,如果该值为 0 0 0 ,那么就不需要申请内容,更多要求则和接下来提到的pageSize的值有关,但是在本人的机子上,这个值都是 0 0 0

hcsParams 3, 结构化的参数组 #3
BitNameDescription
0:7U1 Device Exit Latency电源状态从 U1 到 U0 所需要的微秒数 ( 1 0 − 6 s = 1 μ s 10^{-6}s=1\mu s 106s=1μs)
8:15Reserved保留
16:31U2 Device Exit Latency电源状态从 U1 到 U0 所需要的微秒数
hccParams 1, 使能参数组 #1
BitNameDescription
064-bit Addressing Capability (AC64)该XHCI控制器是(1)否(0)可以使用64-bit地址,如果不能,那么接下来使用的所有地址,都会忽略高32位。
1BW Negotiation Capability (BNC)用于指示该控制器是(1)否(0)实现了 Bandwidth Negotiation
2Context Size (CSZ)指示上下文的大小 1: 64-byte; 0: 32-byte 。该位对 Stream Contexts 不生效。
3Port Power Control (PPC)1: 所有的端口永远处于通电状态;0: 每个端口可以自行控制供电状态
4Port Indicators (PIND)用于指示端口指示灯的控制。0: 控制不可用; 1: 参照端口寄存器的 Bit 14:15 来获取更多信息
5Light HC Reset Capability (LHRC)指示操作寄存器组中的 usbCmd \text{usbCmd} usbCmd 寄存器的 Light Host Controller 功能是(1)否(0)可用
6Latency Tolerance Messaging Capability (LTC)表示该控制器是(1)否(0)支持传递延迟容忍消息(Latency Tolerance Messageing, LTM)
7No Secondary SID Support (NSS)是(0)否(1) 支持 Secondary Stream IDs.
8Parse All Event Data (PAE)1: 当转移到下一个传输描述符的时候,所有的 TRB 都会被解析;0: 不会。检测到一个 Short Packet 的时候会使用这个位
9Stopped - Short Packet Capability (SPC)该控制器是(1)否(0)可以发出短数据包停止代码(Stopped-Short Packet Completion code)
10Stopped EDTLA Capability (SEC)该控制器是(1)否(0)在 Stream Context 中实现了 Stopped EDTLA 区域,对于较新的硬件,这一位都是 1 1 1
11Continuous Frame ID Capability (CFC)该控制器是(1)否(0)能够匹配连续 ISO 传输描述符的 ID。
12:15Maximum Primary Stream Array Size (MaxPSASize)允许的最大 Stream Array 大小
16:31XHCI Extended Capabilities Pointer (xECP)0: 该控制器不存在拓展使能描述; > 0 >0 >0: 拓展使能描述的偏移(相对于 baseAddr \text{baseAddr} baseAddr

实际上的 Stream Array 最大大小需要使用如下方式计算 :

maxSize = 2 MaxPSASize + 1 \text{maxSize}=2^{\text{MaxPSASize}+1} maxSize=2MaxPSASize+1

对于拓展时能描述的偏移实际上是:

offset of extended Capabilites = baseAddr + 4 × xECP \text{offset of extended Capabilites}=\text{baseAddr} + 4\times \text{xECP} offset of extended Capabilites=baseAddr+4×xECP

hccParams 2, 使能参数组 #2
BitNameDescription
0U3 Entry Capability根(root hub)是否支持暂停完成通知(Suspend Completion notification)
1ConfigEP Command Max Exit Latency too Large (CMC)是(1)否(0)可以生成最大退出潜伏期过长的兼容错误(Exit Latency too Large compatibility error),该位被操作寄存器的 usbCmd \text{usbCmd} usbCmd 的 CME 位使用。
2Force Save Context Capability (FSC)Save State命令是(1)否(0)应当将所有的cached Slot, End Point, Stream和其他上下文存储到内存中
3Compliance Transition Capability (CTC)该控制器是(1)否(0) 支持 Compliance Transition Enabled 位
4Large ESIT Payload Capability (LEC)是(1)否(0)支持大于 48 Kb 48\texttt{Kb} 48Kb 的 ESIT Payloads
5Configuration Information Capability是(1)否(0)支持 输入控制上下文块(Input Control Context block) 中的 Configuration Value, Interface Number 和 Alternate settings 域的拓展配置信息

Extended Capabilites List

除了上面的 Capability Registers,XHCI 还提供了链表结构的拓展使能列表,和 PCIe 非常类似。每个拓展描述符都长下面这样:

BitNameDescription
0:7IDRO, 该拓展描述符的 ID
8:15NextRO, 下一个拓展描述符相对于当前描述符的偏移,计算方式如下: next offset = current offset + 4 × Next \text{next offset}=\text{current offset} + 4\times \text{Next} next offset=current offset+4×Next
nVaries每个 ID \text{ID} ID 特定的内容

下面给出一些常用的 ID \text{ID} ID 对照表:

IDNameDescriptionSize(Byte)
0Reserved
1USB Legacy Support提供操作系统启动前,既UEFI或BIOS的支持。如果这个拓展描述符是 USB Legacy Support,那么它一定是第一个拓展描述符。(书上是这么说的,但是貌似并不是这样的)8
2Supported Protocol该控制器支持的其中一种协议,每个控制器至少有一个这种拓展描述符,并且可能有多个。16
3Extened Power Management拓展的电源管理,至少有一个。n
4I/O Virtualization硬件虚拟化支持最高 1280
5Message Interrupt信息中断的支持n
6Local Memory本地内存支持最高 4 TB 4\texttt{TB} 4TB
7-9Reserved
10USB Debug Capability调试功能支持56
11-16Reserved
17Extended Message Interrupt拓展的信息中断的支持
18-191Reserved
192-255Vendor Specific特定的Vendor所使用的拓展使能信息

VMware 虚拟机的 XHCI 控制器似乎并不存在 USB Legacy Support 描述符。

每个XHCI控制器,至少拥有一个 Message Interrupt 或者 Extended Message Interrupt 描述符。一般而言,有 Extended Message Interrupt 则使用 Extend Message Interrupt,否则使用 Message Interrupt 。

XHCI USB Legacy Support

整一个描述符可以使用一个 64 位整数存储,但是为了便于展示,将其分成两个 32 位整数。

对于第一个整数:

BitNameDescription
0:7IDRO, = 0x1 =\texttt{0x1} =0x1
8:15NextRO
16HC BIOS Owned SemaphoreR/W, Default = 0 \text{Default}=0 Default=0. BIOS 将此位设置为 1 1 1 来指示 BIOS 占用了该控制器。
17:23Reserved and preservedR/W
24System Software Owned SemaphoreR/W, Default = 0 \text{Default}=0 Default=0,操作系统将此位设置为 1 1 1 来获取这个控制器的所有权,设置之后,待到 Bit 16 变为 0 0 0 即表示所有权获取成功
25:31Reserved and preservedR/W

对于要求 Reserved and preserved 的位置,需要每次写入的之前先把这些Bit的值读出来,或上要写入的其他位置的值,然后再将整个整数写入。

第二个整数的值被 BIOS 使用,操作系统软件无需关注。对于这个拓展描述符,唯一要做的就是将第一个整数的 Bit 24 设置为 1 1 1 ,然后等待 Bit 16 变为零即可。

XHCI USB Supported Protocol Capability

本拓展描述符用于描述控制器支持的其中一种协议,以及对应的端口序列。类似的,我们用 4 4 4 个 32 位整数描述这个描述符:

对于第一个整数:

BitAccessDescription
0:15ROID 和 Next
16:23ROMinor Revision Number, “USB 3.0” 中的 0
24:27ROReserved
28:31ROMajor Revision Number, “USB 3.0” 中的 3

注意,Minor Revision Number 和 Major Revision Number 均为整数,而不是字符 。在VMware 的 USB 3.1 控制器中,其中一个拓展描述符有 Major Revision Number = 3 \text{Major Revision Number}=3 Major Revision Number=3, Minor Revision Number = 1 \text{Minor Revision Number}=1 Minor Revision Number=1 ,而另一个拓展描述符有 Major Revision Number = 2 \text{Major Revision Number}=2 Major Revision Number=2, Minor Revision Number = 0 \text{Minor Revision Number}=0 Minor Revision Number=0 ,也就是说VMware的XHCI支持 USB 3.1 和 USB 2.0 两种协议。

第二个整数可以视为长度为 4 4 4 的字符串,其值一定为 "USB " 。

第三个整数存储了支持该协议的端口,

BitAccessDescription
0:7ROCompatible Port Offset,兼容该协议的端口的偏移,也就是从第几个端口开始支持这种协议
8:15ROCompatible Port Count,兼容该协议的端口数量
16:27ROProtocol Defined,对于 USB 3.0 ,该段表示 Hub Depth;对于 USB 2.0,Bit 17 表示该控制器是(1)否(0)只支持高速设备,剩余位用于表示 Hub Depth。详细内容可以查询 XHCI 技术手册的 Section 7.2.2.1.3
28:31ROProtocol Speed ID Count, > 0 >0 >0:表示用于定义 被该控制器支持的速度类型 的 PSI 结构的 32 位整数的个数。

对于第四个整数,只有 XHCI 1.1 或更新版本才有定义,否则所有位均为 Reserved and preserved 。

BitAccessDescription
0:4ROSlot Type ,插槽类型,目前只支持 0 0 0
5:31ROReserved and preserved

Operational Registers,操作寄存器组

这一组寄存器用于整个控制器的操作,包括重置,上电/断电等等。可以使用 opRegAddr = baseAddr + capReg . capLen \text{opRegAddr}=\text{baseAddr}+\text{capReg}.\text{capLen} opRegAddr=baseAddr+capReg.capLen 获取这组寄存器的地址。若寄存器为 32 位,那么只能用读写 32 位整数的方法对其操作;只可以使用 64 位整数的操作方法对 64 位寄存器进行操作。这里涉及到 C 语言编译出的汇编码的限制,使用优化的时候需要注意。

OffsetSize(Byte)NameDescription
0x0 4 4 4usbCmd用于操作控制器的寄存器
0x4 4 4 4usbState用于指示控制器状态的寄存器
0x8 4 4 4pageSize用于指示可用的地址的页大小的寄存器
0xC 8 8 8Reserved保留
0x14 4 4 4devNotifCtrlDevice Notification Control,用于控制控制器的报告内容的寄存器
0x18 8 8 8cmdRingCtrlCommand Ring Control
0x20 8 8 8Reserved保留
0x30 8 8 8devCtxBaseAddrDevice Context Base Address,用于保存上下文结构的基地址
0x38 4 4 4configConfiguration,配置
0x3c 964 964 964Reserved保留
0x400 16 n 16n 16nPortRegs端口的寄存器组集合

下一个小结会解释端口寄存器组的数据结构。

usbCmd,对控制器的命令

对这个寄存器写入之后不一定立刻有效果。因此写入之后需要保证该位被成功设置。

BitAccessNameDescription
0R/WRun/Stop (RS)Run(1);Stop(0),写入 0 0 0 之后,需要等到 usbState \text{usbState} usbState 中的 usbHalted \text{usbHalted} usbHalted 位被成功置位才算完成操作。
1R/WHost Controller Reset (HCRST)重置。将操作寄存器组的所有寄存器设为默认值,将所有的 Transaction 设置为停止状态(Halt)。对 USB2.0 下游设备无效;使 USB3.0 设备进行 热重置 (Hot Reset) 或温重置 (Warm Reset) 。需要保证 usbHalted \text{usbHalted} usbHalted 位在重置之前已经被设置为 1 1 1 。重置完成之后这一位会被复位成 0 0 0
2R/WInterrupter Enable (INTE)是(1)否(0)能让中断器移动到下一个中断临界点 (Interrupt threshold), = 0 =0 =0:禁用中断
3R/WHost System Error Enable (HSEE)是(1)否(0)允许当 usbState \text{usbState} usbState HSE \text{HSE} HSE 位被设为 1 1 1 的时候触发中断
4:6R/WReserved and Preserved保留
7R/W or ROLight Host Controller Reset (LHCRST)如果 hccParams1 \text{hccParams1} hccParams1 LHRC \text{LHRC} LHRC 位为 1 1 1 ,那么为 R/W,可以用于重置灯组寄存器,重置完成之后被复位为 0 0 0 ;如果为 0 0 0 ,那么这一位为 RO 位
8R/WController Save State (CSS)用于指示是否将状态存储到操作系统申请得到的 Scratch buffers 中。在设置为 1 1 1 之前,需要保证 usbHalted \text{usbHalted} usbHalted 位为 1 1 1 ,保存过程中, usbState \text{usbState} usbState 中的 Save State Status \text{Save State Status} Save State Status 位会被设置为 1 1 1
9R/WController Restore State (CRS)用于指示是否从 Scratch buffer 中恢复状态,在设置为 1 1 1 之前,需要保证 usbHalted \text{usbHalted} usbHalted 位为 1 1 1 。类似的,用 usbState \text{usbState} usbState 中的 Restore State Status \text{Restore State Status} Restore State Status 位表示是否恢复完成, 恢复时被设置为 1 1 1
10R/WEnable Wrap Event (EWE)是(1)否(0)在 MFINDEX \text{MFINDEX} MFINDEX 寄存器从 0x3fff \texttt{0x3fff} 0x3fff 变为 0x0000 \texttt{0x0000} 0x0000 时候触发中断
11R/WEnable U3 MFINDEX Stop (EU3S)是(1)否(0)在 通电状态处于 U3 的时候停止 MFINDEX \texttt{MFINDEX} MFINDEX 寄存器
12R/WStopped Short Packet Enable (SPE)是(1)否(0)产生发出短数据包停止代码(Stopped-Short Packet Completion code)
13R/WCEM Enable (CME)是(1)否(0)可以在 Configuration Endpoint Command 指令被接受并产生错误的时候,返回 最大退出潜伏期过长的兼容错误(Exit Latency too Large compatibility error)
14:31R/WReserved and preserved保留
usbState,控制器的状态

这里要解释一下 WC 即 Write Clear 的意思:当某一位被写入 0 0 0 的时候,不会改变该位的值,当写入 1 1 1 的时候,该位变为 0 0 0

BitAccessNameDescription
0ROHCHalted控制器是否因为 RS \text{RS} RS 位被设置,或者控制器产生错误而停止。
1R/WReserved and preserved保留
2R/WCHost System Error (HSE)当控制器产生严重错误的时候被设置为 1 1 1 ,否则为 0 0 0
3R/WCEvent Interrupt (EINT)当任何一个中断器的 Interrupt Pending \text{Interrupt Pending} Interrupt Pending 位被设置的时候,这一位被设置为 1 1 1,否则为 0 0 0
4R/WCPort Change Detected (PCD)当控制器的任何一个端口的连接状态位从 0 0 0 变为 1 1 1 的时候,这一位被设置为 1 1 1,否则为 0 0 0
5:7R/WReserved and preserved保留
8ROSave State Status (SSS)当保存状态的操作处于进行时,这一位被设置为 1 1 1,保存完成之后会被设置为 0 0 0
9RORestore State Status (RSS)当恢复状态的操作处于进行时,这一位被设置为 1 1 1,恢复完成之后会被设置为 0 0 0
10R/WCSave/Restore Error (SRE)表示保存状态/恢复状态的操作是(1)否(0)产生错误。
11ROController Not Ready (CNR)如果被设置,则禁止对操作寄存器组(除了 $\text{usbState})或Doorbell寄存器组进行任何写入操作。当处于“重置中”时,这一位会被设置。
12ROHost Controller Error (HCE)表示是(1)否(0)发生外部错误,需要重置和重新初始化控制器。
13:31R/WReserved and preserved保留
pageSize,该控制器支持的页大小

该寄存器的 Bit 16:31 为保留位,对于 Bit 0:15 ,如果其中的 Bit x x x 被设置为 1 1 1 ,则表示该控制器支持大小为 2 x + 12 B 2^{x+12} \texttt{B} 2x+12B 的物理页 。在本人的机子上,均有 pageSize ∩ 0xffff = 0 \text{pageSize}\cap\texttt{0xffff}=0 pageSize0xffff=0 。可以使用如下计算方法直接获得实际大小:

size = (pageSize & 0xfffful) << 12
devNotifCtrl,控制器接受通知包的控制寄存器

该寄存器的 Bit 16:31 为保留位,对于 Bit 0:15 ,如果其中的 Bit x x x 被设置为 1 1 1 ,则表示激活第 x x x 种通知类型。

cmdRingCtrl,指令环的控制寄存器
BitAccessNameDescription
0R/WRing Cycle State (RCS)告知控制器携带一个设置位(set bit)或者一个清理位(clear bit)来开始处理指令环
1R/WCCommand Stop (CS)告知控制器是否停止处理指令环。在处理完成当前指令之后会停止处理指令环,然后在事件环中放入一个任务环停止事件 (Command Ring Stopped event)
2R/WCCommand Abort (CA)直接停止处理指令环,然后放入一个任务环停止事件 (Command Ring Stopped event)
3ROCommand Ring Running (CRR)表示当前是否在处理指令环
4:5R/WReserved and preserved保留
6:63R/WCommand Ring Pointer指令环的地址的高 58 58 58 位,也就是将这个寄存器 & (~0x3ful) 即为指令环的地址
devCtxBaseAddr,设备上下文的基地址
BitAccessNameDescription
0:5R/WReserved必须为 0 0 0
6:63R/WDevice Context Base Address Array Pointer地址的高 58 58 58

实际上就是存储一个对 64 64 64 对齐的地址。

config,配置寄存器
BitAccessNameDescription
0:7R/WMax Device Slots Enabled (MaxSlotsEn)设置激活的最大插槽ID,只能在 RS = 0 \text{RS}=0 RS=0 的时候设置这个段。
8R/WU3 Entry Enable (U3E)表示控制器转移到 U3 状态的时候是否设置 PLC 标志位。 hccParams0 \text{hccParams0} hccParams0 的 Bit 0 指示是否支持这一位。
9R/WConfiguration Information Enable (CIE)是否初始化 输入控制上下文块的 Configuration Value, Interface Number 和 Alternate Settings 域, hccParams0 \text{hccParams0} hccParams0 的 Bit 5 指示是否支持这一位。
10:31R/WReserved and preserved保留

Port Registers, 端口状态和控制寄存器组

每一个端口寄存器组由 4 4 4 32 32 32 位整数描述。某些寄存器在 USB 2.0 和 3.1 下会有不同的含义。

OffsetNameDescription
0x0stsCtrlPort Status and Control, 用于端口的状态查询和控制,几乎每一个位都有作用
0x4pwStsCtrlPort Power Management Status and Control,用于端口电源的状态查询和控制
0x8lkInfoPort Link Info, 保存端口的链接信息
0xchwLPMCtrlPort Hardware LPM Control

这篇关于XHCI:eXtensible Host Controller Interface(未完成)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064812

相关文章

chart 完成拓扑图单节点拖拽不影响其他节点位置

就是做这种的功能,箭头原本是可以动态重复移动的,但不知道哪里问题导致没箭头了,然后补了个edgeSymbol: ['','arrow'], 字段,才增加了箭头。 拖拽某个节点,只有关联到的线条会跟着变动其他的节点位置不变。 参考 https://gallery.echartsjs.com/editor.html?c=x8Fgri22P9 https://echarts.baidu.com/exa

CloudStack基本概念-Zone,Pod,Cluster,Host

ZonePodClusterHost Zone Zone(资源域)是CloudStack部署中第二大的组织单元。Zone一般对应一个数据中心,虽然一个数据中心也可以有多个Zone。 把基础设施组织进Zone的一个好处就是可以提供物理隔离和冗余。 例如每个Zone可以有自己的电源供应和网络线路,并且zone之间可以远远地隔离开(虽然不是必须的) 一个zone包括:

多路h265监控录放开发-(12)完成全部开始录制和全部停止录制代码

xviewer.h 新增 public:void StartRecord();//126 开始全部摄像头录制void StopRecord();//126 停止全部摄像头录制 xviewer.cpp 新增//视频录制static vector<XCameraRecord*> records;//126void XViewer::StartRecord() //开始全部摄像头录

赶论文不用愁:如何利用ChatGPT在3小时内完成论文

在这份指南里,我将详细介绍如何运用ChatGPT 4.0的高级功能来辅助学术研究与文章写作。从挖掘研究课题的初步想法开始,到撰写一篇内容深刻、结构完整的学术论文,我将逐步演示如何在研究的各个阶段中充分利用ChatGPT。值得一提的是,所有这些功能都基于其PLUS版本,如果你尚未订阅,可以参考相关的教程。 初步探索与主题的确定 起初,我置身于知识的大海中,寻找一个值得深入研究的专题。Chat

kafka 集群 Controller 节点和 zookeeper 集群 leader 节点有何区别联系?

kafka 集群 Controller 节点和 zookeeper 集群 leader 节点有何区别联系? Kafka 集群中的 Controller 节点和 ZooKeeper 集群中的 Leader 节点在角色和功能上有明显的区 别,但它们之间也有一定的联系。以下是它们的详细区别和联系: Kafka 集群中的 Controller 节点 角色和功能: 管理任务: Kafka Con

kafka 管理节点 Controller 角色分析

kafka 管理节点 Controller 角色分析 kafka controller 如何管理分区的创建、状态监测、故障切换、内容复制、如何管控分区副本的状态检测故障切换、数据同步、learder 选举? Kafka Controller 是 Kafka 集群中的一个关键组件,负责管理分区的创建、状态监测、故障切换、内容 复制等任务。它通过 ZooKeeper 协调和管理这些任务,确保 K

【SpringBoot深入浅出系列】SpringBoot之集成JUnit5+MockMvc测试Controller

目录 一、写在前面二、创建项目集成 JUnit 5 测试 Controller1.项目说明2.修改测试类 LoginControllerTest3.运行测试 一、写在前面 本文在 SpringBoot之集成JUnit5进行单元测试 一文基础上进行拓展延伸,实现对 Controller 类的测试。 二、创建项目集成 JUnit 5 测试 Controller 1.项目说明

tessy 单元测试 TDE 界面 数据无法填充:the test object interface is incomplete

目录 1,失败现象 2,失败原因 3,解决办法 1,失败现象         函数名字前的图标高度缩小为正常的一半,TDE界面的数据无法填充。错误提示为题目中的英文。 2,失败原因         TIE界面,此函数的参数的 passing 方向有 unknown,未正确识别。 3,解决办法         将 interface 栏的所有参数的 passing 和

interface Ref<T = any> 这是什么写法?为什么写接口还需要加上<T = any>

问: export interface Ref<T = any> { value: T [RefSymbol]: true } 这里既然是interface接口,为什么还有<T = any>这是什么意思? 回答: <T = any> 中的 <T> 表示这是一个泛型参数,它可以在接口中作为类型的占位符,在实际使用时被具体的类型替代。= any 则表示默认类型为 any,意味着如果没有明

芝麻清单助力提升学习工作效率 专注时间完成有效的待办事项

芝麻清单助力提升学习&工作效率 专注时间完成有效的工作。今天我们给大家带来一个专注清单,一个更高效的学习和工作的方法! 我们都知道,专注做一个事情,会有效的提升效率,让事情更高效的完成。如果是学习的话,专注去学习效果更加的明显。 许多人都不容易做到专注一个事情,我们需要一个专注事情的工具协助我们,芝麻清单就是一个专注提升效率,记事清单,待办事项的一个工具。对于事情比较多,我们可以用芝麻清单分类