STM32 USB复合设备,USB键盘+自定义HID设备

上面是我创建的群聊,欢迎新朋友的加入。

最近研究USB复合设备

主要是把键盘和电脑音量控制两个东西给合并成一个设备

首先要知道的一点的是,不论是键盘、鼠标、或者这个标准的HID用户控制设备,本质都是HID设备

所以对于这个类型的复合设备,只要端点大小足够,其他没什么变动的,无非是修改下报告描述符

因为都是HID设备,也不需要额外的端点

关于报告描述符,我这不多解释,可以参考https://www.cnblogs.com/AlwaysOnLines/p/4552840.htm

目录

1.HID定义的设备类

2.关于报告ID

3.修改端点大小

4.报告描述符

5.查看设备

6.测试


1.HID定义的设备类

STM32 USB复合设备,USB键盘+自定义HID设备_第1张图片

STM32 USB复合设备,USB键盘+自定义HID设备_第2张图片

STM32 USB复合设备,USB键盘+自定义HID设备_第3张图片

上面是HID定义的一些设备功能

2.关于报告ID

 Report ID放在信息包中报表数据之前,设备可以支持多个相同类型的报表,每一个报表包含不同的数据与其特有的ID。
                        在报表描述符中,Report ID项目作用于其后续所有的项目,直到遇到下一个Report ID为止。如果报表描述符中没有Report ID项目,默认的ID值是0,描述符不能定义一个为0的Report ID,输入报表、输出报表与特征报表可以分享同一个Report ID。
                        在Set_Report和Get_Report请求传输中,主机在设置事务的wValue字段的低字节中指定一个Report ID。在中断传输中如果接口支持一个以上的Report ID,Report ID必须是传送报表中的第一个字节。如果接口只支持数值为0的默认Report ID,此Report ID不应该在中断传输中随着报表一起传送。

3.修改端点大小

#define HID_EPIN_ADDR                 0x81
#define HID_EPIN_SIZE                 0x40
#define HID_EPOUT_ADDR                0x01
#define HID_EPOUT_SIZE                0x40

键盘只有8个字节,但是因为是复合设备,传输的时候要考虑报告ID的数据,会多出一个字节

4.报告描述符

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
0x05, 0x01,// USAGE_PAGE (Generic Desktop)
0x09, 0x06,// USAGE (Keyboard)
0xa1, 0x01,// COLLECTION (Application)
0x85, 0x01, //Report ID (1)  
0x05, 0x07,// USAGE_PAGE (Keyboard)
0x19, 0xe0,// USAGE_MINIMUM (Keyboard LeftControl)
0x29, 0xe7,// USAGE_MAXIMUM (Keyboard Right GUI)
0x15, 0x00,// LOGICAL_MINIMUM (0)
0x25, 0x01,// LOGICAL_MAXIMUM (1)
0x75, 0x01,// REPORT_SIZE (1)
0x95, 0x08,// REPORT_COUNT (8)
0x81, 0x02,// INPUT (Data,Var,Abs)
0x95, 0x01,// REPORT_COUNT (1)
0x75, 0x08,// REPORT_SIZE (8)
0x81, 0x03,// INPUT (Cnst,Var,Abs)
0x95, 0x05,// REPORT_COUNT (5)
0x75, 0x01,// REPORT_SIZE (1)
0x05, 0x08,// USAGE_PAGE (LEDs)
0x19, 0x01,// USAGE_MINIMUM (Num Lock)
0x29, 0x05,// USAGE_MAXIMUM (Kana)
0x91, 0x02,// OUTPUT (Data,Var,Abs)
0x95, 0x01,// REPORT_COUNT (1)
0x75, 0x03,// REPORT_SIZE (3)
0x91, 0x03,// OUTPUT (Cnst,Var,Abs)
0x95, 0x06,// REPORT_COUNT (6)
0x75, 0x08,// REPORT_SIZE (8)
0x15, 0x00,// LOGICAL_MINIMUM (0)
0x25, 0xFF,// LOGICAL_MAXIMUM (255)
0x05, 0x07,// USAGE_PAGE (Keyboard)
0x19, 0x00,// USAGE_MINIMUM (Reserved (no event indicated))
0x29, 0x65,// USAGE_MAXIMUM (Keyboard Application)
0x81, 0x00,// INPUT (Data,Ary,Abs)
0xc0,

0x05, 0x0c,  
0x09, 0x01,
0xa1, 0x01,  
0x85, 0x03, //Report ID (1)  
0xa1, 0x00, 
0x09, 0xe9, 
0x09, 0xea, 
0x09, 0xe2,   
0x09, 0xcd,
0x35, 0x00,  
0x45, 0x07, 
0x15, 0x00,
0x25, 0x01,
0x75, 0x01,
0x95, 0x04, 
0x81, 0x02, 
0x75, 0x01,
0x95, 0x04, 
0x81, 0x01, 
0xc0, 
0xc0

}; 

如上是修改之后的报告描述符

5.查看设备

可以看到同时存在了两个设备,一个键盘,一个控制设备

6.测试

STM32 USB复合设备,USB键盘+自定义HID设备_第4张图片

STM32 USB复合设备,USB键盘+自定义HID设备_第5张图片

键盘功能和音量调节都能使用

你可能感兴趣的:(USB相关)