在对USB协议进行学习和移植的过程有个东西不可避免,肯定会遇到,那就是USB的设备描述符。这个东西始终在usb协议中发挥作用,从设备的枚举到设备的配置,都是由usb描述符进行修改的。今天在移植的时候这个整理了一下usb描述符有关的知识。
/********************************************不啰嗦的分割线***********************************************/
参考资料:深入浅出USB系统开发——基于ARM Cortex-M3 王川北 刘强
圈圈教你玩usb
http://www.openedv.com/thread-10971-1-1.html
USB采用USB标准描述符说明一个USB设备,这些描述符包括设备描述符、配置描述符、接口描述符、端点描述符和字串描述符。在stm32 usb库中有关描述符在usb_desc.c和usb_desc.h中。
在上个例程中并未对描述符进行修改,直接使用了原来配置,现在我们对描述符进行修改,在该示例中的配置为usb键盘的描述符设置。
设备描述符给出了usb的一般信息,一个usb设备只能有一个设备描述符。在stm32 usb库中有关配置及含义如图所示。
在usb库中除设备描述符以外的其他所有描述符均在Joystick_ConfigDescriptor[JOYSTICK_SIZ_CONFIG_DESC]这个数组中
如果对描述符进行增删后,注意更改数组大小,在usb_desc.h中定义。
以下为配置描述符的说明,在一个usb设备描述符下可以有多个配置描述符。
以下为接口描述符的说明,在一个usb配置描述符下可以有多个接口描述符。
端点描述符,每个端点只能用作输入或输出的一种,端点0不可配置。
HID为人机交互设备(Human Interface Device)的缩写,HID设备类除了支持标准USB描述符外,还自行定义了3种设备描述符,分别为HID描述符、报告描述符、物理描述符。一个HID设备只支持一个HID描述符;可以支持一个或多个报告描述符;物理描述符是可选的,发多数HID设备不需要使用它。
下面为为HID描述符及说明
//以下为HID描述符
/******************** Descriptor of Joystick Mouse HID ********************/
/* 18 */
0x09, /*bLength: HID Descriptor size 字节数*/
HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID 配置描述符类型*/
0x00, /*bcdHID: HID Class Spec release number 版本号*/
0x01,
0x00, /*bCountryCode: Hardware target country 国家语言代码*/
0x01, /*bNumDescriptors: Number of HID class descriptors to follow 描述符个数*/
0x22, /*bDescriptorType 下一个描述符类型*/
JOYSTICK_SIZ_REPORT_DESC,/*wItemLength: Total length of Report descriptor 报告描述符总长度*/
0x00,
下面为HID的报告描述符
const uint8_t Joystick_ReportDescriptor[JOYSTICK_SIZ_REPORT_DESC] =
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard/Keypad)
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x03, // INPUT (Cnst,Var,Abs)
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x25, 0xFF, // LOGICAL_MAXIMUM (255)
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00, // INPUT (Data,Ary,Abs)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x02, // REPORT_COUNT (2)
0x75, 0x01, // REPORT_SIZE (1)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x02, // USAGE_MAXIMUM (Caps Lock)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x06, // REPORT_SIZE (6)
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)
0xc0 // END_COLLECTION
}
好了,我们对上面的描述符进行修改后,编译下载,在电脑上可以识别出键盘,在后面的会继续介绍usb键盘的移植过程