当前位置: 首页 > news >正文

USB基础 -- 字符串描述符 (String Descriptor) 系统整理文档

整理一份 系统完整的教学培训文档,主题是 USB String Descriptor(字符串描述符)的体系、用法与扩展
内容会覆盖:概念 → 标准字段 → 索引映射机制 → 类描述符扩展 → 自定义扩展 → 实战示例 → 注意事项 → 总结


USB 字符串描述符 (String Descriptor) 系统整理文档

一、概念与作用

USB 协议中的 字符串描述符 (String Descriptor, bDescriptorType = 0x03) 用于为设备提供人类可读的文本信息
这些信息并非设备功能必需,但对 用户显示、设备识别、调试区分 非常重要。

常见用途:

  • 厂商名称 (Manufacturer)
  • 产品名称 (Product)
  • 序列号 (Serial Number)
  • 配置名称 (Configuration String)
  • 接口名称 (Interface String)
  • 类扩展(如 UVC Camera Terminal、Audio Terminal 等)
  • 厂商自定义信息(固件版本、OEM 定制标识)

二、字符串描述符格式

字符串描述符采用 UTF-16LE 编码,保证跨语言兼容性。
格式如下:

偏移字段长度说明
0bLength1 字节描述符总长度
1bDescriptorType1 字节固定值 0x03
2bStringn 字节字符串内容(UTF-16LE,每字符 2 字节)

示例:字符串 “USB”

08 03 55 00 53 00 42 00
  • bLength = 8
  • bDescriptorType = 0x03
  • bString = “U”=55 00, “S”=53 00, “B”=42 00

三、语言 ID 描述符 (String[0])

String Index = 0 不存放字符串,而是存放 支持的语言 ID (LANGID) 列表。

示例:

04 03 09 04

表示支持 0x0409 = English (US)
主机会先请求 Index=0,获取支持的语言,再用 wLANGID 去请求对应语言的字符串。


四、标准描述符中的 String Index 字段

USB 协议里,字符串描述符本身不会直接写在 Device/Config/Interface 描述符中,而是通过 索引引用

1. Device Descriptor

  • iManufacturer → 厂商名
  • iProduct → 产品名
  • iSerialNumber → 序列号

2. Configuration Descriptor

  • iConfiguration → 配置名称

3. Interface Descriptor

  • iInterface → 接口名称

4. Endpoint Descriptor

  • 标准 Endpoint 没有 iEndpoint 字段。

五、类扩展 (Class-Specific) 中的 String Index

不同的 USB 类规范(Class)允许在其专用描述符中使用字符串字段。

1. HID (Human Interface Device)

  • HID 报告项可以引用字符串索引,用于描述按钮/功能名。

2. Audio Class (UAC1/UAC2)

  • iTerminal → Terminal 名称
  • iFeature → Feature Unit 名称
  • iMixer → Mixer 名称
  • iSelector → Selector 名称
  • iClockSource / iClockSelector / iClockMultiplier → 时钟单元名

3. Video Class (UVC)

  • iTerminal → Camera Terminal 名称
  • iProcessing → Processing Unit 名称
  • iExtension → Extension Unit 名称

4. Hub Descriptor

  • iHub → Hub 名称

六、索引映射机制

规则:

  • iXXX = N → 表示该字段引用 String Descriptor[N]
  • 主机通过 GET_DESCRIPTOR(String, Index=N, LANGID) 请求该字符串
  • String Descriptor 表 = 一张索引到字符串的映射表

索引分配范围:

  • 0 → 语言 ID 表
  • 1–255 → 字符串(厂商可自由分配)

七、厂商自定义扩展

厂商可以定义自己的描述符,并添加字符串索引字段。

示例:自定义 Vendor Descriptor

struct vendor_device_info {u8 bLength;u8 bDescriptorType;   // Vendor specific = 0xFFu8 bCustomField;      // 自定义字段u8 iCustomString;     // 字符串索引
};

如果 iCustomString = 10,则 String[10] 必须存在,例如:

String[10] = "Firmware v1.2.3"

八、实战示例

1. Device Descriptor

