二、USB协议中的设备类

二、 USB 协议中的设备类(Device Class)详解

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) 对外设进行标准化分类。当设备接入主机时,主机通过读取设备描述符中的 bDeviceClassbDeviceSubClassbDeviceProtocol 字段来识别设备类型,并加载相应的驱动程序。

这种分类机制使得同类设备可以共用通用驱动,无需为每个厂商的每个产品单独开发驱动。
#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
相关推荐
smallerxuan2 天前
三、USB协议通信过程
usb·usb协议·usb通信过程
smallerxuan2 天前
七、USB协议中的事务
usb·usb协议·usb事务
smallerxuan2 天前
五、USB协议中的请求
usb·usb协议·usb请求
smallerxuan2 天前
八、USB协议分析与调试实战
usb·usb协议分析·usb协议·usb协议调测
smallerxuan2 天前
四、USB协议中的描述符
usb·usb协议·usb描述符
ZenasLDR5 天前
Type-C接口水冷散热器
接口·芯片·usb
ZenasLDR13 天前
LDR6600适配器PD协议芯片
接口·芯片·usb
斐夷所非23 天前
USB 接口 | 硬件协议、系统架构、驱动开发与功耗调试
usb
混分巨兽龙某某25 天前
基于CH32L103的USB转I2C/SMBUS的调试助手项目(代码开源)
usb·ch32·wch·i2c/smbus