447 lines
13 KiB
Markdown
447 lines
13 KiB
Markdown
# Deshab xHCI USB 驱动设计文档
|
||
|
||
## 1. 概述
|
||
|
||
xHCI (eXtensible Host Controller Interface) 是 USB 3.0+ 的标准主机控制器接口规范,统一支持 USB 1.1/2.0/3.x 设备,取代 UHCI/OHCI/EHCI。本驱动实现 xHCI 控制器驱动 + USB 大容量存储设备支持,使 Deshab 内核可通过 USB 存储设备(U 盘)读写数据。
|
||
|
||
### 1.1 驱动定位
|
||
|
||
```text
|
||
驱动名称: xhci
|
||
驱动类: DKM_CLASS_STORAGE (6)
|
||
加载阶段: stage1 (boot)
|
||
依赖: pci, irq
|
||
提供: block
|
||
输出文件: SYSTEM/driver/block/xhci.drv
|
||
```
|
||
|
||
### 1.2 实现范围
|
||
|
||
- xHCI 控制器发现、复位、启动
|
||
- Command Ring / Event Ring / ERST 管理
|
||
- USB 设备端口检测、重置、枚举
|
||
- 设备描述符 / 配置描述符读取
|
||
- Bulk-Only Transport (BOT) 大容量存储协议
|
||
- SCSI Transparent Command Set: INQUIRY / READ CAPACITY / READ(10) / WRITE(10)
|
||
- 块设备注册 (kernel_api.block)
|
||
|
||
### 1.3 不在范围内
|
||
|
||
- USB 3.x LPM (Link Power Management)
|
||
- USB 2.0 TT (Transaction Translator)
|
||
- Isochronous / Interrupt 传输
|
||
- 多设备并发(首版只枚举第一个 MSC 设备)
|
||
- USB Hub(假设设备直连控制器端口)
|
||
- xHCI Stream IDs
|
||
- MSI/MSI-X 中断(首版使用同步轮询)
|
||
|
||
---
|
||
|
||
## 2. xHCI 架构概述
|
||
|
||
### 2.1 寄存器布局
|
||
|
||
```text
|
||
MMIO Base
|
||
├── Capability Registers (0x00 - CAPLEN)
|
||
│ ├── HCSPARAMS1: MaxSlots, MaxIntrs, MaxPorts
|
||
│ ├── HCSPARAMS2: Scratchpad, MaxERST, IST, SPB
|
||
│ ├── HCCPARAMS1: ContextSize, ExtCapPtr
|
||
│ ├── DBOFF: Doorbell Register Offset
|
||
│ └── RTSOFF: Runtime Register Space Offset
|
||
│
|
||
├── Operational Registers (CAPLEN - 0x3FF)
|
||
│ ├── USBCMD: RS, RST, INTE
|
||
│ ├── USBSTS: HCH, EINT, CNR
|
||
│ ├── CRCR: Command Ring Control
|
||
│ ├── DCBAAP: Device Context Base Array Ptr
|
||
│ └── CONFIG: MaxSlotsEn
|
||
│
|
||
├── Port Registers (0x400 - 0x7FF)
|
||
│ └── PORTSC[n]: CCS, PED, PR, PLS, Speed
|
||
│
|
||
├── Runtime Registers (RTSOFF - )
|
||
│ ├── MFINDEX: Microframe Counter
|
||
│ └── IR[0]: IMAN, IMOD, ERSTSZ, ERSTBA, ERDP
|
||
│
|
||
└── Doorbell Registers (DBOFF - )
|
||
└── DB[n]: Doorbell for Slot n
|
||
```
|
||
|
||
### 2.2 数据结构关系
|
||
|
||
```text
|
||
DCBAA (Device Context Base Address Array)
|
||
├── [0]: Scratchpad Buffer Array Phys
|
||
├── [1]: Device Context 1 Phys
|
||
├── [2]: Device Context 2 Phys
|
||
└── ...
|
||
|
||
Device Context
|
||
├── Slot Context (32/64 bytes)
|
||
└── Endpoint Context[0-31] (32/64 bytes each)
|
||
└── Transfer Ring Dequeue Pointer
|
||
|
||
Command Ring (Circular)
|
||
├── TRB[0]: Enable Slot Command
|
||
├── TRB[1]: Address Device Command
|
||
├── ...
|
||
└── TRB[N-1]: Link TRB → TRB[0]
|
||
|
||
Event Ring (Circular)
|
||
├── TRB[0]: Command Completion Event
|
||
├── TRB[1]: Transfer Event
|
||
├── TRB[2]: Port Status Change Event
|
||
├── ...
|
||
└── TRB[N-1]: Link TRB → TRB[0]
|
||
|
||
Transfer Ring (per Endpoint, Circular)
|
||
├── TRB[0]: Setup Stage / Normal
|
||
├── TRB[1]: Data Stage / Normal
|
||
├── TRB[2]: Status Stage / Normal
|
||
├── ...
|
||
└── TRB[N-1]: Link TRB → TRB[0]
|
||
```
|
||
|
||
---
|
||
|
||
## 3. TRB 格式
|
||
|
||
### 3.1 通用 TRB (16 字节)
|
||
|
||
```text
|
||
Offset Size Field
|
||
0x00 8 Parameter (数据指针 / 命令参数)
|
||
0x08 4 Status (传输长度 / 完成码)
|
||
0x0C 4 Control (TRB Type[15:10], Cycle Bit[0], Flags)
|
||
```
|
||
|
||
### 3.2 Cycle Bit 机制
|
||
|
||
- **Producer Cycle State (PCS)**: 写入方维护的 cycle 值
|
||
- **Consumer Cycle State (CCS)**: 读取方维护的 cycle 值
|
||
- TRB 有效条件: `TRB.CycleBit == Ring.CCS`
|
||
- 环绕时翻转 Cycle State,实现无锁生产者-消费者同步
|
||
|
||
### 3.3 关键 TRB 类型
|
||
|
||
| Type | 名称 | 用途 |
|
||
|------|------|------|
|
||
| 0x01 | Normal | Bulk/Interrupt 数据传输 |
|
||
| 0x02 | Setup Stage | Control 传输 Setup 阶段 |
|
||
| 0x03 | Data Stage | Control 传输 Data 阶段 |
|
||
| 0x04 | Status Stage | Control 传输 Status 阶段 |
|
||
| 0x06 | Link | 环链接,指向下一段 |
|
||
| 0x09 | Enable Slot | 分配设备 Slot |
|
||
| 0x0A | Disable Slot | 释放设备 Slot |
|
||
| 0x0B | Address Device | 设置 USB 设备地址 |
|
||
| 0x0C | Configure Endpoint | 配置设备端点 |
|
||
| 0x17 | No-Op | 空操作 |
|
||
|
||
### 3.4 事件 TRB 类型
|
||
|
||
| Type | 名称 | 用途 |
|
||
|------|------|------|
|
||
| 0x01 | Transfer Event | 传输完成通知 |
|
||
| 0x02 | Command Completion | 命令完成通知 |
|
||
| 0x04 | Port Status Change | 端口状态变化 |
|
||
|
||
---
|
||
|
||
## 4. USB 设备枚举流程
|
||
|
||
```text
|
||
1. 检测端口连接 (PORTSC.CCS = 1)
|
||
2. 端口重置 (PORTSC.PR = 1 → 等待 PED = 1)
|
||
3. 读取端口速度 (PORTSC.Speed)
|
||
4. Enable Slot → 获得 Slot ID
|
||
5. 分配 Input Context + Transfer Ring (EP0)
|
||
6. Address Device (BSR=0) → 设备获得 USB 地址
|
||
7. Control Transfer (EP0): GET_DESCRIPTOR(Device)
|
||
8. 重新 Address Device (使用真实 MaxPacketSize)
|
||
9. Control Transfer (EP0): GET_DESCRIPTOR(Configuration)
|
||
10. Configure Endpoint (Bulk IN/OUT)
|
||
11. 设备就绪,可进行 Bulk 传输
|
||
```
|
||
|
||
---
|
||
|
||
## 5. BOT (Bulk-Only Transport) 协议
|
||
|
||
### 5.1 CBW (Command Block Wrapper, 31 字节)
|
||
|
||
```text
|
||
Offset Size Field
|
||
0x00 4 Signature: 0x43425355 ("USBC")
|
||
0x04 4 Tag: 递增标签(用于匹配 CSW)
|
||
0x08 4 Data Transfer Length: 期望数据字节数
|
||
0x0C 1 Flags: 0x80=Device-to-Host (IN), 0x00=Host-to-Device (OUT)
|
||
0x0D 1 LUN: 逻辑单元号
|
||
0x0E 1 CB Length: 命令块长度 (1-16)
|
||
0x0F 16 CB: SCSI 命令块
|
||
```
|
||
|
||
### 5.2 CSW (Command Status Wrapper, 13 字节)
|
||
|
||
```text
|
||
Offset Size Field
|
||
0x00 4 Signature: 0x53425355 ("USBS")
|
||
0x04 4 Tag: 匹配 CBW Tag
|
||
0x08 4 Data Residue: 未传输字节数
|
||
0x0C 1 Status: 0=OK, 1=Failed, 2=Phase Error
|
||
```
|
||
|
||
### 5.3 传输流程
|
||
|
||
```text
|
||
OUT (Bulk EP): CBW →
|
||
IN/OUT (Bulk EP): Data (如有) →
|
||
IN (Bulk EP): CSW
|
||
```
|
||
|
||
---
|
||
|
||
## 6. SCSI 命令集
|
||
|
||
### 6.1 INQUIRY (0x12)
|
||
|
||
```text
|
||
CB: [0x12, 0x00, 0x00, 0x00, allocation_length, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
|
||
Response: 36 字节标准 INQUIRY 数据
|
||
- Byte 0: Peripheral Device Type (0x00 = Direct Access Block)
|
||
- Bytes 8-15: Vendor Identification
|
||
- Bytes 16-31: Product Identification
|
||
- Bytes 32-35: Product Revision Level
|
||
```
|
||
|
||
### 6.2 READ CAPACITY(10) (0x25)
|
||
|
||
```text
|
||
CB: [0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
|
||
Response: 8 字节
|
||
- Bytes 0-3: Maximum LBA (big-endian)
|
||
- Bytes 4-7: Block Size (big-endian, typically 512)
|
||
```
|
||
|
||
### 6.3 READ(10) (0x28)
|
||
|
||
```text
|
||
CB: [0x28, 0x00, LBA[3], LBA[2], LBA[1], LBA[0], 0x00, TransferLength[1], TransferLength[0], 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
|
||
Direction: Device-to-Host (IN)
|
||
Data: TransferLength × BlockSize 字节
|
||
```
|
||
|
||
### 6.4 WRITE(10) (0x2A)
|
||
|
||
```text
|
||
CB: [0x2A, 0x00, LBA[3], LBA[2], LBA[1], LBA[0], 0x00, TransferLength[1], TransferLength[0], 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
|
||
Direction: Host-to-Device (OUT)
|
||
Data: TransferLength × BlockSize 字节
|
||
```
|
||
|
||
---
|
||
|
||
## 7. Context 格式
|
||
|
||
### 7.1 Slot Context (32 或 64 字节)
|
||
|
||
```text
|
||
DW0: Route String[23:0], Speed[29:27], MTT[31:30]
|
||
DW1: Max Packet Size[15:0], Device Address[31:24]
|
||
DW2: TT Hub Slot ID[7:0], TT Port Number[15:8], TTT[19:18], Rsv[23:20], Context Entries[31:27]
|
||
DW3: Exit Latency[19:0], Slot State[31:27]
|
||
```
|
||
|
||
### 7.2 Endpoint Context (32 或 64 字节)
|
||
|
||
```text
|
||
DW1: EP Type[3:0], Max Packet Size[31:16]
|
||
DW2: Max ESIT Payload Lo
|
||
DW4: Average TRB Length[15:0], Max Burst[31:24]
|
||
DW6: Dequeue Pointer Low (Transfer Ring)
|
||
DW7: Dequeue Pointer High
|
||
```
|
||
|
||
### 7.3 Input Context
|
||
|
||
```text
|
||
Offset 0: Input Control Context (32/64 bytes) - 位图指示哪些 Context 有效
|
||
Offset 32/64: Slot Context
|
||
Offset 64/128: Endpoint 0 Context
|
||
Offset 96/192: Endpoint 1 Context (Bulk OUT)
|
||
Offset 128/256: Endpoint 2 Context (Bulk IN)
|
||
```
|
||
|
||
---
|
||
|
||
## 8. USB 描述符格式
|
||
|
||
### 8.1 设备描述符 (18 字节)
|
||
|
||
```text
|
||
Offset Size Field
|
||
0 1 bLength: 18
|
||
1 1 bDescriptorType: 1
|
||
2 2 bcdUSB: USB 版本 (0x0200 = USB 2.0)
|
||
4 1 bDeviceClass: 设备类 (0x08 = Mass Storage)
|
||
5 1 bDeviceSubClass
|
||
6 1 bDeviceProtocol
|
||
7 1 bMaxPacketSize0: EP0 最大包大小 (8/16/32/64)
|
||
8 2 idVendor
|
||
10 2 idProduct
|
||
12 2 bcdDevice
|
||
14 1 iManufacturer
|
||
15 1 iProduct
|
||
16 1 iSerialNumber
|
||
17 1 bNumConfigurations
|
||
```
|
||
|
||
### 8.2 配置描述符 (9 字节) + 接口描述符 (9 字节) + 端点描述符 (7 字节×N)
|
||
|
||
```text
|
||
配置描述符:
|
||
bLength=9, bDescriptorType=2, wTotalLength, bNumInterfaces,
|
||
bConfigurationValue, bmAttributes, bMaxPower
|
||
|
||
接口描述符:
|
||
bLength=9, bDescriptorType=4, bInterfaceNumber, bAlternateSetting,
|
||
bNumEndpoints, bInterfaceClass(0x08=MSC), bInterfaceSubClass(0x06=SCSI),
|
||
bInterfaceProtocol(0x50=BOT)
|
||
|
||
端点描述符:
|
||
bLength=7, bDescriptorType=5, bEndpointAddress(0x81=Bulk IN, 0x02=Bulk OUT),
|
||
bmAttributes(0x02=Bulk), wMaxPacketSize, bInterval
|
||
```
|
||
|
||
---
|
||
|
||
## 9. Control Transfer Setup Packet (8 字节)
|
||
|
||
```text
|
||
Offset Size Field
|
||
0 1 bmRequestType: 数据方向 + 类型 + 接收者
|
||
1 1 bRequest: 请求码
|
||
2 2 wValue: 参数
|
||
4 2 wIndex: 索引
|
||
6 2 wLength: 数据长度
|
||
|
||
GET_DESCRIPTOR(Device):
|
||
bmRequestType = 0x80 (Device-to-Host, Standard, Device)
|
||
bRequest = 0x06 (GET_DESCRIPTOR)
|
||
wValue = 0x0100 (Device Descriptor, Index 0)
|
||
wIndex = 0x0000
|
||
wLength = 0x0012 (18 bytes)
|
||
|
||
GET_DESCRIPTOR(Configuration):
|
||
bmRequestType = 0x80
|
||
bRequest = 0x06
|
||
wValue = 0x0200 (Configuration Descriptor, Index 0)
|
||
wIndex = 0x0000
|
||
wLength = 0x00FF (255 bytes, 足够包含完整配置)
|
||
```
|
||
|
||
---
|
||
|
||
## 10. USB Legacy Support (BIOS Handoff)
|
||
|
||
### 10.1 Extended Capability
|
||
|
||
```text
|
||
HCCPARAMS1[31:16] → ExtCapPtr (以 32-bit 字为单位的偏移)
|
||
|
||
ExtCap 结构:
|
||
DW0: ID[7:0], Next[15:8] (下一能力偏移,0=结束)
|
||
|
||
ID=1: USB Legacy Support Capability
|
||
DW0: ID=1, Next
|
||
DW1: USBLEGSUP (BIOS/OS Ownership Semaphore)
|
||
bit[0-15]: BIOS Semaphore (BIOS 写 1 占用)
|
||
bit[16-31]: OS Semaphore (OS 写 1 请求所有权)
|
||
DW2: USBLEGCTLSTS (Legacy Control)
|
||
```
|
||
|
||
### 10.2 Handoff 流程
|
||
|
||
```text
|
||
1. 读取 USBLEGSUP
|
||
2. 若 BIOS Semaphore (bit[0]) = 1:
|
||
a. 写 USBLEGSUP: OS Semaphore (bit[16]) = 1
|
||
b. 等待 BIOS Semaphore 清除 (超时 1s)
|
||
c. 写 USBLEGCTLSTS: 清除所有 SMI 触发位
|
||
```
|
||
|
||
---
|
||
|
||
## 11. 错误处理与安全不变式
|
||
|
||
### 11.1 安全不变式
|
||
|
||
1. **不阻塞启动**:任何 xHCI 初始化步骤失败,只记日志,驱动返回 0(成功),不注册块设备
|
||
2. **超时保护**:所有硬件等待使用 TSC deadline,无无限循环
|
||
3. **Cache 一致性**:写入 DMA 缓冲区后执行 `wbinvd`
|
||
4. **DMA 缓冲区**:所有 DMA 内存通过 `kernel_api.dma->alloc_pages` 分配(低 4G,4K 对齐)
|
||
5. **端口重置安全**:重置超时后跳过该端口,不阻塞其他端口枚举
|
||
|
||
### 11.2 Completion Code 映射
|
||
|
||
| Completion Code | 含义 | 处理 |
|
||
|----------------|------|------|
|
||
| 0 | Success | 正常完成 |
|
||
| 1 | USB Transaction Error | 重试或报错 |
|
||
| 2 | Babble Detected | 报错 |
|
||
| 3 | USB Ring Stall | 端点 Stall,需 Clear Feature |
|
||
| 4 | Stop | 停止 |
|
||
| 5 | Short Packet | 部分完成,检查 residue |
|
||
| 13 | Event Data | 含事件数据 |
|
||
| 22 | Stream Protocol Error | 报错 |
|
||
|
||
---
|
||
|
||
## 12. 性能考虑
|
||
|
||
1. **TRB Ring 大小**:Command Ring 256 TRB,Event Ring 256 TRB,Transfer Ring 256 TRB
|
||
2. **Bulk 传输最大包**:USB 2.0 High-Speed = 512 字节,USB 3.0 Super-Speed = 1024 字节
|
||
3. **SCSI 传输粒度**:每次 READ(10)/WRITE(10) 最多 16 扇区 (8KB),与 AHCI 一致
|
||
4. **轮询 vs 中断**:首版使用 Event Ring 同步轮询 + TSC deadline,后续升级 MSI-X 中断
|
||
5. **多 TRB 链式传输**:大数据传输拆分为多个 Normal TRB,最后一次设置 IOC
|
||
|
||
---
|
||
|
||
## 13. QEMU 测试配置
|
||
|
||
```text
|
||
# xHCI 控制器 + USB 大容量存储
|
||
-device qemu-xhci,id=xhci0
|
||
-device usb-storage,bus=xhci0.0,drive=usb0
|
||
-drive id=usb0,if=none,file=usb_test.img,format=raw
|
||
|
||
# USB 测试镜像创建 (FAT32, 64MB)
|
||
# Windows:
|
||
# fsutil file createnew usb_test.img 67108864
|
||
# 格式化为 FAT32 (需管理员权限)
|
||
```
|
||
|
||
---
|
||
|
||
## 14. 与现有驱动的对比
|
||
|
||
| 特性 | AHCI | NVMe | xHCI |
|
||
|------|------|------|------|
|
||
| PCI Class | 01/06/01 | 01/08/02 | 0C/03/30 |
|
||
| 命令模型 | Port CI 命令 | SQ/CQ Doorbell | TRB Ring + Doorbell |
|
||
| 中断 | IRQ (PIC) | 轮询 | 轮询 (首版) |
|
||
| 数据传输 | PRDT DMA | PRP DMA | USB Bulk Transfer |
|
||
| 协议层 | ATA FIS | NVMe 命令 | USB + BOT + SCSI |
|
||
| 复杂度 | ~700 行 | ~800 行 | ~1500 行 |
|
||
| 块设备名 | ahci0 | nvme0 | usb0 |
|
||
|
||
---
|
||
|
||
## 参考资料
|
||
|
||
1. Intel xHCI Specification Rev 1.2 (2019): https://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/extensible-host-controler-interface-usb-xhci.pdf
|
||
2. USB Mass Storage Class Bulk-Only Transport Rev 1.0
|
||
3. SCSI Primary Commands (SPC-4) / SCSI Block Commands (SBC-3)
|
||
4. USB 2.0 Specification
|
||
5. USB 3.1 Specification
|