struct usb_device_descriptor dev_desc = {.bLength = 18,.bDescriptorType = USB_DT_DEVICE,.idVendor = 0x1234,.idProduct = 0x5678,.iManufacturer = 1,   // String[1].iProduct      = 2,   // String[2].iSerialNumber = 3,   // String[3]
};

2. String Table

String[0] = 04 03 09 04                     // English (US)
String[1] = "MyCompany"
String[2] = "SuperUSB Device"
String[3] = "SN123456789"
String[10] = "Firmware v1.2.3"              // 自定义

3. 主机解析流程

  • 读到 iManufacturer=1 → 请求 String[1] → "MyCompany"
  • 读到 iProduct=2 → 请求 String[2] → "SuperUSB Device"
  • 读到 iSerialNumber=3 → 请求 String[3] → "SN123456789"
  • 读到 Vendor Descriptor iCustomString=10 → 请求 String[10] → "Firmware v1.2.3"

九、注意事项

  1. 必须 UTF-16LE,即便只含英文。

  2. Index=0 保留:仅返回语言 ID。

  3. 长度上限:字符串 ≤ 126 个字符(255 字节 - 2 字节头)。

  4. 多语言支持:一个 Index 可以对应多个语言版本。

  5. 不需要的字段填 0:表示没有对应字符串。

  6. 调试方法

    • Linux → lsusb -v
    • Windows → USBView/USBlyzer
    • 抓包工具 → Beagle USB Analyzer

十、总结

  1. 字符串描述符是 USB 的“标签”机制,便于用户和系统识别设备。

  2. 所有 iXXX 字段只存索引,不存字符串

  3. 索引值 → String Descriptor 表 → UTF-16LE 文本

  4. Class 扩展和厂商扩展 都可以引入更多字符串字段。

  5. 实战中建议最少提供

    • iManufacturer
    • iProduct
    • iSerialNumber
    • 再根据类规范/自定义需求扩展。

👉 建议:如果你在做 USB Gadget/固件开发,可以先画一张 描述符树(Device → Config → Interface → Endpoint → Class Specific),把所有可能用到的 iXXX 标出来,并对应到 String Table,这样设计清晰,不容易遗漏。

http://www.lryc.cn/news/624815.html

相关文章:

  • C++中内存池(Memory Pool)详解和完整示例
  • Mongodb(文档数据库)的安装与使用(文档的增删改查)
  • 可实时交互的AI生成世界,腾讯发布的AI框架Yan
  • 对象存储 COS 端到端质量系列 —— 终端网络诊断工具
  • EMC PCB 设计规范
  • 上汽通用牵手Momenta,别克至境L7全球首发搭载R6飞轮大模型
  • 用随机森林填补缺失值:原理、实现与实战
  • 深度学习必然用到的概率知识
  • 94、23种设计模式之工厂方法模式
  • Redis--day8--黑马点评--分布式锁(一)
  • 单片机驱动LCD显示模块LM6029BCW
  • 机器学习-决策树:从原理到实战的机器学习入门指南
  • LLM - windows下的Dify离线部署:从镜像打包到无网环境部署(亲测)
  • VectorDB+FastGPT一站式构建:智能知识库与企业级对话系统实战
  • 【Python 小工具】一键把源表 INSERT SQL 转换成目标表 INSERT SQL
  • 华为认证 HCIA/HCIP/HCIE 全面解析(2025 版)
  • Next.js 性能优化:打造更快的应用
  • docker——docker执行roslaunch显示错误
  • Harmonyos之字体设置功能
  • Java任务执行队列的优化
  • 王树森深度强化学习DRL(三)围棋AlphaGo+蒙特卡洛
  • 《Python学习之第三方库:开启无限可能》
  • 【网络安全实验报告】实验六: 病毒防护实验
  • 【加密PMF】psk-pmk-ptk
  • 使用WinDbg对软件崩溃信息进行抓包的方法
  • AI 在金融领域的落地案例
  • 为Vue TypeScript 项目添加 router 路由,跳转到Chat AI页面
  • 2025 年无毒冷却液市场深度全景调研及投资前景分析
  • Qwen Code宣布每天免费调用2000次,且无Token限制
  • 物联网智能边缘架构:流数据处理与设备管理的协同优化