USB描述符相关
📎 原始文档:https://www.kdocs.cn/l/cazHK0nc31hO USB描述符相关
- 描述符类型

- 各类描述符介绍: 标准的USB设备有5种USB描述符:设备描述符,配置描述符,字符串描述符,接口描述符,端点描述符。
下面详解: - 设备描述符: 一个设备只有一个设备描述符
typedef struct _USB_DEVICE_DESCRIPTOR_
{
//描述符长度:固定为0x12,18个字节
0x12, //bLength
//描述符类型:设备描述符为0x01
0x01, //bDescriptorType,描述符
//USB版本号:0x200:USB2.0版本 0x110:USB1.1版本
0x00, 0x02, // bcdUSB: USB 2.0小端格式
//设备类型:详情见此链接:https://www.usb.org/defined-class-codes
0x00, //bDeviceClass 由接口描述符定义
//设备子类:进一步定义bDeviceClass的USB设备类,子类型代码
//(由USB分配).如果bDeviceClass值是0,一定要设置为0.
//其它情况就跟据USB-IF组织定义的编码.
0x00, //bDeviceSubClass,
//协议代码(由USB分配).如果使用USB-IF组织定义的协议,
//就需要设置这里的值,否则直接设置为0。如果厂商自己定义的可以设置为FFH.
0x00, //bDeviceProtol,
//端点0最大数据包大小(只有8,16,32,64有效)
0x40; //bMaxPacketSize0,64字节
//PID,供应商ID(由USB分配)
'J', 'L', // idVendor: 0x4a4c - JL
//VID
'U', 'A', // idProduct: chip id
//设备出产编码.由厂家自行设置.
0x00, 0x01, // bcdDevice: version 1.0
//厂商字符串描述符索引值
0x01, // iManufacturer: Index to string descriptor that contains the string <Your Name> in Unicode
//产品字符串描述符索引值
0x02, // iProduct: Index to string descriptor that contains the string <Your Product Name> in Unicode
//设备序列号字符串描述索引值
0x03, // iSerialNumber: none
//USB设备所支持的配置数量
0x01 // bNumConfigurations: 1
}USB_DEVICE_DESCRIPTOR;

- 配置描述符 配置描述符:配置描述符定义了设备的配置信息,一个设备可以有多个配置描述符
static const u8 sConfigDescriptor[] = { //<Config Descriptor
//ConfiguraTIon
//bLength : 描述符大小.固定为0x09.
0x09, //bLength
//配置描述符类型.固定为0x02.
0x02, //DescriptorType : ConfigDescriptor
//返回整个数据的长度.指此配置返回的配置描述符,接口描述符以及端点描述符的全部大小
0, 0, //TotalLength
// 配置所支持的接口数.指该配置配备的接口数量,也表示该配置下接口描述符数量
0,//bNumInterfaces: 在set_descriptor函数里面计算
//作为Set Configuration的一个参数选择配置值
0x01, //bConfiguration Value - ID of this configuration
//用于描述该配置字符串描述符的索引
0x00, //Unused
// 供电模式选择.Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒
#if USB_ROOT2
0xA0, //Attributes:Bus Power remotewakeup
#else
0x80, //Attributes:Bus Power
#endif
//最大电流
50, //MaxPower * 2ma
};
- 字符串描述符 字符串描述符是可选的.如果不支持字符串描述符,其设备,配置,接口描述符内的所有字符串描述符索引都必须为0,这个的描述比较简单,不做其他讲解
static const u8 MANUFACTURE_STR[] = {
34, //该描述符的长度为34字节
0x03, //字符串描述符的类型编码为0x03
// Unicode编码字符串
0x4a, 0x00, //J
0x69, 0x00, //i
0x65, 0x00, //e
0x6c, 0x00, //l
0x69, 0x00, //i
0x20, 0x00, //
0x54, 0x00, //T
0x65, 0x00, //e
0x63, 0x00, //c
0x68, 0x00, //h
0x6e, 0x00, //n
0x6f, 0x00, //o
0x6c, 0x00, //l
0x6f, 0x00, //o
0x67, 0x00, //g
0x79, 0x00, //y
};
- 接口描述符 接口描述符:接口描述符说明了接口所提供的配置,一个配置所拥有的接口数量通过配置描述符的bNumInterfaces决定
//此处以USB游戏操作杆举例
typedef struct _USB_INTERFACE_DESCRIPTOR{
//描述符大小.固定为0x09
0x09, //bLength,
//接口描述符类型.固定为0x04
0x04, //bDescriptorType,
//该接口的编号,接口数量有设备描述符的bNumInterfaces字段决定
0x00, //bInterfaceNumber,
//备用接口编号
0x00, //bAlternateSetting,
//使用端点数量,端点0除外
0x01, //bNumEndpoint,
//接口类型代码,与设备描述符的bdeviceclass对应
0x03, //bInterfaceClass,HID(人机接口设备)
//接口子类类型代码,与设备描述符的bdevicesubclass对应
0x01, //bInterfaceSubClass HID:0x00:无子类 0x01:启动接口 2-255保留
//接口协议,与设备描述符的bdeviceProtocol对应
0x02, //bInterfaceProtocol,HID:0x00:none 0x01:键盘 0x02:鼠标 3-255:保留
//字符串描述符的索引
0x00 //iInterface
}USB_INTERFACE_DESCRIPTOR;
- 端点描述符 端点描述符:USB设备中的每个端点都有自己的端点描述符,由接口描述符中的bNumEndpoint决定其数量
typedef struct _USB_ENDPOINT_DESCRIPTOR_
{
///Endpoint IN
//描述符大小.固定为0x07
0x07,
//接口描述符类型.固定为0x05
0x05,
//USB设备的端点地址.Bit7,方向,对于控制端点可以忽略,
//1/0:IN/OUT.Bit6-4,保留.BIt3-0:端点号
0x80 | 1,
//端点属性.Bit7-2,保留.BIt1-0:00控制,01同步,02批量,03中断
0x02,
//本端点接收或发送的最大信息包大小
0x0040,//两个byte
0x01,
///Endpoint OUT
USB_DT_ENDPOINT_SIZE,
USB_DT_ENDPOINT,
MSD_BULK_EP_OUT,
USB_ENDPOINT_XFER_BULK,
LOBYTE(MAXP_SIZE_BULKOUT), HIBYTE(MAXP_SIZE_BULKOUT),
0x01,
}USB_ENDPOINT_DESCRIPTOR;
- HID描述符
//HIDDescriptor:
0x09, // bLength
//固定0x21,HID描述符
0x21, // bDescriptorType, HID Descriptor
//hid版本 1.0
0x00, 0x01, // bcdHID, HID Class Specification release NO.
//国家代码
0x00, // bCuntryCode, Country localization (=none)
//附加特定描述符数量,正常至少为1,要有报告描述符
0x01, // bNumDescriptors, Number of descriptors to follow
//附加描述符类型:0x21:HID 0x22:0x22 实体描述符:0x23
0x22, // bDescriptorType, Report Desc. 0x22, Physical Desc. 0x23
//附加特定描述符的字节长度
0,//LOW(ReportLength)
0, //HIGH(ReportLength)