USB 字符串描述符
2020-09-25
9026
8
字符串描述符是可选的.如果不支持字符串描述符,其设备描述符,配置描述符,接口描述符内的所有字符串描述符索引都必须为0.
字符串描述符的功能
USB规范中定义了大量的标识,而这些标识都是以十六进制显示的,这个机器来说是很方便的,但对于人来说,就比较麻烦了。总不能看到一个数值标识就去查表吧,当然这对于熟练开发USB设备的开发人员来说随着开发的积累会熟记于心,但对于使用这些USB设备的人员来说,就相当的不友好了。
为了提供比较友好的设备标识,USB规范中定义了字符串描述符,即使用人类的自然语言来描述设备的功能,生产厂家,生产序列号等。这里的自然语言可以为英文,也可以为中文,也可以为其它的自然语言。
为了解决字符串的跨国性,USB字符串使用UNICODE编码。
字符串描述符的定义
typedef struct _USB_STRING_DESCRIPTOR {
UCHAR bLength;
UCHAR bDescriptorType;
WCHAR bString[1];
} USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR;
- bLength : 描述符大小.由整个字符串的长度加上bLength和bDescriptorType的长度决定.
- bDescriptorType :字符串描述符类型.固定为0x03.
- bString[1] : Unicode编码字符串.
字符串函数代码
USB_STRING_DESCRIPTOR *GetStringDescriptor(const WCHAR *str)
{
size_t bLength = wcslen(str) * sizeof(WCHAR);
USB_STRING_DESCRIPTOR *pDescriptor = (USB_STRING_DESCRIPTOR *)ExAllocatePool(NonPagedPool, sizeof(USB_STRING_DESCRIPTOR) + bLength);
if (!pDescriptor) return NULL;
RtlZeroMemory(pDescriptor, sizeof(USB_DEVICE_DESCRIPTOR));
pDescriptor->bDescriptorType = 0x03;
pDescriptor->bLength = (2 + bLength);
RtlCopyMemory(pDescriptor->bString, str, bLength);
return pDescriptor;
}
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936