4.1 设备描述符
功能概述
设备描述符(Device Descriptor)是 USB设备 的根描述符,包含设备的基本信息(如厂商ID、产品ID、设备类、支持的配置数量等)。
每个USB设备必须有且仅有一个设备描述符。
数据结构定义
设备描述符是设备连接到总线上时,USB主机所读取的第一个描述符,它包含了14个字段,结构如下:
struct usb_device_descriptor {
    uint8_t  bLength;            // 描述符长度(18字节)
    uint8_t  bDescriptorType;    // 描述符类型(固定为0x01)
    uint16_t bcdUSB;             // USB规范版本号(BCD码)
    uint8_t  bDeviceClass;       // 设备类代码
    uint8_t  bDeviceSubClass;    // 设备子类代码
    uint8_t  bDeviceProtocol;    // 设备协议代码
    uint8_t  bMaxPacketSize0;    // 端点0的最大包大小
    uint16_t idVendor;           // 厂商ID(由USB-IF分配)
    uint16_t idProduct;          // 产品ID(厂商自定义)
    uint16_t bcdDevice;          // 设备版本号(BCD码)
    uint8_t  iManufacturer;      // 厂商字符串描述符索引
    uint8_t  iProduct;           // 产品字符串描述符索引
    uint8_t  iSerialNumber;      // 序列号字符串描述符索引
    uint8_t  bNumConfigurations; // 支持的配置数量
} __attribute__ ((packed));字段详解
| 字段名 | 大小 | 类型 | 描述 | 
|---|---|---|---|
| bLength | 1 | 数字 | 描述符长度(固定为 0x12,即18字节)   ★ | 
| bDescriptorType | 1 | 常量 | 描述符类型(设备描述符固定为 0x01) ★ | 
| bcdUSB | 2 | BCD码 | 设备兼容的USB规范版本 E.g: 0x0200表示 USB 2.00x0110表示 USB 1.1 ★ | 
| bDeviceClass | 1 | 设备类别 | 设备类别 详见下表 ★ | 
| bDeviceSubClass | 1 | 子类 | 子类代码(依赖 bDeviceClass) | 
| bDeviceProtocol | 1 | 协议 | 协议代码(依赖 bDeviceClass和bDeviceSubClass) | 
| bMaxPacketSize0 | 1 | 数字 | 端点0的最大包大小(合法值:8 ★, 16, 32, 64) | 
| idVendor | 2 | ID | 厂商ID(由USB-IF分配) | 
| idProduct | 2 | ID | 产品ID(厂商自定义) | 
| bcdDevice | 2 | BCD码 | 设备版本号(如 0x0100表示V1.0) | 
| iManufacturer | 1 | 索引 | 厂商字符串描述符索引( 0表示无) | 
| iProduct | 1 | 索引 | 产品字符串描述符索引( 0表示无) | 
| iSerialNumber | 1 | 索引 | 序列号字符串描述符索引( 0表示无) | 
| bNumConfigurations | 1 | 数字 | 支持的配置描述符数量(至少为 1) | 
描述符类型 (bDescriptorType)
其含义可查下表(此表也适用于标准命令 Get_Descriptor 中 wValue域高字节 的取值含义)。
USB描述符的类型,分为3大类: 标准描述符、类描述符 和 厂家自定义描述符
1、标准描述符(Standard Descriptors)
| 描述符类型 | 英文名称 | 描述符值 | 
|---|---|---|
| 设备描述符 | Device Descriptor | 0x01 ★ | 
| 配置描述符 | Configuration Descriptor | 0x02 ★ | 
| 字符串描述符 | String Descriptor | 0x03 | 
| 接口描述符 | Interface Descriptor | 0x04 ★ | 
| 端点描述符 | Endpoint Descriptor | 0x05 | 
2、类描述符(Class Descriptors)
| 描述符类型 | 英文名称 | 描述符值 | 
|---|---|---|
| 集线器类描述符 | Hub Descriptor | 0x29 | 
| 人机接口类描述符 | HID Descriptor | 0x21 | 
3、厂商定义的描述符(Vendor-Defined Descriptors)
| 描述符类型 | 描述符值 | 
|---|---|
| 厂商定义的描述符 | 0xFF | 
设备类别(bDeviceClass)
| 值(十六进制) | 类别描述 | 
|---|---|
| 0x00 | 由 接口描述符 定义设备类别 ★ | 
| 0x02 | 通信设备类(CDC) | 
| 0x09 | 集线器类 ★ | 
| 0xE0 | 无线控制器类 | 
| 0xFF | 厂商自定义类 | 
示例(USB鼠标 的 设备描述符 )
| 字段 | 值(十六进制) | 说明 | 
|---|---|---|
| bLength | 0x12 | 描述符长度18字节 | 
| bDescriptorType | 0x01 | 描述符类型 | 
| bcdUSB | 0x0110 | USB 1.1 | 
| bDeviceClass | 0x00 | 设备类别:由 接口描述符 定义设备类别 | 
| bDeviceSubClass | 0x00 | 无子类 | 
| bDeviceProtocol | 0x00 | 无协议 | 
| bMaxPacketSize0 | 0x08 | 端点0最大包8字节 | 
| idVendor | 0x045E | 微软公司 | 
| idProduct | 0x0047 | 鼠标产品ID | 
| bcdDevice | 0x0300 | 设备版本3.0 | 
| iManufacturer | 0x01 | 厂商字符串索引1 | 
| iProduct | 0x02 | 产品字符串索引2 | 
| iSerialNumber | 0x00 | 无序列号 | 
| bNumConfigurations | 0x01 | 1个 配置描述符 | 
关键说明 ★★★
- 端点0:所有 USB设备 必须支持 端点0(控制端点),用于枚举和配置。
- 字符串描述符:索引值为0表示无对应字符串。
- 版本号:均以BCD码格式存储(如0x0200表示2.0)。
- 配置数量:即使设备只有一种工作模式,bNumConfigurations也必须≥1。
获取方式
主机通过控制传输的GET_DESCRIPTOR请求获取设备描述符:
struct usb_ctrlrequest {
    uint8_t  bmRequestType = 0x80; // 主机到设备
    uint8_t  bRequest = 0x06;       // GET_DESCRIPTOR
    uint16_t wValue = 0x0100;       // 高字节=0x01(设备描述符)
    uint16_t wIndex = 0x0000;       // 语言ID(0表示默认)
    uint16_t wLength = 0x0012;      // 请求长度(18字节)
}; 我的书签
 我的书签
                                 添加书签
 添加书签 移除书签
 移除书签