8H/32G系列-USB, 一个USB端点即可实现多媒体键盘
===@8H8K64U, @32G12K128源代码开源
USB-HID 键盘的按键大致可分为3类:
1、101/104个标准按键,包括普通的数字、字母、标点符号等常用按键
2、系统控制按键,包括睡眠、唤醒、关机等功能键
3、多媒体按键,包括音乐的播放、停止、音量控制以及互联网功能按键
之前STCAI官方给的USB键盘的范例程序中只能发送标准按键
系统控制按键和多媒体按键都无法发送,主要原因是在HID规范中
将标准按键、系统控制按键、多媒体按键分别定义到了不同的UsagePage
在原USB键盘的范例程序的基础上,对HID报告进行了一下修改
实现对系统控制按键和多媒体按键的支持
- char code HIDREPORTDESC[131] =
- {
- 0x05,0x01, //USAGE_PAGE(Generic Desktop);
- 0x09,0x06, //USAGE(Keyboard);
- 0xa1,0x01, //COLLECTION(Application);
- 0x85,0x01, // REPORT_ID(1)
- 0x05,0x07, // USAGE_PAGE(Key Codes);
- 0x19,0xe0, // USAGE_MINIMUM(224);
- 0x29,0xe7, // USAGE_MAXIMUM(231);
- 0x15,0x00, // LOGICAL_MINIMUM(0);
- 0x25,0x01, // LOGICAL_MAXIMUM(1);
- 0x75,0x01, // REPORT_SIZE(1);
- 0x95,0x08, // REPORT_COUNT(8);
- 0x81,0x02, // INPUT(Data,Variable);
- 0x75,0x08, // REPORT_SIZE(8);
- 0x95,0x01, // REPORT_COUNT(1);
- 0x81,0x01, // INPUT(Constant);
- 0x19,0x00, // USAGE_MINIMUM(0);
- 0x29,0x65, // USAGE_MAXIMUM(101);
- 0x15,0x00, // LOGICAL_MINIMUM(0);
- 0x25,0x65, // LOGICAL_MAXIMUM(101);
- 0x75,0x08, // REPORT_SIZE(8);
- 0x95,0x06, // REPORT_COUNT(6);
- 0x81,0x00, // INPUT(Data,Array);
- 0x05,0x08, // USAGE_PAGE(LEDs);
- 0x19,0x01, // USAGE_MINIMUM(1);
- 0x29,0x03, // USAGE_MAXIMUM(3);
- 0x15,0x00, // LOGICAL_MINIMUM(0);
- 0x25,0x01, // LOGICAL_MAXIMUM(1);
- 0x75,0x01, // REPORT_SIZE(1);
- 0x95,0x03, // REPORT_COUNT(3);
- 0x91,0x02, // OUTPUT(Data,Variable);
- 0x75,0x05, // REPORT_SIZE(5);
- 0x95,0x01, // REPORT_COUNT(1);
- 0x91,0x01, // OUTPUT(Constant);
- 0xc0, //END_COLLECTION;
-
- 0x05,0x0c, //USAGE_PAGE(Consumer Devices)
- 0x09,0x01, //USAGE(Consumer Control)
- 0xa1,0x01, //COLLECTION(Application)
- 0x85,0x02, // REPORT_ID(2)
- 0x19,0x00, // USAGE_MINIMUM(0)
- 0x2a,0x3c,0x02, // USAGE_MAXIMUM(572)
- 0x15,0x00, // LOGICAL_MINIMUM(0)
- 0x26,0x3c,0x02, // LOGICAL_MAXIMUM(572)
- 0x95,0x01, // REPORT_COUNT(1)
- 0x75,0x10, // REPORT_SIZE(16)
- 0x81,0x00, // INPUT(Data,Aryay)
- 0x75,0x08, // REPORT_SIZE(8);
- 0x95,0x06, // REPORT_COUNT(6);
- 0x81,0x01, // INPUT(Constant);
- 0xc0, //END_COLLECTION
-
- 0x05,0x01, //USAGE_PAGE(Generic Desktop)
- 0x09,0x80, //USAGE(System Control)
- 0xa1,0x01, //COLLECTION(Application)
- 0x85,0x03, // REPORT_ID(3)
- 0x19,0x81, // USAGE_MINIMUM(System Power Down)
- 0x29,0x83, // USAGE_MAXIMUM(System Wake Up)
- 0x15,0x00, // LOGICAL_MINIMUM(0)
- 0x25,0x01, // LOGICAL_MAXIMUM(1)
- 0x75,0x01, // REPORT_SIZE(1)
- 0x95,0x03, // REPORT_COUNT(3)
- 0x81,0x02, // INPUT(Data,Variable)
- 0x95,0x05, // REPORT_COUNT(5)
- 0x81,0x01, // INPUT(Constant)
- 0x75,0x08, // REPORT_SIZE(8);
- 0x95,0x07, // REPORT_COUNT(7);
- 0x81,0x01, // INPUT(Constant);
- 0xc0, //END_COLLECTION
- };
复制代码
IN报告1 报告字节 | 功能 | 1 | ID (1) | | 变更键(MAP) RGUI | RAlt | RShift | RCtrl | LGUI | LAlt | LShift | LCtrl |
| 3 | 保留 | 4 | 键码1 | 5 | 键码2 | 6 | 键码3 | 7 | 键码4 | 8 | 键码5 | 9 | 键码6 |
IN报告2 报告字节 | 功能 | 1 | ID (2) | | 多媒体键码(低字节)
| 3 | 多媒体键码(高字节)
| 4 | 保留
| 5 | 保留
| 6 | 保留
| 7 | 保留
| 8 | 保留
| 9 | 保留
|
IN报告3 报告字节 | 功能 | 1 | ID (3) | | | 3 | 保留
| 4 | 保留
| 5 | 保留
| 6 | 保留
| 7 | 保留
| 8 | 保留
| 9 | 保留
|
OUT报告1 报告字节 | 功能 | 1 | ID (1) | | 指示灯状态(MAP) 保留
| 保留
| 保留
| 保留
| 保留
| ScrollLock | CapLock | NumLock |
|
测试代码在实验箱9.62上测试通过
矩阵按键0:标准按键-数字1
矩阵按键1:标准按键-数字2
矩阵按键2:标准按键-字母a
矩阵按键3:标准按键-字母b
矩阵按键4:多媒体键-音量+
矩阵按键5:多媒体键-音量-
矩阵按键6:系统控制-睡眠
矩阵按键7:系统控制-唤醒
|