字符串描述符是可选的。如果设备不支持字符串描述符,则必须将对设备,配置和接口描述符中的字符串描述符的所有引用重置为零。字符串描述符使用Unicode标准。
例程定义了4个字符串描述符。
const uint8_t usbDeviceStringLangID[USB_DEVICE_STRING_LANGID] =
{
USB_DEVICE_STRING_LANGID,
USB_STRING_DESCRIPTOR_TYPE,
0x09,
0x04
}; /* LangID = 0x0409: U.S. English */
const uint8_t usbDeviceStringVendor[USB_DEVICE_STRING_VENDOR] =
{
USB_DEVICE_STRING_VENDOR, /* Size of Vendor string */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType*/
/* Manufacturer: "STMicroelectronics" */
'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,
'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,
'c', 0, 's', 0
};
const uint8_t usbDeviceStringProduct[USB_DEVICE_STRING_PRODUCT] =
{
USB_DEVICE_STRING_PRODUCT, /* bLength */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, ' ', 0, 'J', 0,
'o', 0, 'y', 0, 's', 0, 't', 0, 'i', 0, 'c', 0, 'k', 0
};
uint8_t usbDeviceStringSerial[USB_DEVICE_STRING_SERIAL] =
{
USB_DEVICE_STRING_SERIAL, /* bLength */
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
'S', 0, 'T', 0, 'M', 0, '1', 0, '3', 0
};
和设备描述符类似,结构Device_Property有一个函数是获取字符描述符的。
ONE_DESCRIPTOR stUsbStringDescriptor[] =
{
{(uint8_t*)usbDeviceStringLangID, USB_DEVICE_STRING_LANGID},
{(uint8_t*)usbDeviceStringVendor, USB_DEVICE_STRING_VENDOR},
{(uint8_t*)usbDeviceStringProduct, USB_DEVICE_STRING_PRODUCT},
{(uint8_t*)usbDeviceStringSerial, USB_DEVICE_STRING_SERIAL}
};
uint8_t *usbClassGetStringDescriptor(uint16_t Length)
{
uint8_t wValue0 = pInformation->USBwValue0;
if (wValue0 >= 4)
{
return NULL;
}
else
{
return Standard_GetDescriptorData(Length, &stUsbStringDescriptor[wValue0]);
}
}
注意设备描述符中的iVendor、iProduct、iSerialNum,它们正好对应在stUsbStringDescriptor中的位置,即USB主机得到设备描述符就可以知道对应的厂家,产品和产品序列号所对应的字符串描述符。
索引值0默认对应usbDeviceStringLangID。