XHCI 1.2b 规范
+ -

6.数据结构-StreamContext

2026-06-12 本文链接为:http://www.usbzh.com/article/detail-1711.html ,欢迎转载,转载请附上本文链接。

一、定义与作用

Streams(数据流)是USB 3.0规范引入的一项重要特性,它允许单个Bulk端点同时处理多个独立的传输请求。这项技术主要被UASP等高级存储协议使用,显著提升了USB存储设备的性

传统USB传输中,每个Bulk端点就像一个单车道——一次只能处理一个传输请求,必须等前一个完成才能处理下一个。而Streams技术支持后,同一个Bulk端点可以拥有多个独立的传输队列(称为Stream Rings),驱动可以同时提交多个传输请求,设备可以决定先处理哪个

  • 主机控制器限制:xHCI硬件声明其支持的Stream ID数量上限
  • 设备端点限制:每个SuperSpeed Bulk端点也声明自己能处理的Stream数量
  • 实际分配数:最终分配数量取两者最小值,驱动必须能处理分配数少于请求数的情况

Stream数量是由USB设备在“SuperSpeed Endpoint Companion Descriptor”(超高速端点伴随描述符)的 bmAttributes 字段中声明的.

bmAttributes:

  • 如果这是个批量端点:4:0 MaxStreams。 这个端点支持的流的最大数量。有效值是从 0 到 16,其中值为 0 表示端点没有定义流。对于值 1 至 16,所支持的流等于2^MaxStream。7:5 保留。这些位是保留,并应设置为零。
  • 如果这是个控制或中断端点:7:0 保留。这些位是保留,并应设置为零。
  • 如果这是个等时端点:1:0 Mult。基于零的值,决定服务时间间隔内,这端点支持的包的最大数量。包的最大数量 = bMaxBurst x (Mult + 1) 。这个字段可设置的最大值是2. 7:2 保留。这些位是保留,并应设置为零.
属性 说明
大小 固定 16 字节(独立于控制器的上下文大小设置)
用途 定义 USB3 端点的数据流传输环(Stream Transfer Ring)
组织方式 多个 StreamContext 组成 Stream Context Array

二、结构定义(代码层面)

typedef struct _STREAM_CONTEXT {
    union {
        ULONG64     DequeuePointer;       // 64位传输环出队指针
        struct {
            ULONG64     DequeueCycleState:1;      // 循环状态位
            ULONG64     StreamContextType:3;      // 上下文类型
            ULONG64     DequeuePointerLo:28;      // 指针低位
            ULONG64     DequeuePointerHi:32;      // 指针高位
        };
    };

    union {
        ULONG       Reserved1;
        struct {
            ULONG   StreamEDTLA:24;       // 流端点描述符列表地址
            ULONG   Reserved2:8;
        };
        // ... 其他变体结构
    };

    union {
        ULONG       Reserved4;
        struct {
            ULONG   PartialTRBLength:17;  // 部分TRB长度
            ULONG   Reserved5:15;
        };
        // ... 其他变体结构
    };
} STREAM_CONTEXT;

C_ASSERT(sizeof(STREAM_CONTEXT) == 16);  // 始终16字节

三、核心字段详解

3.1 DequeuePointer(出队指针)

字段 位宽 说明
DequeueCycleState 1位 循环状态位(Cycle Bit),用于判断TRB有效性
StreamContextType 3位 流上下文类型(见下表)
DequeuePointerLo/Hi 60位 指向流传输环的物理地址

3.2 Stream Context Type(类型枚举)

宏定义 含义
0 STREAM_CONTEXT_TYPE_SECONDARY_TR 二级传输环
1 STREAM_CONTEXT_TYPE_PRIMARY_TR 主传输环
2 STREAM_CONTEXT_TYPE_PRIMARY_SSA_8 主SSA(8个流上下文)
3 STREAM_CONTEXT_TYPE_PRIMARY_SSA_16 主SSA(16个流上下文)
4 STREAM_CONTEXT_TYPE_PRIMARY_SSA_32 主SSA(32个流上下文)
5 STREAM_CONTEXT_TYPE_PRIMARY_SSA_64 主SSA(64个流上下文)
6 STREAM_CONTEXT_TYPE_PRIMARY_SSA_128 主SSA(128个流上下文)
7 STREAM_CONTEXT_TYPE_PRIMARY_SSA_256 主SSA(256个流上下文)

