以例程JoyStickMouse为例说明USB描述符。JoyStickMouse是一个USB HID设备。
USB设备只会有一个设备描述符,是设备连接到总线上时USB主机所读取的第一个描述符。
const uint8_t usbDeviceDescriptor[18] =
{
0x12, /*bLength */
USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
0x00, /*bcdUSB */
0x02,
0x00, /*bDeviceClass*/
0x00, /*bDeviceSubClass*/
0x00, /*bDeviceProtocol*/
0x40, /*bMaxPacketSize 64*/
0x83, /*idVendor (0x0483)*/
0x04,
0x10, /*idProduct = 0x5710*/
0x57,
0x00, /*bcdDevice rel. 2.00*/
0x02,
1, /*iVendor: Index of string descriptor describing manufacturer */
2, /*iProduct: Index of string descriptor describing product*/
3, /*iSerialNum: Index of string descriptor describing the device serial number */
0x01 /*bNumConfigurations*/
};
a) bLength: 描述符的长度,设备描述符固定长度为18个字节。
b) bDescriptorType: 描述符的类型,设备描述符固定是0x01。
c) bcdUSB: 设备符合的USB标准版本,2字节长。bcdUSB字段的值为0xJJMN版本JJ.M.N(JJ - 主要版本号,M - 次要版本号,N - 次要版本。这里的值是0x0200,表示符合的USB标准为v2.00。
d) bDeviceClass: 设备符合的USB的Class类型。如果是0,表示这个设备的各个接口有自己符合的Class类型;如果是1到0xfe,表示各个接口共同的类定义;如果是0xff,表示自定义类。
e) bDeviceSubClass: 设备符合的USB的SubClass类型,和bDeviceClass有关,如果BDeviceClass为0xff,这个值就无意义。
f) bDeviceProtocol: 使用的协议。这个值也是和bDeviceClass、bDeviceSubClass相关,如果是0x00, 表示这个设备不支持Class相关的协议;如果是0xff,表示自定义协议。
d) bMaxPacketSize: 端点0的最大包大小(仅8,16,32,64为合法值)
e) idVendor: 厂商标志ID(由USB-IF组织分配),2个字节
f) idProduct: 产品标志ID(由厂商分配),2个字节
g) bcdDevice: 设备版本号,2个字节
h) iVendor: 描述厂商信息的字符串描述符的索引值
i) iProduct: 描述产品信息的字串描述符的索引值
j) iSerialNum:描述设备序列号信息的字串描述符的索引值
k) bNumConfigurations: 配置描述符个数
在前面的结构Device_Property有一个函数usbClassGetDeviceDescriptor就是usb库中获取设备描述符。
ONE_DESCRIPTOR stUsbDeviceDescriptor =
{
(uint8_t*)usbDeviceDescriptor,
USB_DEVICE_DESCRIPTOR_LEN
};
uint8_t *usbClassGetDeviceDescriptor(uint16_t Length)
{
return Standard_GetDescriptorData(Length, &stUsbDeviceDescriptor);
}