最近做一个组合设备,说白了就是在一个usb 设备上面,实现2个或者更多功能,但是说实话中文的资料还是比较少,没找到多少比较靠谱的,就去外文网站翻翻了 还是不少的,下面我将自己的理解理清改一下,希望也可以帮助一些需要的,这里只对HID设备而言。
1. 关于配置符
如 上图,一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面 有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符,端点描述符定义了端点的大小,类 型等等。
也 就是说,我们可以采用多个接口,多个端点来实现不同的功能,这些是通过配置符描述来实现。注意的是,接口描述符:接口描述符里面的On this combined interface, you cannot apply boot device.(bInterfaceClass, bInterfaceSubclass, bInterfaceProtocol)= (0x03, 0x00, 0x00) = (HID class, no subclass, no protocol)。
例如:
/* USB Standard Device Descriptor */
const U8 USB_DeviceDescriptor[] =
{
USB_DEVICE_DESC_SIZE, /* bLength */
USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType */
WBVAL(0x0200), /* 2.00 */ /* bcdUSB */
0x00, /* bDeviceClass */
0x00, /* bDeviceSubClass */
0x00, /* bDeviceProtocol */
USB_MAX_PACKET0, /* bMaxPacketSize0 */
//WBVAL(0xC251), /* idVendor b4,04*/
//WBVAL(0x2501), /* idProduct 70,63*/
0xb4,0x04,
0x70,0x63,
WBVAL(0x0100), /* 1.00 */ /* bcdDevice */
0x01, /* iManufacturer */
0x02, /* iProduct */
0x03, /* iSerialNumber */
0x01 /* bNumConfigurations: one possible configuration*/
};
2 关于报表描述符
A report descriptor can include more than one top-level collection. The HID class driver enumerates the top-level collections of an input device and creates a physical device object (PDO) for each top-level collection.
实现多个功能的话,报表设置里面可以使用多个 report descriptor,并且通过 report ID来识别不同的功能。报表为1个的时候,report ID默认是0 ,如果有多个报表的时候,HID_ReportID GLOBAL项目设置,直到遇到下一个HID_ReportID之前,所以的项目用在这个ID的report上面。多个报表的时候,报表的ID不能设置为 0 。在使用的时候,在发送数据的前面第一个字节发送 report id来实现不同的报表。
以鼠标键盘组合设备为例报表如下:
Usage Page (Generic Desktop),
Usage (Keyboard),
Collection (Application),
Report ID (01),
Report Size (1),
Report Count (8),
Usage Page (Key Codes),
Usage Minimum (224),
Usage Maximum (231),
Logical Minimum (0),
Logical Maximum (1),
Input (Data, Variable, Absolute), ;Modifier byte
Report Count (1),
Report Size (8),
Input (Constant), ;Reserved byte
Report Count (5),
Report Size (1),
Usage Page (LEDs),
Usage Minimum (1),
Usage Maximum (5),
Output (Data, Variable, Absolute), ;LED report
Report Count (1),
Report Size (3),
Output (Constant), ;LED report padding
Report Count (6),
Report Size (8),
Logical Minimum (0),
Logical Maximum(255),
Usage Page (Key Codes),
Usage Minimum (0),
Usage Maximum (101),
Input (Data, Array),
End Collection
Usage Page (Generic Desktop),
Usage (Mouse),
Collection (Application),
Usage (Pointer),
Collection (Physical),
Report ID (02),
Report Count (3),
Report Size (1),
Usage Page (Buttons),
Usage Minimum (1),
Usage Maximum (3),
Logical Minimum (0),
Logical Maximum (1),
Input (Data, Variable, Absolute),
Report Count (1),
Report Size (5),
Input (Constant),
Report Size (8),
Report Count (2),
Usage Page (Generic Desktop),
Usage (X),
Usage (Y),
Logical Minimum (-127),
Logical Maximum (127),
Input (Data, Variable, Relative),
End Collection,
End Collection
使用的时候 数据发送格式如下:
offset (byte)
0 report ID (01)
1 modifier keys
2 padding
3 - 8 keycode array
For mouse,
offset (byte)
0 report ID (02)
1 buttons
2 X asis
3 Y axis
3 关于接口
所有的HID设备通过USB的控制管道(默认管道,即端点0)和中断管道与主机通信。
表1、USB HID规范定义的HID设备可用端点
管道
要求
说明
控制(端点0)
必须
传输USB描述符、类请求代码以及供查询的消息数据等
中断输入
必须
传输从设备到主机的输入数据
中断输出
可选
传输从主机到设备的输出数据
控制管道主要用于以下3个方面:
- 接收/响应USB主机的控制请示及相关的类数据
- 在USB主机查询时传输数据(如响应Get_Report请求等)
- 接收USB主机的数据
中断管道主要用于以下两个方面:
- USB主机接收USB设备的异步传输数据
- USB主机发送有实时性要求的数据给USB设备
4.实例:
可以参考一下网页:
http://www.cygnal.org/ubb/Forum9/HTML/001496.html
转载网址:http://hi.baidu.com/zsb517/blog/item/9db41c8653dfd434c65cc393.html