端点描述符列表地址)" class="reference-link">3.3 StreamEDTLA(流端点描述符列表地址)

  • 24位字段,指向流端点描述符列表
  • 用于支持多个数据流的批量传输

四、架构关系(结合规范)

┌─────────────────────────────────────────────────────────────────┐
│                      Endpoint Context                           │
│  ├─ MaxPrimaryStreams: 支持的最大主数据流数量                  │
│  ├─ LinearStreamArray: 是否使用线性流数组                       │
│  └─ StreamContextArrayPointer: Stream Context Array 基地址     │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│              Stream Context Array (SSA)                         │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  StreamContext[0]                                       │   │
│  │  ├─ DequeuePointer → Stream 0 Transfer Ring            │   │
│  │  └─ StreamContextType = PRIMARY_TR / SECONDARY_TR      │   │
│  └─────────────────────────────────────────────────────────┘   │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  StreamContext[1]                                       │   │
│  │  ├─ DequeuePointer → Stream 1 Transfer Ring            │   │
│  │  └─ StreamContextType = PRIMARY_TR / SECONDARY_TR      │   │
│  └─────────────────────────────────────────────────────────┘   │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  ... (最多支持 255 个流)                                 │   │
│  └─────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘

五、Streams 功能的技术要点

5.1 规范要点(3.2.4.1)

  1. Stream Context Array 的作用:定义 USB3 端点支持的多个传输环
  2. 数量和位置:由父 Endpoint Context 中的字段定义
  3. Stream Context 的作用
    • 提供指向 Stream 传输环的指针
    • 为 xHC 提供不透明的暂存空间(scratchpad)

5.2 代码实现要点

要点 说明
大小固定 始终 16 字节,不受 HCCPARAMS.CSZ 影响
类型多样 支持多种 Stream Context Array 大小(8/16/32/64/128/256)
灵活布局 支持 Primary/Secondary 传输环类型

六、使用场景

USB 3.0 大容量存储设备(如 U 盘)
    │
    ├─ 主端点 (Bulk OUT)
    │   └─ Stream Context Array
    │       ├─ Stream 0 → 文件 A 传输
    │       ├─ Stream 1 → 文件 B 传输
    │       ├─ Stream 2 → 文件 C 传输
    │       └─ ...
    │
    └─ 主端点 (Bulk IN)
        └─ Stream Context Array
            ├─ Stream 0 → 文件 A 接收
            ├─ Stream 1 → 文件 B 接收
            └─ ...

七、总结

StreamContext 是 USB 3.0 Streams 技术的核心数据结构,通过以下机制实现多数据流并行传输:

  1. 扩展传输环数量:单个端点可支持多个独立的传输环
  2. 独立调度:每个流有自己的 DequeuePointer,独立管理
  3. 高效批量传输:支持同时传输多个文件/数据流,提升 USB 3.0 带宽利用率
  4. 灵活配置:支持多种 SSA 大小(8-256 个流)

代码中通过 STREAM_CONTEXT 结构体实现了规范定义,包含传输环指针、流类型标识和端点描述符列表地址等关键字段。

本文链接为:http://www.usbzh.com/article/detail-1711.html ,欢迎转载,转载请附上本文链接。

0 篇笔记 写笔记

关注公众号
  • HID人机交互
  • Linux&USB
  • Linux-USB百科
  • MIDI V1.0
  • TinyUSB
  • UAC音频
  • CDC
  • TYPE-C
  • USB规范
  • USB3测试
  • USB3知识点
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • USB资源
  • XHCI 1.2b 规范
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!