二、 USB 协议中的设备类(Device Class)详解
USB 协议学习目录
点击标题可跳转到对应的网络文章
- 一、USB 协议结构详解
- 二、USB 协议中的设备类
- 三、USB 协议通信过程
- 四、USB 协议中的描述符
- 五、USB 协议中的请求
- 六、USB 协议中的接口与端点
- 七、USB 协议中的事务
- 八、USB 协议分析与调试实战
目录
- 一、概述
- 二、常见设备类速查表
- [三、HID 类](#三、HID 类)
- [3.1 概述](#3.1 概述)
- [3.2 HID 核心特点](#3.2 HID 核心特点)
- [3.3 Boot Protocol vs Report Protocol](#3.3 Boot Protocol vs Report Protocol)
- [3.4 HID 描述符层次](#3.4 HID 描述符层次)
- [3.5 HID 报告描述符](#3.5 HID 报告描述符)
- [3.6 HID Item 类型速查](#3.6 HID Item 类型速查)
- [四、Mass Storage 类](#四、Mass Storage 类)
- [4.1 概述](#4.1 概述)
- [4.2 子类与协议](#4.2 子类与协议)
- [4.3 BOT 协议](#4.3 BOT 协议)
- [4.4 常用 SCSI 命令](#4.4 常用 SCSI 命令)
- [五、CDC 类](#五、CDC 类)
- [5.1 概述](#5.1 概述)
- [5.2 CDC-ACM 描述符结构](#5.2 CDC-ACM 描述符结构)
- [5.3 CDC-ACM 常用请求](#5.3 CDC-ACM 常用请求)
- [六、Video 类](#六、Video 类)
- [6.1 概述](#6.1 概述)
- [6.2 UVC 接口结构](#6.2 UVC 接口结构)
- [6.3 UVC 描述符类型](#6.3 UVC 描述符类型)
- [6.4 UVC 请求](#6.4 UVC 请求)
- [七、Audio 类](#七、Audio 类)
- [7.1 概述](#7.1 概述)
- [7.2 UAC 设备拓扑](#7.2 UAC 设备拓扑)
- [八、Hub 类](#八、Hub 类)
- [8.1 概述](#8.1 概述)
- [8.2 Hub 关键参数](#8.2 Hub 关键参数)
- [8.3 Hub 描述符](#8.3 Hub 描述符)
- 九、复合设备
- [9.1 概述](#9.1 概述)
- [9.2 IAD](#9.2 IAD)
- 十、设备类选择指南
- 十一、参考资源
一、概述
USB 协议通过 设备类(Device Class) 对外设进行标准化分类。当设备接入主机时,主机通过读取设备描述符中的 bDeviceClass 、bDeviceSubClass 、bDeviceProtocol 字段来识别设备类型,并加载相应的驱动程序。
这种分类机制使得同类设备可以共用通用驱动,无需为每个厂商的每个产品单独开发驱动。
#mermaid-svg-P0zPUhNV4y7QI33P{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-P0zPUhNV4y7QI33P .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-P0zPUhNV4y7QI33P .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-P0zPUhNV4y7QI33P .error-icon{fill:#552222;}#mermaid-svg-P0zPUhNV4y7QI33P .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-P0zPUhNV4y7QI33P .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-P0zPUhNV4y7QI33P .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-P0zPUhNV4y7QI33P .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-P0zPUhNV4y7QI33P .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-P0zPUhNV4y7QI33P .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-P0zPUhNV4y7QI33P .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-P0zPUhNV4y7QI33P .marker{fill:#333333;stroke:#333333;}#mermaid-svg-P0zPUhNV4y7QI33P .marker.cross{stroke:#333333;}#mermaid-svg-P0zPUhNV4y7QI33P svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-P0zPUhNV4y7QI33P p{margin:0;}#mermaid-svg-P0zPUhNV4y7QI33P .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-P0zPUhNV4y7QI33P .cluster-label text{fill:#333;}#mermaid-svg-P0zPUhNV4y7QI33P .cluster-label span{color:#333;}#mermaid-svg-P0zPUhNV4y7QI33P .cluster-label span p{background-color:transparent;}#mermaid-svg-P0zPUhNV4y7QI33P .label text,#mermaid-svg-P0zPUhNV4y7QI33P span{fill:#333;color:#333;}#mermaid-svg-P0zPUhNV4y7QI33P .node rect,#mermaid-svg-P0zPUhNV4y7QI33P .node circle,#mermaid-svg-P0zPUhNV4y7QI33P .node ellipse,#mermaid-svg-P0zPUhNV4y7QI33P .node polygon,#mermaid-svg-P0zPUhNV4y7QI33P .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-P0zPUhNV4y7QI33P .rough-node .label text,#mermaid-svg-P0zPUhNV4y7QI33P .node .label text,#mermaid-svg-P0zPUhNV4y7QI33P .image-shape .label,#mermaid-svg-P0zPUhNV4y7QI33P .icon-shape .label{text-anchor:middle;}#mermaid-svg-P0zPUhNV4y7QI33P .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-P0zPUhNV4y7QI33P .rough-node .label,#mermaid-svg-P0zPUhNV4y7QI33P .node .label,#mermaid-svg-P0zPUhNV4y7QI33P .image-shape .label,#mermaid-svg-P0zPUhNV4y7QI33P .icon-shape .label{text-align:center;}#mermaid-svg-P0zPUhNV4y7QI33P .node.clickable{cursor:pointer;}#mermaid-svg-P0zPUhNV4y7QI33P .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-P0zPUhNV4y7QI33P .arrowheadPath{fill:#333333;}#mermaid-svg-P0zPUhNV4y7QI33P .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-P0zPUhNV4y7QI33P .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-P0zPUhNV4y7QI33P .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-P0zPUhNV4y7QI33P .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-P0zPUhNV4y7QI33P .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-P0zPUhNV4y7QI33P .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-P0zPUhNV4y7QI33P .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-P0zPUhNV4y7QI33P .cluster text{fill:#333;}#mermaid-svg-P0zPUhNV4y7QI33P .cluster span{color:#333;}#mermaid-svg-P0zPUhNV4y7QI33P div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-P0zPUhNV4y7QI33P .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-P0zPUhNV4y7QI33P rect.text{fill:none;stroke-width:0;}#mermaid-svg-P0zPUhNV4y7QI33P .icon-shape,#mermaid-svg-P0zPUhNV4y7QI33P .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-P0zPUhNV4y7QI33P .icon-shape p,#mermaid-svg-P0zPUhNV4y7QI33P .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-P0zPUhNV4y7QI33P .icon-shape .label rect,#mermaid-svg-P0zPUhNV4y7QI33P .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-P0zPUhNV4y7QI33P .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-P0zPUhNV4y7QI33P .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-P0zPUhNV4y7QI33P :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} bDeviceClass != 0
bDeviceClass == 0
USB设备插入
读取设备描述符
设备类判定
按设备类加载驱动
按接口类加载驱动
设备可用
两种设备类声明方式
| 声明方式 | bDeviceClass 值 | 适用场景 |
|---|---|---|
| 设备级类声明 | 非 0 值(如 0x09=Hub) | 单一功能设备、Hub |
| 接口级类声明 | 0x00(由接口描述符定义) | 复合设备、多功能设备 |
二、常见设备类速查表
| 类代码 | 名称 | 英文全称 | 典型设备 | 子类/协议 |
|---|---|---|---|---|
| 0x00 | 每接口定义 | - | 复合设备 | - |
| 0x02 | CDC 控制 | Communication Device Class | 调制解调器、串口 | ACM/NCM/ECM |
| 0x03 | HID | Human Interface Device | 键盘、鼠标、手柄 | Boot/Report |
| 0x05 | 物理接口 | Physical Interface Device | 力反馈设备 | - |
| 0x06 | 图像 | Still Imaging | 数码相机、扫描仪 | Picture Transfer |
| 0x07 | 打印机 | Printer | 打印机 | - |
| 0x08 | 大容量存储 | Mass Storage | U盘、SD卡、硬盘 | BOT/UASP |
| 0x09 | Hub | Hub | USB集线器 | 单TT/多TT |
| 0x0A | CDC 数据 | CDC-Data | 配合 CDC 控制使用 | - |
| 0x0B | 智能卡 | Smart Card | 读卡器、SIM卡 | CCID |
| 0x0D | 内容安全 | Content Security | 指纹仪、加密狗 | - |
| 0x0E | 视频 | Video | 摄像头、视频采集 | UVC |
| 0x0F | 个人健康 | Personal Healthcare | 血压计、血糖仪 | - |
| 0x10 | 音频/视频 | Audio/Video | 音响、播放器 | - |
| 0xDC | 诊断 | Diagnostic Device | 测试设备 | - |
| 0xE0 | 无线 | Wireless Controller | 蓝牙适配器、WiFi | Bluetooth/RNDIS |
| 0xEF | 杂项 | Miscellaneous | ActiveSync、MTP | - |
| 0xFE | 应用特定 | Application Specific | DFU、IrDA | - |
| 0xFF | 厂商定义 | Vendor Specific | 自定义设备 | - |
三、HID 类(Human Interface Device)
3.1 概述
HID 是最常用的 USB 设备类之一,用于人机交互设备 。它的设计目标是低延迟、小数据量、周期性传输。
#mermaid-svg-ZXtjs8cPndfVWSWI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZXtjs8cPndfVWSWI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZXtjs8cPndfVWSWI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZXtjs8cPndfVWSWI .error-icon{fill:#552222;}#mermaid-svg-ZXtjs8cPndfVWSWI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZXtjs8cPndfVWSWI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZXtjs8cPndfVWSWI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZXtjs8cPndfVWSWI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZXtjs8cPndfVWSWI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZXtjs8cPndfVWSWI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZXtjs8cPndfVWSWI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZXtjs8cPndfVWSWI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZXtjs8cPndfVWSWI .marker.cross{stroke:#333333;}#mermaid-svg-ZXtjs8cPndfVWSWI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZXtjs8cPndfVWSWI p{margin:0;}#mermaid-svg-ZXtjs8cPndfVWSWI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZXtjs8cPndfVWSWI .cluster-label text{fill:#333;}#mermaid-svg-ZXtjs8cPndfVWSWI .cluster-label span{color:#333;}#mermaid-svg-ZXtjs8cPndfVWSWI .cluster-label span p{background-color:transparent;}#mermaid-svg-ZXtjs8cPndfVWSWI .label text,#mermaid-svg-ZXtjs8cPndfVWSWI span{fill:#333;color:#333;}#mermaid-svg-ZXtjs8cPndfVWSWI .node rect,#mermaid-svg-ZXtjs8cPndfVWSWI .node circle,#mermaid-svg-ZXtjs8cPndfVWSWI .node ellipse,#mermaid-svg-ZXtjs8cPndfVWSWI .node polygon,#mermaid-svg-ZXtjs8cPndfVWSWI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZXtjs8cPndfVWSWI .rough-node .label text,#mermaid-svg-ZXtjs8cPndfVWSWI .node .label text,#mermaid-svg-ZXtjs8cPndfVWSWI .image-shape .label,#mermaid-svg-ZXtjs8cPndfVWSWI .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZXtjs8cPndfVWSWI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZXtjs8cPndfVWSWI .rough-node .label,#mermaid-svg-ZXtjs8cPndfVWSWI .node .label,#mermaid-svg-ZXtjs8cPndfVWSWI .image-shape .label,#mermaid-svg-ZXtjs8cPndfVWSWI .icon-shape .label{text-align:center;}#mermaid-svg-ZXtjs8cPndfVWSWI .node.clickable{cursor:pointer;}#mermaid-svg-ZXtjs8cPndfVWSWI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZXtjs8cPndfVWSWI .arrowheadPath{fill:#333333;}#mermaid-svg-ZXtjs8cPndfVWSWI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZXtjs8cPndfVWSWI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZXtjs8cPndfVWSWI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZXtjs8cPndfVWSWI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZXtjs8cPndfVWSWI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZXtjs8cPndfVWSWI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZXtjs8cPndfVWSWI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZXtjs8cPndfVWSWI .cluster text{fill:#333;}#mermaid-svg-ZXtjs8cPndfVWSWI .cluster span{color:#333;}#mermaid-svg-ZXtjs8cPndfVWSWI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZXtjs8cPndfVWSWI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZXtjs8cPndfVWSWI rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZXtjs8cPndfVWSWI .icon-shape,#mermaid-svg-ZXtjs8cPndfVWSWI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZXtjs8cPndfVWSWI .icon-shape p,#mermaid-svg-ZXtjs8cPndfVWSWI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZXtjs8cPndfVWSWI .icon-shape .label rect,#mermaid-svg-ZXtjs8cPndfVWSWI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZXtjs8cPndfVWSWI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZXtjs8cPndfVWSWI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZXtjs8cPndfVWSWI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} HID Class 0x03
键盘 Keyboard
鼠标 Mouse
游戏手柄 Gamepad
触摸屏 Touchscreen
条码扫描器 Barcode
自定义 HID 设备
3.2 HID 核心特点
| 特性 | 说明 |
|---|---|
| 传输类型 | 中断传输(Interrupt Transfer) |
| 轮询间隔 | 由 bInterval 决定,通常 1~10ms |
| 数据格式 | 报告描述符(Report Descriptor)定义,非固定格式 |
| 协议 | Boot Protocol(简化)/ Report Protocol(完整) |
3.3 Boot Protocol vs Report Protocol
#mermaid-svg-Cyo3L6QopzfvBHx3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Cyo3L6QopzfvBHx3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Cyo3L6QopzfvBHx3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Cyo3L6QopzfvBHx3 .error-icon{fill:#552222;}#mermaid-svg-Cyo3L6QopzfvBHx3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Cyo3L6QopzfvBHx3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Cyo3L6QopzfvBHx3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Cyo3L6QopzfvBHx3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Cyo3L6QopzfvBHx3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Cyo3L6QopzfvBHx3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Cyo3L6QopzfvBHx3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Cyo3L6QopzfvBHx3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Cyo3L6QopzfvBHx3 .marker.cross{stroke:#333333;}#mermaid-svg-Cyo3L6QopzfvBHx3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Cyo3L6QopzfvBHx3 p{margin:0;}#mermaid-svg-Cyo3L6QopzfvBHx3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Cyo3L6QopzfvBHx3 .cluster-label text{fill:#333;}#mermaid-svg-Cyo3L6QopzfvBHx3 .cluster-label span{color:#333;}#mermaid-svg-Cyo3L6QopzfvBHx3 .cluster-label span p{background-color:transparent;}#mermaid-svg-Cyo3L6QopzfvBHx3 .label text,#mermaid-svg-Cyo3L6QopzfvBHx3 span{fill:#333;color:#333;}#mermaid-svg-Cyo3L6QopzfvBHx3 .node rect,#mermaid-svg-Cyo3L6QopzfvBHx3 .node circle,#mermaid-svg-Cyo3L6QopzfvBHx3 .node ellipse,#mermaid-svg-Cyo3L6QopzfvBHx3 .node polygon,#mermaid-svg-Cyo3L6QopzfvBHx3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Cyo3L6QopzfvBHx3 .rough-node .label text,#mermaid-svg-Cyo3L6QopzfvBHx3 .node .label text,#mermaid-svg-Cyo3L6QopzfvBHx3 .image-shape .label,#mermaid-svg-Cyo3L6QopzfvBHx3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-Cyo3L6QopzfvBHx3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Cyo3L6QopzfvBHx3 .rough-node .label,#mermaid-svg-Cyo3L6QopzfvBHx3 .node .label,#mermaid-svg-Cyo3L6QopzfvBHx3 .image-shape .label,#mermaid-svg-Cyo3L6QopzfvBHx3 .icon-shape .label{text-align:center;}#mermaid-svg-Cyo3L6QopzfvBHx3 .node.clickable{cursor:pointer;}#mermaid-svg-Cyo3L6QopzfvBHx3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Cyo3L6QopzfvBHx3 .arrowheadPath{fill:#333333;}#mermaid-svg-Cyo3L6QopzfvBHx3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Cyo3L6QopzfvBHx3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Cyo3L6QopzfvBHx3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Cyo3L6QopzfvBHx3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Cyo3L6QopzfvBHx3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Cyo3L6QopzfvBHx3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Cyo3L6QopzfvBHx3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Cyo3L6QopzfvBHx3 .cluster text{fill:#333;}#mermaid-svg-Cyo3L6QopzfvBHx3 .cluster span{color:#333;}#mermaid-svg-Cyo3L6QopzfvBHx3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Cyo3L6QopzfvBHx3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Cyo3L6QopzfvBHx3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-Cyo3L6QopzfvBHx3 .icon-shape,#mermaid-svg-Cyo3L6QopzfvBHx3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Cyo3L6QopzfvBHx3 .icon-shape p,#mermaid-svg-Cyo3L6QopzfvBHx3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Cyo3L6QopzfvBHx3 .icon-shape .label rect,#mermaid-svg-Cyo3L6QopzfvBHx3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Cyo3L6QopzfvBHx3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Cyo3L6QopzfvBHx3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Cyo3L6QopzfvBHx3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Report Protocol
由报告描述符动态定义
支持任意按键/轴/LED数量
Boot Protocol
键盘: 8字节固定格式
鼠标: 3字节固定格式
Boot Protocol 键盘数据格式(8字节输入报告):
c
// 输入报告格式
byte[0]: Modifier keys (Ctrl, Shift, Alt, GUI)
byte[1]: Reserved (常置 0)
byte[2]: Keycode 1
byte[3]: Keycode 2
byte[4]: Keycode 3
byte[5]: Keycode 4
byte[6]: Keycode 5
byte[7]: Keycode 6
Boot Protocol 鼠标数据格式(3字节输入报告):
c
byte[0]: Buttons (Bit0=左键, Bit1=右键, Bit2=中键)
byte[1]: X 轴位移(有符号)
byte[2]: Y 轴位移(有符号)
3.4 HID 描述符层次
#mermaid-svg-WaqteMLhkdr7qfTw{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WaqteMLhkdr7qfTw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WaqteMLhkdr7qfTw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WaqteMLhkdr7qfTw .error-icon{fill:#552222;}#mermaid-svg-WaqteMLhkdr7qfTw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WaqteMLhkdr7qfTw .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WaqteMLhkdr7qfTw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WaqteMLhkdr7qfTw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WaqteMLhkdr7qfTw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WaqteMLhkdr7qfTw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WaqteMLhkdr7qfTw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WaqteMLhkdr7qfTw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WaqteMLhkdr7qfTw .marker.cross{stroke:#333333;}#mermaid-svg-WaqteMLhkdr7qfTw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WaqteMLhkdr7qfTw p{margin:0;}#mermaid-svg-WaqteMLhkdr7qfTw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WaqteMLhkdr7qfTw .cluster-label text{fill:#333;}#mermaid-svg-WaqteMLhkdr7qfTw .cluster-label span{color:#333;}#mermaid-svg-WaqteMLhkdr7qfTw .cluster-label span p{background-color:transparent;}#mermaid-svg-WaqteMLhkdr7qfTw .label text,#mermaid-svg-WaqteMLhkdr7qfTw span{fill:#333;color:#333;}#mermaid-svg-WaqteMLhkdr7qfTw .node rect,#mermaid-svg-WaqteMLhkdr7qfTw .node circle,#mermaid-svg-WaqteMLhkdr7qfTw .node ellipse,#mermaid-svg-WaqteMLhkdr7qfTw .node polygon,#mermaid-svg-WaqteMLhkdr7qfTw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WaqteMLhkdr7qfTw .rough-node .label text,#mermaid-svg-WaqteMLhkdr7qfTw .node .label text,#mermaid-svg-WaqteMLhkdr7qfTw .image-shape .label,#mermaid-svg-WaqteMLhkdr7qfTw .icon-shape .label{text-anchor:middle;}#mermaid-svg-WaqteMLhkdr7qfTw .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WaqteMLhkdr7qfTw .rough-node .label,#mermaid-svg-WaqteMLhkdr7qfTw .node .label,#mermaid-svg-WaqteMLhkdr7qfTw .image-shape .label,#mermaid-svg-WaqteMLhkdr7qfTw .icon-shape .label{text-align:center;}#mermaid-svg-WaqteMLhkdr7qfTw .node.clickable{cursor:pointer;}#mermaid-svg-WaqteMLhkdr7qfTw .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WaqteMLhkdr7qfTw .arrowheadPath{fill:#333333;}#mermaid-svg-WaqteMLhkdr7qfTw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WaqteMLhkdr7qfTw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WaqteMLhkdr7qfTw .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WaqteMLhkdr7qfTw .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WaqteMLhkdr7qfTw .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WaqteMLhkdr7qfTw .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WaqteMLhkdr7qfTw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WaqteMLhkdr7qfTw .cluster text{fill:#333;}#mermaid-svg-WaqteMLhkdr7qfTw .cluster span{color:#333;}#mermaid-svg-WaqteMLhkdr7qfTw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WaqteMLhkdr7qfTw .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WaqteMLhkdr7qfTw rect.text{fill:none;stroke-width:0;}#mermaid-svg-WaqteMLhkdr7qfTw .icon-shape,#mermaid-svg-WaqteMLhkdr7qfTw .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WaqteMLhkdr7qfTw .icon-shape p,#mermaid-svg-WaqteMLhkdr7qfTw .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WaqteMLhkdr7qfTw .icon-shape .label rect,#mermaid-svg-WaqteMLhkdr7qfTw .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WaqteMLhkdr7qfTw .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WaqteMLhkdr7qfTw .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WaqteMLhkdr7qfTw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 设备描述符
配置描述符
接口描述符
bInterfaceClass=0x03 HID
HID 描述符
报告长度/国家码
端点描述符 IN
中断传输
端点描述符 OUT
可选中断传输
HID 描述符结构:
c
typedef struct {
uint8_t bLength; // 描述符长度 (9)
uint8_t bDescriptorType; // 描述符类型 (0x21 = HID)
uint16_t bcdHID; // HID 规范版本号 (如 0x0111 = 1.11)
uint8_t bCountryCode; // 国家代码 (0=NotLocalized)
uint8_t bNumDescriptors; // 附属描述符数量 (至少1)
uint8_t bDescriptorType2; // 报告描述符类型 (0x22)
uint16_t wDescriptorLength; // 报告描述符长度
} USB_HIDDescriptor;
3.5 HID 报告描述符(Report Descriptor)
报告描述符是 HID 的核心,使用HID Usage Tables 标准,通过一系列Item定义数据格式。
c
// 一个简单的键盘报告描述符示例
// 定义: 8字节输入(修饰键+6个按键), 1字节输出(5个LED)
static const uint8_t KeyboardReportDesc[] = {
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x06, // Usage (Keyboard)
0xA1, 0x01, // Collection (Application)
// 修饰键 (Ctrl, Shift, Alt, GUI)
0x05, 0x07, // Usage Page (Key Codes)
0x19, 0xE0, // Usage Minimum (224)
0x29, 0xE7, // Usage Maximum (231)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x08, // Report Count (8)
0x81, 0x02, // Input (Data, Variable, Absolute)
// 保留字节
0x95, 0x01, // Report Count (1)
0x75, 0x08, // Report Size (8)
0x81, 0x01, // Input (Constant)
// 普通按键 (同时最多6键)
0x95, 0x06, // Report Count (6)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x65, // Logical Maximum (101)
0x05, 0x07, // Usage Page (Key Codes)
0x19, 0x00, // Usage Minimum (0)
0x29, 0x65, // Usage Maximum (101)
0x81, 0x00, // Input (Data, Array)
// LED 输出报告
0x95, 0x05, // Report Count (5)
0x75, 0x01, // Report Size (1)
0x05, 0x08, // Usage Page (LEDs)
0x19, 0x01, // Usage Minimum (1)
0x29, 0x05, // Usage Maximum (5)
0x91, 0x02, // Output (Data, Variable, Absolute)
0x95, 0x01, // Report Count (1)
0x75, 0x03, // Report Size (3)
0x91, 0x01, // Output (Constant)
0xC0 // End Collection
};
3.6 HID Item 类型速查
| Item 前缀 | 类型 | 功能 |
|---|---|---|
0x05 / 0x06 / 0x07 |
Global - Usage Page | 定义用途页 |
0x09 / 0x0A |
Local - Usage | 定义具体用途 |
0x19 / 0x1A |
Local - Usage Minimum | 用途范围最小值 |
0x29 / 0x2A |
Local - Usage Maximum | 用途范围最大值 |
0x15 / 0x16 |
Global - Logical Minimum | 逻辑最小值 |
0x25 / 0x26 |
Global - Logical Maximum | 逻辑最大值 |
0x75 |
Global - Report Size | 每个字段的位数 |
0x95 |
Global - Report Count | 字段数量 |
0x81 |
Main - Input | 定义输入字段 |
0x91 |
Main - Output | 定义输出字段 |
0xB1 |
Main - Feature | 定义特征字段 |
0xA1 |
Main - Collection | 开始集合 |
0xC0 |
Main - End Collection | 结束集合 |
四、Mass Storage 类(大容量存储)
4.1 概述
Mass Storage 类(MSC)用于块设备存储,是最常见的 USB 设备类之一。
#mermaid-svg-NoR5t5CLTgxcbbD9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NoR5t5CLTgxcbbD9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NoR5t5CLTgxcbbD9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NoR5t5CLTgxcbbD9 .error-icon{fill:#552222;}#mermaid-svg-NoR5t5CLTgxcbbD9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NoR5t5CLTgxcbbD9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NoR5t5CLTgxcbbD9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NoR5t5CLTgxcbbD9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NoR5t5CLTgxcbbD9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NoR5t5CLTgxcbbD9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NoR5t5CLTgxcbbD9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NoR5t5CLTgxcbbD9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NoR5t5CLTgxcbbD9 .marker.cross{stroke:#333333;}#mermaid-svg-NoR5t5CLTgxcbbD9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NoR5t5CLTgxcbbD9 p{margin:0;}#mermaid-svg-NoR5t5CLTgxcbbD9 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NoR5t5CLTgxcbbD9 .cluster-label text{fill:#333;}#mermaid-svg-NoR5t5CLTgxcbbD9 .cluster-label span{color:#333;}#mermaid-svg-NoR5t5CLTgxcbbD9 .cluster-label span p{background-color:transparent;}#mermaid-svg-NoR5t5CLTgxcbbD9 .label text,#mermaid-svg-NoR5t5CLTgxcbbD9 span{fill:#333;color:#333;}#mermaid-svg-NoR5t5CLTgxcbbD9 .node rect,#mermaid-svg-NoR5t5CLTgxcbbD9 .node circle,#mermaid-svg-NoR5t5CLTgxcbbD9 .node ellipse,#mermaid-svg-NoR5t5CLTgxcbbD9 .node polygon,#mermaid-svg-NoR5t5CLTgxcbbD9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NoR5t5CLTgxcbbD9 .rough-node .label text,#mermaid-svg-NoR5t5CLTgxcbbD9 .node .label text,#mermaid-svg-NoR5t5CLTgxcbbD9 .image-shape .label,#mermaid-svg-NoR5t5CLTgxcbbD9 .icon-shape .label{text-anchor:middle;}#mermaid-svg-NoR5t5CLTgxcbbD9 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NoR5t5CLTgxcbbD9 .rough-node .label,#mermaid-svg-NoR5t5CLTgxcbbD9 .node .label,#mermaid-svg-NoR5t5CLTgxcbbD9 .image-shape .label,#mermaid-svg-NoR5t5CLTgxcbbD9 .icon-shape .label{text-align:center;}#mermaid-svg-NoR5t5CLTgxcbbD9 .node.clickable{cursor:pointer;}#mermaid-svg-NoR5t5CLTgxcbbD9 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NoR5t5CLTgxcbbD9 .arrowheadPath{fill:#333333;}#mermaid-svg-NoR5t5CLTgxcbbD9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NoR5t5CLTgxcbbD9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NoR5t5CLTgxcbbD9 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NoR5t5CLTgxcbbD9 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NoR5t5CLTgxcbbD9 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NoR5t5CLTgxcbbD9 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NoR5t5CLTgxcbbD9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NoR5t5CLTgxcbbD9 .cluster text{fill:#333;}#mermaid-svg-NoR5t5CLTgxcbbD9 .cluster span{color:#333;}#mermaid-svg-NoR5t5CLTgxcbbD9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NoR5t5CLTgxcbbD9 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NoR5t5CLTgxcbbD9 rect.text{fill:none;stroke-width:0;}#mermaid-svg-NoR5t5CLTgxcbbD9 .icon-shape,#mermaid-svg-NoR5t5CLTgxcbbD9 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NoR5t5CLTgxcbbD9 .icon-shape p,#mermaid-svg-NoR5t5CLTgxcbbD9 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NoR5t5CLTgxcbbD9 .icon-shape .label rect,#mermaid-svg-NoR5t5CLTgxcbbD9 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NoR5t5CLTgxcbbD9 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NoR5t5CLTgxcbbD9 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NoR5t5CLTgxcbbD9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Mass Storage Class 0x08
U盘 USB Flash
SD卡读卡器
移动硬盘
光驱/刻录机
4.2 子类与协议
| 子类 (bInterfaceSubClass) | 名称 | 说明 |
|---|---|---|
| 0x01 | RBC | Reduced Block Commands(闪存卡) |
| 0x02 | SFF-8020i / ATAPI | CD-ROM |
| 0x03 | QIC-157 | 磁带机 |
| 0x04 | UFI | USB Floppy Interface(软盘) |
| 0x05 | SFF-8070i | ATAPI 可移动设备 |
| 0x06 | SCSI Transparent | SCSI 透明命令集(最常用) |
| 协议 (bInterfaceProtocol) | 名称 | 说明 |
|---|---|---|
| 0x00 | Control/Bulk/Interrupt | CBI(含中断端点) |
| 0x01 | Control/Bulk | CB(无中断端点) |
| 0x50 | Bulk-Only Transport | BOT(最常用) |
| 0x62 | UAS | USB Attached SCSI |
4.3 BOT(Bulk-Only Transport)协议
MSC Device USB Host MSC Device USB Host #mermaid-svg-VXrzltFbQFajwG53{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VXrzltFbQFajwG53 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VXrzltFbQFajwG53 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VXrzltFbQFajwG53 .error-icon{fill:#552222;}#mermaid-svg-VXrzltFbQFajwG53 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VXrzltFbQFajwG53 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VXrzltFbQFajwG53 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VXrzltFbQFajwG53 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VXrzltFbQFajwG53 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VXrzltFbQFajwG53 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VXrzltFbQFajwG53 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VXrzltFbQFajwG53 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VXrzltFbQFajwG53 .marker.cross{stroke:#333333;}#mermaid-svg-VXrzltFbQFajwG53 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VXrzltFbQFajwG53 p{margin:0;}#mermaid-svg-VXrzltFbQFajwG53 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VXrzltFbQFajwG53 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-VXrzltFbQFajwG53 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-VXrzltFbQFajwG53 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-VXrzltFbQFajwG53 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-VXrzltFbQFajwG53 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-VXrzltFbQFajwG53 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-VXrzltFbQFajwG53 .sequenceNumber{fill:white;}#mermaid-svg-VXrzltFbQFajwG53 #sequencenumber{fill:#333;}#mermaid-svg-VXrzltFbQFajwG53 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-VXrzltFbQFajwG53 .messageText{fill:#333;stroke:none;}#mermaid-svg-VXrzltFbQFajwG53 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VXrzltFbQFajwG53 .labelText,#mermaid-svg-VXrzltFbQFajwG53 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-VXrzltFbQFajwG53 .loopText,#mermaid-svg-VXrzltFbQFajwG53 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-VXrzltFbQFajwG53 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-VXrzltFbQFajwG53 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-VXrzltFbQFajwG53 .noteText,#mermaid-svg-VXrzltFbQFajwG53 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-VXrzltFbQFajwG53 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VXrzltFbQFajwG53 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VXrzltFbQFajwG53 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-VXrzltFbQFajwG53 .actorPopupMenu{position:absolute;}#mermaid-svg-VXrzltFbQFajwG53 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-VXrzltFbQFajwG53 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-VXrzltFbQFajwG53 .actor-man circle,#mermaid-svg-VXrzltFbQFajwG53 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-VXrzltFbQFajwG53 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CBW (Command Block Wrapper) alt 数据阶段(Host→Device 写数据) 数据阶段(Device→Host 读数据) CSW (Command Status Wrapper) CBW (31字节, 包含SCSI命令) Data Out (批量传输) Data In (批量传输) CSW (13字节, 状态返回)
CBW(Command Block Wrapper)结构:
c
typedef struct {
uint32_t dCBWSignature; // 'USBC' = 0x43425355
uint32_t dCBWTag; // 命令标签, 主机生成
uint32_t dCBWDataTransferLength; // 预期传输数据长度
uint8_t bmCBWFlags; // Bit7: 方向 (0=Out, 1=In)
uint8_t bCBWLUN; // 逻辑单元号 (0~15)
uint8_t bCBWCBLength; // CBWCB 有效长度 (1~16)
uint8_t CBWCB[16]; // SCSI 命令块
} CBW_t; // 共 31 字节
CSW(Command Status Wrapper)结构:
c
typedef struct {
uint32_t dCSWSignature; // 'USBS' = 0x53425355
uint32_t dCSWTag; // 对应 CBW 的标签
uint32_t dCSWDataResidue; // 剩余未传输数据量
uint8_t bCSWStatus; // 状态: 0=成功, 1=失败, 2=Phase Error
} CSW_t; // 共 13 字节
4.4 常用 SCSI 命令
| SCSI 命令 | 操作码 | 功能 |
|---|---|---|
| TEST UNIT READY | 0x00 | 检测设备是否就绪 |
| REQUEST SENSE | 0x03 | 获取详细错误信息 |
| INQUIRY | 0x12 | 查询设备信息 |
| MODE SENSE | 0x1A / 0x5A | 获取设备模式参数 |
| START STOP UNIT | 0x1B | 启动/停止设备 |
| PREVENT ALLOW REMOVAL | 0x1E | 允许/禁止介质移除 |
| READ FORMAT CAPACITIES | 0x23 | 读取格式化容量 |
| READ CAPACITY | 0x25 | 读取总容量 |
| READ(10) | 0x28 | 读取数据块 |
| WRITE(10) | 0x2A | 写入数据块 |
五、CDC 类(Communication Device Class)
5.1 概述
CDC 用于通信设备 ,最常见的应用是实现USB 转串口(USB-to-UART)。
#mermaid-svg-VxJNGn9jFchO6ltM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VxJNGn9jFchO6ltM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VxJNGn9jFchO6ltM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VxJNGn9jFchO6ltM .error-icon{fill:#552222;}#mermaid-svg-VxJNGn9jFchO6ltM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VxJNGn9jFchO6ltM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VxJNGn9jFchO6ltM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VxJNGn9jFchO6ltM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VxJNGn9jFchO6ltM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VxJNGn9jFchO6ltM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VxJNGn9jFchO6ltM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VxJNGn9jFchO6ltM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VxJNGn9jFchO6ltM .marker.cross{stroke:#333333;}#mermaid-svg-VxJNGn9jFchO6ltM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VxJNGn9jFchO6ltM p{margin:0;}#mermaid-svg-VxJNGn9jFchO6ltM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VxJNGn9jFchO6ltM .cluster-label text{fill:#333;}#mermaid-svg-VxJNGn9jFchO6ltM .cluster-label span{color:#333;}#mermaid-svg-VxJNGn9jFchO6ltM .cluster-label span p{background-color:transparent;}#mermaid-svg-VxJNGn9jFchO6ltM .label text,#mermaid-svg-VxJNGn9jFchO6ltM span{fill:#333;color:#333;}#mermaid-svg-VxJNGn9jFchO6ltM .node rect,#mermaid-svg-VxJNGn9jFchO6ltM .node circle,#mermaid-svg-VxJNGn9jFchO6ltM .node ellipse,#mermaid-svg-VxJNGn9jFchO6ltM .node polygon,#mermaid-svg-VxJNGn9jFchO6ltM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VxJNGn9jFchO6ltM .rough-node .label text,#mermaid-svg-VxJNGn9jFchO6ltM .node .label text,#mermaid-svg-VxJNGn9jFchO6ltM .image-shape .label,#mermaid-svg-VxJNGn9jFchO6ltM .icon-shape .label{text-anchor:middle;}#mermaid-svg-VxJNGn9jFchO6ltM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VxJNGn9jFchO6ltM .rough-node .label,#mermaid-svg-VxJNGn9jFchO6ltM .node .label,#mermaid-svg-VxJNGn9jFchO6ltM .image-shape .label,#mermaid-svg-VxJNGn9jFchO6ltM .icon-shape .label{text-align:center;}#mermaid-svg-VxJNGn9jFchO6ltM .node.clickable{cursor:pointer;}#mermaid-svg-VxJNGn9jFchO6ltM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VxJNGn9jFchO6ltM .arrowheadPath{fill:#333333;}#mermaid-svg-VxJNGn9jFchO6ltM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VxJNGn9jFchO6ltM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VxJNGn9jFchO6ltM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VxJNGn9jFchO6ltM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VxJNGn9jFchO6ltM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VxJNGn9jFchO6ltM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VxJNGn9jFchO6ltM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VxJNGn9jFchO6ltM .cluster text{fill:#333;}#mermaid-svg-VxJNGn9jFchO6ltM .cluster span{color:#333;}#mermaid-svg-VxJNGn9jFchO6ltM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VxJNGn9jFchO6ltM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VxJNGn9jFchO6ltM rect.text{fill:none;stroke-width:0;}#mermaid-svg-VxJNGn9jFchO6ltM .icon-shape,#mermaid-svg-VxJNGn9jFchO6ltM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VxJNGn9jFchO6ltM .icon-shape p,#mermaid-svg-VxJNGn9jFchO6ltM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VxJNGn9jFchO6ltM .icon-shape .label rect,#mermaid-svg-VxJNGn9jFchO6ltM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VxJNGn9jFchO6ltM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VxJNGn9jFchO6ltM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VxJNGn9jFchO6ltM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} CDC Class 0x02/0x0A
CDC-ACM
Abstract Control Model
USB转串口
CDC-ECM
Ethernet Control Model
USB转以太网
CDC-NCM
Network Control Model
高速网络
RNDIS
微软远程NDIS
网络共享
5.2 CDC-ACM(USB 转串口)描述符结构
CDC 设备需要两个接口:
#mermaid-svg-5POM1Cf3t7FSxrvQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5POM1Cf3t7FSxrvQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5POM1Cf3t7FSxrvQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5POM1Cf3t7FSxrvQ .error-icon{fill:#552222;}#mermaid-svg-5POM1Cf3t7FSxrvQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5POM1Cf3t7FSxrvQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5POM1Cf3t7FSxrvQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5POM1Cf3t7FSxrvQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5POM1Cf3t7FSxrvQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5POM1Cf3t7FSxrvQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5POM1Cf3t7FSxrvQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5POM1Cf3t7FSxrvQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5POM1Cf3t7FSxrvQ .marker.cross{stroke:#333333;}#mermaid-svg-5POM1Cf3t7FSxrvQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5POM1Cf3t7FSxrvQ p{margin:0;}#mermaid-svg-5POM1Cf3t7FSxrvQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5POM1Cf3t7FSxrvQ .cluster-label text{fill:#333;}#mermaid-svg-5POM1Cf3t7FSxrvQ .cluster-label span{color:#333;}#mermaid-svg-5POM1Cf3t7FSxrvQ .cluster-label span p{background-color:transparent;}#mermaid-svg-5POM1Cf3t7FSxrvQ .label text,#mermaid-svg-5POM1Cf3t7FSxrvQ span{fill:#333;color:#333;}#mermaid-svg-5POM1Cf3t7FSxrvQ .node rect,#mermaid-svg-5POM1Cf3t7FSxrvQ .node circle,#mermaid-svg-5POM1Cf3t7FSxrvQ .node ellipse,#mermaid-svg-5POM1Cf3t7FSxrvQ .node polygon,#mermaid-svg-5POM1Cf3t7FSxrvQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5POM1Cf3t7FSxrvQ .rough-node .label text,#mermaid-svg-5POM1Cf3t7FSxrvQ .node .label text,#mermaid-svg-5POM1Cf3t7FSxrvQ .image-shape .label,#mermaid-svg-5POM1Cf3t7FSxrvQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-5POM1Cf3t7FSxrvQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5POM1Cf3t7FSxrvQ .rough-node .label,#mermaid-svg-5POM1Cf3t7FSxrvQ .node .label,#mermaid-svg-5POM1Cf3t7FSxrvQ .image-shape .label,#mermaid-svg-5POM1Cf3t7FSxrvQ .icon-shape .label{text-align:center;}#mermaid-svg-5POM1Cf3t7FSxrvQ .node.clickable{cursor:pointer;}#mermaid-svg-5POM1Cf3t7FSxrvQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5POM1Cf3t7FSxrvQ .arrowheadPath{fill:#333333;}#mermaid-svg-5POM1Cf3t7FSxrvQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5POM1Cf3t7FSxrvQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5POM1Cf3t7FSxrvQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5POM1Cf3t7FSxrvQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5POM1Cf3t7FSxrvQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5POM1Cf3t7FSxrvQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5POM1Cf3t7FSxrvQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5POM1Cf3t7FSxrvQ .cluster text{fill:#333;}#mermaid-svg-5POM1Cf3t7FSxrvQ .cluster span{color:#333;}#mermaid-svg-5POM1Cf3t7FSxrvQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5POM1Cf3t7FSxrvQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5POM1Cf3t7FSxrvQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-5POM1Cf3t7FSxrvQ .icon-shape,#mermaid-svg-5POM1Cf3t7FSxrvQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5POM1Cf3t7FSxrvQ .icon-shape p,#mermaid-svg-5POM1Cf3t7FSxrvQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5POM1Cf3t7FSxrvQ .icon-shape .label rect,#mermaid-svg-5POM1Cf3t7FSxrvQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5POM1Cf3t7FSxrvQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5POM1Cf3t7FSxrvQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5POM1Cf3t7FSxrvQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 配置描述符
接口 0: CDC 控制接口
bInterfaceClass=0x02
接口 1: CDC 数据接口
bInterfaceClass=0x0A
Header Functional Desc
ACM Functional Desc
Union Functional Desc
Call Management Desc
端点: 中断 IN
通知端点
端点: 批量 IN
数据接收
端点: 批量 OUT
数据发送
CDC 功能描述符类型:
| 描述符类型 | 值 | 说明 |
|---|---|---|
| Header Functional | 0x00 | CDC 版本信息 |
| Call Management | 0x01 | 呼叫管理 |
| ACM Functional | 0x02 | 抽象控制管理 |
| Direct Line Management | 0x03 | 直路控制 |
| Telephone Ringer | 0x04 | 电话振铃 |
| Telephone Call | 0x05 | 电话呼叫报告 |
| Union Functional | 0x06 | 联合接口描述 |
5.3 CDC-ACM 常用请求
| 请求码 | 值 | 功能 |
|---|---|---|
| SEND_ENCAPSULATED_COMMAND | 0x00 | 发送封装命令 |
| GET_ENCAPSULATED_RESPONSE | 0x01 | 获取封装响应 |
| SET_LINE_CODING | 0x20 | 设置串口参数(波特率、数据位、停止位、校验) |
| GET_LINE_CODING | 0x21 | 获取串口参数 |
| SET_CONTROL_LINE_STATE | 0x22 | 设置控制线状态(DTR/RTS) |
| SEND_BREAK | 0x23 | 发送 Break 信号 |
SET_LINE_CODING 数据结构(7字节):
c
typedef struct {
uint32_t dwDTERate; // 波特率 (如 115200 = 0x0001C200)
uint8_t bCharFormat; // 停止位: 0=1位, 1=1.5位, 2=2位
uint8_t bParityType; // 校验: 0=None, 1=Odd, 2=Even, 3=Mark, 4=Space
uint8_t bDataBits; // 数据位: 5, 6, 7, 8, 16
} CDC_LineCoding_t;
六、Video 类(UVC - USB Video Class)
6.1 概述
UVC 是 USB 视频设备的标准类,免驱动即可在主流操作系统(Windows、Linux、macOS)上使用。
#mermaid-svg-3Ls5Ga150LhXAiis{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3Ls5Ga150LhXAiis .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3Ls5Ga150LhXAiis .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3Ls5Ga150LhXAiis .error-icon{fill:#552222;}#mermaid-svg-3Ls5Ga150LhXAiis .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3Ls5Ga150LhXAiis .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3Ls5Ga150LhXAiis .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3Ls5Ga150LhXAiis .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3Ls5Ga150LhXAiis .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3Ls5Ga150LhXAiis .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3Ls5Ga150LhXAiis .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3Ls5Ga150LhXAiis .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3Ls5Ga150LhXAiis .marker.cross{stroke:#333333;}#mermaid-svg-3Ls5Ga150LhXAiis svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3Ls5Ga150LhXAiis p{margin:0;}#mermaid-svg-3Ls5Ga150LhXAiis .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3Ls5Ga150LhXAiis .cluster-label text{fill:#333;}#mermaid-svg-3Ls5Ga150LhXAiis .cluster-label span{color:#333;}#mermaid-svg-3Ls5Ga150LhXAiis .cluster-label span p{background-color:transparent;}#mermaid-svg-3Ls5Ga150LhXAiis .label text,#mermaid-svg-3Ls5Ga150LhXAiis span{fill:#333;color:#333;}#mermaid-svg-3Ls5Ga150LhXAiis .node rect,#mermaid-svg-3Ls5Ga150LhXAiis .node circle,#mermaid-svg-3Ls5Ga150LhXAiis .node ellipse,#mermaid-svg-3Ls5Ga150LhXAiis .node polygon,#mermaid-svg-3Ls5Ga150LhXAiis .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3Ls5Ga150LhXAiis .rough-node .label text,#mermaid-svg-3Ls5Ga150LhXAiis .node .label text,#mermaid-svg-3Ls5Ga150LhXAiis .image-shape .label,#mermaid-svg-3Ls5Ga150LhXAiis .icon-shape .label{text-anchor:middle;}#mermaid-svg-3Ls5Ga150LhXAiis .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3Ls5Ga150LhXAiis .rough-node .label,#mermaid-svg-3Ls5Ga150LhXAiis .node .label,#mermaid-svg-3Ls5Ga150LhXAiis .image-shape .label,#mermaid-svg-3Ls5Ga150LhXAiis .icon-shape .label{text-align:center;}#mermaid-svg-3Ls5Ga150LhXAiis .node.clickable{cursor:pointer;}#mermaid-svg-3Ls5Ga150LhXAiis .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3Ls5Ga150LhXAiis .arrowheadPath{fill:#333333;}#mermaid-svg-3Ls5Ga150LhXAiis .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3Ls5Ga150LhXAiis .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3Ls5Ga150LhXAiis .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3Ls5Ga150LhXAiis .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3Ls5Ga150LhXAiis .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3Ls5Ga150LhXAiis .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3Ls5Ga150LhXAiis .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3Ls5Ga150LhXAiis .cluster text{fill:#333;}#mermaid-svg-3Ls5Ga150LhXAiis .cluster span{color:#333;}#mermaid-svg-3Ls5Ga150LhXAiis div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3Ls5Ga150LhXAiis .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3Ls5Ga150LhXAiis rect.text{fill:none;stroke-width:0;}#mermaid-svg-3Ls5Ga150LhXAiis .icon-shape,#mermaid-svg-3Ls5Ga150LhXAiis .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3Ls5Ga150LhXAiis .icon-shape p,#mermaid-svg-3Ls5Ga150LhXAiis .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3Ls5Ga150LhXAiis .icon-shape .label rect,#mermaid-svg-3Ls5Ga150LhXAiis .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3Ls5Ga150LhXAiis .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3Ls5Ga150LhXAiis .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3Ls5Ga150LhXAiis :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Video Class 0x0E
摄像头 Webcam
视频采集卡
数码摄像机
6.2 UVC 接口结构
UVC 设备至少包含两个接口:VideoControl(VC)和 VideoStreaming(VS)。
#mermaid-svg-VMdLopBypOJ03Z8Y{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-VMdLopBypOJ03Z8Y .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-VMdLopBypOJ03Z8Y .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-VMdLopBypOJ03Z8Y .error-icon{fill:#552222;}#mermaid-svg-VMdLopBypOJ03Z8Y .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VMdLopBypOJ03Z8Y .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-VMdLopBypOJ03Z8Y .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VMdLopBypOJ03Z8Y .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VMdLopBypOJ03Z8Y .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-VMdLopBypOJ03Z8Y .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VMdLopBypOJ03Z8Y .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VMdLopBypOJ03Z8Y .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VMdLopBypOJ03Z8Y .marker.cross{stroke:#333333;}#mermaid-svg-VMdLopBypOJ03Z8Y svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VMdLopBypOJ03Z8Y p{margin:0;}#mermaid-svg-VMdLopBypOJ03Z8Y .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VMdLopBypOJ03Z8Y .cluster-label text{fill:#333;}#mermaid-svg-VMdLopBypOJ03Z8Y .cluster-label span{color:#333;}#mermaid-svg-VMdLopBypOJ03Z8Y .cluster-label span p{background-color:transparent;}#mermaid-svg-VMdLopBypOJ03Z8Y .label text,#mermaid-svg-VMdLopBypOJ03Z8Y span{fill:#333;color:#333;}#mermaid-svg-VMdLopBypOJ03Z8Y .node rect,#mermaid-svg-VMdLopBypOJ03Z8Y .node circle,#mermaid-svg-VMdLopBypOJ03Z8Y .node ellipse,#mermaid-svg-VMdLopBypOJ03Z8Y .node polygon,#mermaid-svg-VMdLopBypOJ03Z8Y .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VMdLopBypOJ03Z8Y .rough-node .label text,#mermaid-svg-VMdLopBypOJ03Z8Y .node .label text,#mermaid-svg-VMdLopBypOJ03Z8Y .image-shape .label,#mermaid-svg-VMdLopBypOJ03Z8Y .icon-shape .label{text-anchor:middle;}#mermaid-svg-VMdLopBypOJ03Z8Y .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-VMdLopBypOJ03Z8Y .rough-node .label,#mermaid-svg-VMdLopBypOJ03Z8Y .node .label,#mermaid-svg-VMdLopBypOJ03Z8Y .image-shape .label,#mermaid-svg-VMdLopBypOJ03Z8Y .icon-shape .label{text-align:center;}#mermaid-svg-VMdLopBypOJ03Z8Y .node.clickable{cursor:pointer;}#mermaid-svg-VMdLopBypOJ03Z8Y .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-VMdLopBypOJ03Z8Y .arrowheadPath{fill:#333333;}#mermaid-svg-VMdLopBypOJ03Z8Y .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VMdLopBypOJ03Z8Y .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VMdLopBypOJ03Z8Y .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VMdLopBypOJ03Z8Y .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-VMdLopBypOJ03Z8Y .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VMdLopBypOJ03Z8Y .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-VMdLopBypOJ03Z8Y .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VMdLopBypOJ03Z8Y .cluster text{fill:#333;}#mermaid-svg-VMdLopBypOJ03Z8Y .cluster span{color:#333;}#mermaid-svg-VMdLopBypOJ03Z8Y div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VMdLopBypOJ03Z8Y .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-VMdLopBypOJ03Z8Y rect.text{fill:none;stroke-width:0;}#mermaid-svg-VMdLopBypOJ03Z8Y .icon-shape,#mermaid-svg-VMdLopBypOJ03Z8Y .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-VMdLopBypOJ03Z8Y .icon-shape p,#mermaid-svg-VMdLopBypOJ03Z8Y .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-VMdLopBypOJ03Z8Y .icon-shape .label rect,#mermaid-svg-VMdLopBypOJ03Z8Y .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-VMdLopBypOJ03Z8Y .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-VMdLopBypOJ03Z8Y .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-VMdLopBypOJ03Z8Y :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 配置描述符
VideoControl Interface
控制接口
VideoStreaming Interface
流接口
Input Terminal
输入端子
Output Terminal
输出端子
Processing Unit
处理单元
亮度/对比度/白平衡
Extension Unit
扩展单元
厂商自定义
中断端点
状态/事件通知
批量/等时端点 IN
视频数据传输
6.3 UVC 描述符类型
| 描述符子类型 | 值 | 说明 |
|---|---|---|
| VC_HEADER | 0x01 | 视频控制头 |
| VC_INPUT_TERMINAL | 0x02 | 输入端子 |
| VC_OUTPUT_TERMINAL | 0x03 | 输出端子 |
| VC_SELECTOR_UNIT | 0x04 | 选择单元 |
| VC_PROCESSING_UNIT | 0x05 | 处理单元 |
| VC_EXTENSION_UNIT | 0x06 | 扩展单元 |
| VS_INPUT_HEADER | 0x01 | 流输入头 |
| VS_FORMAT_... | 0x02~0x11 | 各种视频格式 |
| VS_FRAME_... | 0x03~0x12 | 各种帧描述 |
6.4 UVC 请求(Class-Specific Requests)
| 请求 | 代码 | 方向 | 功能 |
|---|---|---|---|
| SET_CUR | 0x01 | OUT | 设置当前值 |
| GET_CUR | 0x81 | IN | 获取当前值 |
| GET_MIN | 0x82 | IN | 获取最小值 |
| GET_MAX | 0x83 | IN | 获取最大值 |
| GET_RES | 0x84 | IN | 获取分辨率 |
| GET_LEN | 0x85 | IN | 获取数据长度 |
| GET_INFO | 0x86 | IN | 获取能力信息 |
| GET_DEF | 0x87 | IN | 获取默认值 |
七、Audio 类(USB Audio Class)
7.1 概述
USB Audio 定义了音频设备的标准接口,包括麦克风、耳机、音箱、声卡等。
| 版本 | 类代码 | 说明 |
|---|---|---|
| UAC1 | 0x01 | USB Audio Class 1.0, 广泛应用 |
| UAC2 | 0x01 | USB Audio Class 2.0, 高带宽, 支持异步 |
| UAC3 | 0x01 | USB Audio Class 3.0, 配合 USB Type-C |
7.2 UAC 设备拓扑
#mermaid-svg-X5JT4oPlcn5CYDgG{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-X5JT4oPlcn5CYDgG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-X5JT4oPlcn5CYDgG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-X5JT4oPlcn5CYDgG .error-icon{fill:#552222;}#mermaid-svg-X5JT4oPlcn5CYDgG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-X5JT4oPlcn5CYDgG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-X5JT4oPlcn5CYDgG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-X5JT4oPlcn5CYDgG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-X5JT4oPlcn5CYDgG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-X5JT4oPlcn5CYDgG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-X5JT4oPlcn5CYDgG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-X5JT4oPlcn5CYDgG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-X5JT4oPlcn5CYDgG .marker.cross{stroke:#333333;}#mermaid-svg-X5JT4oPlcn5CYDgG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-X5JT4oPlcn5CYDgG p{margin:0;}#mermaid-svg-X5JT4oPlcn5CYDgG .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-X5JT4oPlcn5CYDgG .cluster-label text{fill:#333;}#mermaid-svg-X5JT4oPlcn5CYDgG .cluster-label span{color:#333;}#mermaid-svg-X5JT4oPlcn5CYDgG .cluster-label span p{background-color:transparent;}#mermaid-svg-X5JT4oPlcn5CYDgG .label text,#mermaid-svg-X5JT4oPlcn5CYDgG span{fill:#333;color:#333;}#mermaid-svg-X5JT4oPlcn5CYDgG .node rect,#mermaid-svg-X5JT4oPlcn5CYDgG .node circle,#mermaid-svg-X5JT4oPlcn5CYDgG .node ellipse,#mermaid-svg-X5JT4oPlcn5CYDgG .node polygon,#mermaid-svg-X5JT4oPlcn5CYDgG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-X5JT4oPlcn5CYDgG .rough-node .label text,#mermaid-svg-X5JT4oPlcn5CYDgG .node .label text,#mermaid-svg-X5JT4oPlcn5CYDgG .image-shape .label,#mermaid-svg-X5JT4oPlcn5CYDgG .icon-shape .label{text-anchor:middle;}#mermaid-svg-X5JT4oPlcn5CYDgG .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-X5JT4oPlcn5CYDgG .rough-node .label,#mermaid-svg-X5JT4oPlcn5CYDgG .node .label,#mermaid-svg-X5JT4oPlcn5CYDgG .image-shape .label,#mermaid-svg-X5JT4oPlcn5CYDgG .icon-shape .label{text-align:center;}#mermaid-svg-X5JT4oPlcn5CYDgG .node.clickable{cursor:pointer;}#mermaid-svg-X5JT4oPlcn5CYDgG .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-X5JT4oPlcn5CYDgG .arrowheadPath{fill:#333333;}#mermaid-svg-X5JT4oPlcn5CYDgG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-X5JT4oPlcn5CYDgG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-X5JT4oPlcn5CYDgG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-X5JT4oPlcn5CYDgG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-X5JT4oPlcn5CYDgG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-X5JT4oPlcn5CYDgG .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-X5JT4oPlcn5CYDgG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-X5JT4oPlcn5CYDgG .cluster text{fill:#333;}#mermaid-svg-X5JT4oPlcn5CYDgG .cluster span{color:#333;}#mermaid-svg-X5JT4oPlcn5CYDgG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-X5JT4oPlcn5CYDgG .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-X5JT4oPlcn5CYDgG rect.text{fill:none;stroke-width:0;}#mermaid-svg-X5JT4oPlcn5CYDgG .icon-shape,#mermaid-svg-X5JT4oPlcn5CYDgG .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-X5JT4oPlcn5CYDgG .icon-shape p,#mermaid-svg-X5JT4oPlcn5CYDgG .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-X5JT4oPlcn5CYDgG .icon-shape .label rect,#mermaid-svg-X5JT4oPlcn5CYDgG .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-X5JT4oPlcn5CYDgG .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-X5JT4oPlcn5CYDgG .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-X5JT4oPlcn5CYDgG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 音频输出路径
Input Terminal
USB Stream
Feature Unit
音量/静音
Headphone
输出端子
音频输入路径
Microphone
输入端子
Feature Unit
增益/静音
Output Terminal
USB Stream
八、Hub 类(USB Hub)
8.1 概述
Hub 是 USB 拓扑中不可或缺的设备,用于端口扩展。
#mermaid-svg-PvrxKnENyH3lwzAk{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PvrxKnENyH3lwzAk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PvrxKnENyH3lwzAk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PvrxKnENyH3lwzAk .error-icon{fill:#552222;}#mermaid-svg-PvrxKnENyH3lwzAk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PvrxKnENyH3lwzAk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PvrxKnENyH3lwzAk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PvrxKnENyH3lwzAk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PvrxKnENyH3lwzAk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PvrxKnENyH3lwzAk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PvrxKnENyH3lwzAk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PvrxKnENyH3lwzAk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PvrxKnENyH3lwzAk .marker.cross{stroke:#333333;}#mermaid-svg-PvrxKnENyH3lwzAk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PvrxKnENyH3lwzAk p{margin:0;}#mermaid-svg-PvrxKnENyH3lwzAk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PvrxKnENyH3lwzAk .cluster-label text{fill:#333;}#mermaid-svg-PvrxKnENyH3lwzAk .cluster-label span{color:#333;}#mermaid-svg-PvrxKnENyH3lwzAk .cluster-label span p{background-color:transparent;}#mermaid-svg-PvrxKnENyH3lwzAk .label text,#mermaid-svg-PvrxKnENyH3lwzAk span{fill:#333;color:#333;}#mermaid-svg-PvrxKnENyH3lwzAk .node rect,#mermaid-svg-PvrxKnENyH3lwzAk .node circle,#mermaid-svg-PvrxKnENyH3lwzAk .node ellipse,#mermaid-svg-PvrxKnENyH3lwzAk .node polygon,#mermaid-svg-PvrxKnENyH3lwzAk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PvrxKnENyH3lwzAk .rough-node .label text,#mermaid-svg-PvrxKnENyH3lwzAk .node .label text,#mermaid-svg-PvrxKnENyH3lwzAk .image-shape .label,#mermaid-svg-PvrxKnENyH3lwzAk .icon-shape .label{text-anchor:middle;}#mermaid-svg-PvrxKnENyH3lwzAk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PvrxKnENyH3lwzAk .rough-node .label,#mermaid-svg-PvrxKnENyH3lwzAk .node .label,#mermaid-svg-PvrxKnENyH3lwzAk .image-shape .label,#mermaid-svg-PvrxKnENyH3lwzAk .icon-shape .label{text-align:center;}#mermaid-svg-PvrxKnENyH3lwzAk .node.clickable{cursor:pointer;}#mermaid-svg-PvrxKnENyH3lwzAk .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PvrxKnENyH3lwzAk .arrowheadPath{fill:#333333;}#mermaid-svg-PvrxKnENyH3lwzAk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PvrxKnENyH3lwzAk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PvrxKnENyH3lwzAk .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PvrxKnENyH3lwzAk .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PvrxKnENyH3lwzAk .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PvrxKnENyH3lwzAk .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PvrxKnENyH3lwzAk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PvrxKnENyH3lwzAk .cluster text{fill:#333;}#mermaid-svg-PvrxKnENyH3lwzAk .cluster span{color:#333;}#mermaid-svg-PvrxKnENyH3lwzAk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PvrxKnENyH3lwzAk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PvrxKnENyH3lwzAk rect.text{fill:none;stroke-width:0;}#mermaid-svg-PvrxKnENyH3lwzAk .icon-shape,#mermaid-svg-PvrxKnENyH3lwzAk .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PvrxKnENyH3lwzAk .icon-shape p,#mermaid-svg-PvrxKnENyH3lwzAk .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PvrxKnENyH3lwzAk .icon-shape .label rect,#mermaid-svg-PvrxKnENyH3lwzAk .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PvrxKnENyH3lwzAk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PvrxKnENyH3lwzAk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PvrxKnENyH3lwzAk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} USB Host
Root Hub
集成在主机控制器
External Hub
外部Hub
设备 A
设备 B
设备 C
级联 Hub
设备 D
8.2 Hub 关键参数
| 参数 | USB 2.0 | USB 3.0 |
|---|---|---|
| 最大级联层数 | 6 层(含 Root Hub) | 6 层 |
| 最大设备数 | 127 | 127 |
| TT(Transaction Translator) | 单 TT / 多 TT | 不再需要 |
| 端口电流 | 500mA | 900mA |
8.3 Hub 描述符
c
// Hub 描述符
typedef struct {
uint8_t bLength; // 描述符长度 (9)
uint8_t bDescriptorType; // 描述符类型 (0x29)
uint8_t bNbrPorts; // 下行端口数量
uint16_t wHubCharacteristics; // Hub 特性 (电源模式、TT 类型等)
uint8_t bPwrOn2PwrGood; // 端口上电到就绪时间 (2ms 单位)
uint8_t bHubContrCurrent; // Hub 控制器最大电流 (mA)
uint8_t DeviceRemovable; // 设备可移除位图
uint8_t PortPwrCtrlMask; // 端口电源控制掩码 (已弃用)
} USB_HubDescriptor;
九、复合设备(Composite Device)
9.1 概述
复合设备是指一个 USB 设备包含多个独立功能,每个功能对应一个接口或接口集合。
#mermaid-svg-3N9UoxDwlIgtE3iJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-3N9UoxDwlIgtE3iJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-3N9UoxDwlIgtE3iJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-3N9UoxDwlIgtE3iJ .error-icon{fill:#552222;}#mermaid-svg-3N9UoxDwlIgtE3iJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-3N9UoxDwlIgtE3iJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-3N9UoxDwlIgtE3iJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-3N9UoxDwlIgtE3iJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-3N9UoxDwlIgtE3iJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-3N9UoxDwlIgtE3iJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-3N9UoxDwlIgtE3iJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-3N9UoxDwlIgtE3iJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-3N9UoxDwlIgtE3iJ .marker.cross{stroke:#333333;}#mermaid-svg-3N9UoxDwlIgtE3iJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-3N9UoxDwlIgtE3iJ p{margin:0;}#mermaid-svg-3N9UoxDwlIgtE3iJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-3N9UoxDwlIgtE3iJ .cluster-label text{fill:#333;}#mermaid-svg-3N9UoxDwlIgtE3iJ .cluster-label span{color:#333;}#mermaid-svg-3N9UoxDwlIgtE3iJ .cluster-label span p{background-color:transparent;}#mermaid-svg-3N9UoxDwlIgtE3iJ .label text,#mermaid-svg-3N9UoxDwlIgtE3iJ span{fill:#333;color:#333;}#mermaid-svg-3N9UoxDwlIgtE3iJ .node rect,#mermaid-svg-3N9UoxDwlIgtE3iJ .node circle,#mermaid-svg-3N9UoxDwlIgtE3iJ .node ellipse,#mermaid-svg-3N9UoxDwlIgtE3iJ .node polygon,#mermaid-svg-3N9UoxDwlIgtE3iJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-3N9UoxDwlIgtE3iJ .rough-node .label text,#mermaid-svg-3N9UoxDwlIgtE3iJ .node .label text,#mermaid-svg-3N9UoxDwlIgtE3iJ .image-shape .label,#mermaid-svg-3N9UoxDwlIgtE3iJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-3N9UoxDwlIgtE3iJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-3N9UoxDwlIgtE3iJ .rough-node .label,#mermaid-svg-3N9UoxDwlIgtE3iJ .node .label,#mermaid-svg-3N9UoxDwlIgtE3iJ .image-shape .label,#mermaid-svg-3N9UoxDwlIgtE3iJ .icon-shape .label{text-align:center;}#mermaid-svg-3N9UoxDwlIgtE3iJ .node.clickable{cursor:pointer;}#mermaid-svg-3N9UoxDwlIgtE3iJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-3N9UoxDwlIgtE3iJ .arrowheadPath{fill:#333333;}#mermaid-svg-3N9UoxDwlIgtE3iJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-3N9UoxDwlIgtE3iJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-3N9UoxDwlIgtE3iJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3N9UoxDwlIgtE3iJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-3N9UoxDwlIgtE3iJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3N9UoxDwlIgtE3iJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-3N9UoxDwlIgtE3iJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-3N9UoxDwlIgtE3iJ .cluster text{fill:#333;}#mermaid-svg-3N9UoxDwlIgtE3iJ .cluster span{color:#333;}#mermaid-svg-3N9UoxDwlIgtE3iJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-3N9UoxDwlIgtE3iJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-3N9UoxDwlIgtE3iJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-3N9UoxDwlIgtE3iJ .icon-shape,#mermaid-svg-3N9UoxDwlIgtE3iJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-3N9UoxDwlIgtE3iJ .icon-shape p,#mermaid-svg-3N9UoxDwlIgtE3iJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-3N9UoxDwlIgtE3iJ .icon-shape .label rect,#mermaid-svg-3N9UoxDwlIgtE3iJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-3N9UoxDwlIgtE3iJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-3N9UoxDwlIgtE3iJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-3N9UoxDwlIgtE3iJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 复合设备
bDeviceClass=0x00
接口 0-0
HID 键盘
接口 1-0
HID 鼠标
接口 2-0
CDC 控制
接口 3-0
CDC 数据
接口 4-0
Mass Storage
9.2 IAD(Interface Association Descriptor)
当多个接口组成一个功能组 时,需要使用 IAD 来描述接口关联。
c
typedef struct {
uint8_t bLength; // 描述符长度 (8)
uint8_t bDescriptorType; // 描述符类型 (0x0B = IAD)
uint8_t bFirstInterface; // 第一个接口编号
uint8_t bInterfaceCount; // 接口数量
uint8_t bFunctionClass; // 功能类
uint8_t bFunctionSubClass; // 功能子类
uint8_t bFunctionProtocol; // 功能协议
uint8_t iFunction; // 功能描述字符串索引
} USB_IADescriptor;
典型应用:CDC(2个接口)+ IAD、UAC(多个接口)+ IAD。
十、设备类选择指南
#mermaid-svg-dWLrZpZ7urfcBSMv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dWLrZpZ7urfcBSMv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dWLrZpZ7urfcBSMv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dWLrZpZ7urfcBSMv .error-icon{fill:#552222;}#mermaid-svg-dWLrZpZ7urfcBSMv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dWLrZpZ7urfcBSMv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dWLrZpZ7urfcBSMv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dWLrZpZ7urfcBSMv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dWLrZpZ7urfcBSMv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dWLrZpZ7urfcBSMv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dWLrZpZ7urfcBSMv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dWLrZpZ7urfcBSMv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dWLrZpZ7urfcBSMv .marker.cross{stroke:#333333;}#mermaid-svg-dWLrZpZ7urfcBSMv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dWLrZpZ7urfcBSMv p{margin:0;}#mermaid-svg-dWLrZpZ7urfcBSMv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dWLrZpZ7urfcBSMv .cluster-label text{fill:#333;}#mermaid-svg-dWLrZpZ7urfcBSMv .cluster-label span{color:#333;}#mermaid-svg-dWLrZpZ7urfcBSMv .cluster-label span p{background-color:transparent;}#mermaid-svg-dWLrZpZ7urfcBSMv .label text,#mermaid-svg-dWLrZpZ7urfcBSMv span{fill:#333;color:#333;}#mermaid-svg-dWLrZpZ7urfcBSMv .node rect,#mermaid-svg-dWLrZpZ7urfcBSMv .node circle,#mermaid-svg-dWLrZpZ7urfcBSMv .node ellipse,#mermaid-svg-dWLrZpZ7urfcBSMv .node polygon,#mermaid-svg-dWLrZpZ7urfcBSMv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dWLrZpZ7urfcBSMv .rough-node .label text,#mermaid-svg-dWLrZpZ7urfcBSMv .node .label text,#mermaid-svg-dWLrZpZ7urfcBSMv .image-shape .label,#mermaid-svg-dWLrZpZ7urfcBSMv .icon-shape .label{text-anchor:middle;}#mermaid-svg-dWLrZpZ7urfcBSMv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dWLrZpZ7urfcBSMv .rough-node .label,#mermaid-svg-dWLrZpZ7urfcBSMv .node .label,#mermaid-svg-dWLrZpZ7urfcBSMv .image-shape .label,#mermaid-svg-dWLrZpZ7urfcBSMv .icon-shape .label{text-align:center;}#mermaid-svg-dWLrZpZ7urfcBSMv .node.clickable{cursor:pointer;}#mermaid-svg-dWLrZpZ7urfcBSMv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dWLrZpZ7urfcBSMv .arrowheadPath{fill:#333333;}#mermaid-svg-dWLrZpZ7urfcBSMv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dWLrZpZ7urfcBSMv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dWLrZpZ7urfcBSMv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dWLrZpZ7urfcBSMv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dWLrZpZ7urfcBSMv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dWLrZpZ7urfcBSMv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dWLrZpZ7urfcBSMv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dWLrZpZ7urfcBSMv .cluster text{fill:#333;}#mermaid-svg-dWLrZpZ7urfcBSMv .cluster span{color:#333;}#mermaid-svg-dWLrZpZ7urfcBSMv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dWLrZpZ7urfcBSMv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dWLrZpZ7urfcBSMv rect.text{fill:none;stroke-width:0;}#mermaid-svg-dWLrZpZ7urfcBSMv .icon-shape,#mermaid-svg-dWLrZpZ7urfcBSMv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dWLrZpZ7urfcBSMv .icon-shape p,#mermaid-svg-dWLrZpZ7urfcBSMv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dWLrZpZ7urfcBSMv .icon-shape .label rect,#mermaid-svg-dWLrZpZ7urfcBSMv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dWLrZpZ7urfcBSMv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dWLrZpZ7urfcBSMv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dWLrZpZ7urfcBSMv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 人机交互
存储设备
串口/网络
摄像头
音频
多个功能
扩展端口
自定义
Windows免驱
需要定制功能
一般性能
高性能
设计 USB 设备
设备类型?
HID Class
键盘/鼠标/手柄
Mass Storage
U盘/读卡器
CDC Class
ACM/ECM/NCM
Video Class
免驱摄像头
Audio Class
声卡/耳机/麦克风
Composite Device
IAD 关联多接口
Hub Class
集线器
Vendor Specific
0xFF 厂商驱动
是否需要驱动?
Boot Protocol
标准HID驱动
Report Protocol
自定义报告描述符
传输性能要求?
BOT 协议
Bulk-Only Transport
UAS 协议
USB Attached SCSI
十一、参考资源
| 资源 | 链接/说明 |
|---|---|
| USB Class Codes | usb.org/defined-class-codes |
| HID Usage Tables | usb.org/sites/default/files/documents/hut1_12v2.pdf |
| UVC Specification | usb.org/document-library/video-class-v15-document-set |
| USB Mass Storage | usb.org/sites/default/files/usbmassbulk_10.pdf |
| CDC Specification | usb.org/sites/default/files/CDC1.2_WMC1.1_012011.zip |
| USB Audio Class | usb.org/document-library/audio-data-formats-10 |