其实这个问题很多人都玩过了,而且HID Spec上有标准例子,但是USB鼠标和键盘的确很有意思,而且俺还尝试了一点和别人不一样的东西,在此以记之。
HID SPEC上讲的键盘和鼠标都是支持boot的,就是可以被Bios支持的,比如在开机的时候设置Bios的时候就可以用。因此那个Report Descriptor真的是相当的复杂啊,都63个字节了,就差一个字节就超过俺的EP0的Max Pack Size。其实介绍Report Descriptor的最好网络文章是《USB/HID设备报告描述符详解》,看用词像个台湾同胞写的,可以在下列地址阅读:
http://blog.chinaunix.net/u2/63560/showart.php?id=1900045
其实这个似乎都还是比较复杂,我做了一个不支持boot的键盘的Report Descriptor,只支持一个字节的输入,其实一个字节也是可以输入101个键的,HID Spec里面的Descriptor其实是支持6个键同时输入的,所以用了6个字节。下面俺的简陋型HID Descriptor就是这个样子的:
char HidBoardReportDescriptor[23] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x07, // USAGE_PAGE (Keyboard)
0x19, 0x1E, // USAGE_MINIMUM (Keyboard ! and 1)
0x29, 0x25, // USAGE_MAXIMUM (Keyboard * and 8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0xff, // LOGICAL_MAXIMUM (255)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x00, // I