目录
1、使用STM32CubeMX生成鼠标HID模版,并且进行修改
一、整体步骤
- 使用STM32CubeMX生成 鼠标HID模版,并进行修改
- 修改HID 接口描述符,以及报文描述符
- 修改USBD_HID_Setup 函数
- 添加并且修改键盘报文描述符报文
二、USB 鼠标HID更改成键盘HID步骤
1、使用STM32CubeMX生成鼠标HID模版,并且进行修改
鼠标HID相关内容可以查看:STM32-USB学习系列(四):USB-HID模拟鼠标功能
2、修改HID的接口描述符与报文描述符
- 注意:端点描述符不做修改!即 HID_EPIN_SIZE 还是0x04 (对应4字节大小,后面在发送键盘报文的时候,需要将键盘的报文大小修改为 4个字节的数组或者结构体)
3、修改USBD_HID_Setup函数
- 在HID Setup的过程中会获取对应键盘报文描述符
4、添加以及修改键盘报文描述符(注意!)
- 修改部分为最后面 按键输入描述部分,将后面6个按键缩减为2个按键(即:从6个字节缩减到2个字节),配合上前面2个字节的输入报告,正好是4个字节,刚好符合原来HID端点描述符一次最多发送的大小
__ALIGN_BEGIN static uint8_t HID_KEYBOARD_ReportDesc[HID_KEYBOARD_REPORT_DESC_SIZE] __ALIGN_END =
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard) /* 用途为键盘 */
0xa1, 0x01, // COLLECTION (Application) /* 表示应用结合,必须以END_COLLECTION来结束 */
0x05, 0x07, // USAGE_PAGE (Keyboard) /* 用途页为按键 */
0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) /* 用途最小值 左Ctrl */
0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) /* 用途最大值 右GUI */
0x15, 0x00, // LOGICAL_MINIMUM (0) /* 逻辑最小值 0 */
0x25, 0x01, // LOGICAL_MAXIMUM (1) /* 逻辑最大值 1 */
0x75, 0x01, // REPORT_SIZE (1) /* 报告位大小(这个字段的宽度为1bit) */
0x95, 0x08, // REPORT_COUNT (8) /* 输入报告第一个字节(报告位大小 8bit) */
0x81, 0x02, // INPUT (Data,Var,Abs) /* 报告为输入用 , 从左ctrl到右GUI 8bit刚好构成1个字节*/
0x95, 0x01, // REPORT_COUNT (1) /* 报告位数量 1个 */
0x75, 0x08, // REPORT_SIZE (8) /* 输入报告的第二给字节(报告位大小 8bit) */
0x81, 0x03, // INPUT (Cnst,Var,Abs) /* 输入用的保留位,设备必须返回0 */
0x95, 0x05, // REPORT_COUNT (5) /* 报告位数量 5个 */
0x75, 0x01, // REPORT_SIZE (1) /* 报告位大小,1bit */
0x05, 0x08, // USAGE_PAGE (LEDs) /* 用途为LED */
0x19, 0x01, // USAGE_MINIMUM (Num Lock) /* 用途最小值 NUM Lock LED灯 */
0x29, 0x05, // USAGE_MAXIMUM (Kana) /* 用途最大值 Kana 灯 */
0x91, 0x02, // OUTPUT (Data,Var,Abs) /* 输出用途,用于控制LED等 */
0x95, 0x01, // REPORT_COUNT (1) /* 报告位数量 1个 */
0x75, 0x03, // REPORT_SIZE (3) /* 报告位大小 3bit */
0x91, 0x03, // OUTPUT (Cnst,Var,Abs)/* 用于字节补齐,跟前面5个bit进行补齐 */
0x95, 0x02,//0x06, // REPORT_COUNT (6) /* 报告位数量 6个*/
0x75, 0x08, // REPORT_SIZE (8) /* 报告位大小 8bit */
0x15, 0x00, // LOGICAL_MINIMUM (0) /* 逻辑最小值0 */
0x25, 0xFF, // LOGICAL_MAXIMUM (255) /* 逻辑最大值255 */
0x05, 0x07, // USAGE_PAGE (Keyboard) /* 用途页为按键 */
0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) /* 使用值最小为0 */
0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) /* 使用值最大为65 */
0x81, 0x00, // INPUT (Data,Ary,Abs) /* 输入用,变量,数组,绝对值 */
0xc0 /* END_COLLECTION */
};
三、调试过程中的一些总结
-
网上有挺多关于STM32 键盘HID的实现,但无一外乎对应的将端点描述符的端点大小设置成0x08(即:发送一次报文的大小为8个字节),同时键盘发送的报文大小都是设置为8个字节,一开始我也是参照网上设置,将端点描述符大小和键盘发送的报文为8个字节,但是出现了发送完报文但是PC端没有反应的情况
-
后来我将端点描述符大小 HID_EPIN_SIZE 更改回0x04后,发送8字节的键盘报文,在PC上有对应的键盘输入了。但是出现了新的问题:发送一次过后,再发送空值,键盘也还是无法弹起(即:输入一个a,就一直在输入a,没有办法停止)。
-
最后,查询一番资料,我将 键盘报文描述符 中的内容修改,并且将键盘报文从原来8个字节改成4个字节后,就可以正常的发送和弹起了。
四、HID 报文相关资料
HID 报文pdf:链接:https://pan.baidu.com/s/1J7cupCmUc-ogXBkyE6dHiQ 提取码:d8xb