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

上面是我的微信和QQ群,欢迎新朋友的加入。

最近研究USB复合设备

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

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

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

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

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

目录

1.HID定义的设备类

2.关于报告ID

3.修改端点大小

4.报告描述符

5.查看设备

6.测试


1.HID定义的设备类

上面是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.测试

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值