《使枚举成功的USB设备成为WINUSB设备》
** 更新声明:各位不好意思,这篇文章是我本科期间所作,而且我已经很久没有涉足过硬件了,文中可能会有遗漏或者错误,并且很多关于USB的细节我已经忘记。
1. 将设备枚举为WINUSB设备
1.1 使设备能获取字符串描述符
1. 确保devicedescriptor中字符串index不为0。这里的Index应该是指iManufacturer, iProduct和iSerialNumber这三项,若设置为0则Host不会发送获取字符串的命令。
uint8_tUSBDeviceDesc[USB_LEN_DEV_DESC] =
{
0x12, /*bLength: 18bit*/
USB_DESC_TYPE_DEVICE, /*bDescriptorType: 0x02*/
0x00, /*bcdUSB */
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
0x00, /*bDeviceProtocol*/
USB_MAX_EP0_SIZE, /*bMaxPacketSize: 64bit*/
0x37, /*低位idVendor*/
0x05, /*高位idVendor*/
0x21, /*低位idVendor*/
0x43, /*高位idVendor*/
0x00, /*bcdDevice rel. 2.00*/
0x02,
USBD_IDX_MFC_STR, /*Index of manufacturer string USBD_IDX_MFC_STR*/
USBD_IDX_PRODUCT_STR, /*Index of product stringUSBD_IDX_PRODUCT_STR*/
USBD_IDX_SERIAL_STR, /*Index of serial number stringUSBD_IDX_SERIAL_STR*/
USBD_MAX_NUM_CONFIGURATION /*bNumConfigurations 固定为1,因为只有一个配置描述符*/
};
其中:
#define USBD_IDX_MFC_STR 0x01
#define USBD_IDX_PRODUCT_STR 0x02
#define USBD_IDX_SERIAL_STR 0x03
2. 根据索引值发送字符串描述符
1. 判断获取的标准命令wValue字段部分低8位。
2. 发送字符串描述符。其格式如下表:
其中bLength=字符串描述符的长度为原字符串长度*2+2,bDescriptorType固定为0x03,bString中的内容是unicode编码(就是在ASCII码前面加上0x00即可)。
例如:若想要的字符串为"LSQ",那么其字符串描述符应为:
Uint8_tUSBManufactoryString[USB_LEN_MAU_STRING]=
{
USB_LEN_MAU_STRING, // 这里是0x08
0x03,
0x4C, //L
0x00,
0x53, //S
0x00,
0x51, //Q
0x00
}
1.2 处理获取操作系统字符串描述符的标准命令
当上文提到的字符串描述符正确上传到主机上时(可以用USB monitor)检测到。此时Host会发送获取操作系统字符串描述符(OS String Descriptor)。它包含OS string descriptor和OS feature descriptors。此时按照下文所述步骤操作:
1、主机发送要求获取索引值为0XEE的字符串(即OSString Descriptor)的命令。其标准请求命令格式为: