STM32-USB学习系列(六):USB-HID键盘的实现以及键盘报文描述符的简介

目录

一、整体步骤

二、USB 鼠标HID更改成键盘HID步骤

1、使用STM32CubeMX生成鼠标HID模版,并且进行修改

2、修改HID的接口描述符与报文描述符

3、修改USBD_HID_Setup函数

4、添加以及修改键盘报文描述符(注意!)

三、调试过程中的一些总结

四、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 */
};

三、调试过程中的一些总结

  1. 网上有挺多关于STM32 键盘HID的实现,但无一外乎对应的将端点描述符的端点大小设置成0x08(即:发送一次报文的大小为8个字节),同时键盘发送的报文大小都是设置为8个字节,一开始我也是参照网上设置,将端点描述符大小和键盘发送的报文为8个字节,但是出现了发送完报文但是PC端没有反应的情况

  2. 后来我将端点描述符大小 HID_EPIN_SIZE 更改回0x04后,发送8字节的键盘报文,在PC上有对应的键盘输入了。但是出现了新的问题:发送一次过后,再发送空值,键盘也还是无法弹起(即:输入一个a,就一直在输入a,没有办法停止)。

  3. 最后,查询一番资料,我将 键盘报文描述符 中的内容修改,并且将键盘报文从原来8个字节改成4个字节后,就可以正常的发送和弹起了。

四、HID 报文相关资料

HID 报文pdf:链接:https://pan.baidu.com/s/1J7cupCmUc-ogXBkyE6dHiQ 提取码:d8xb 

  • 7
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鱼的猫丿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值