上面是我创建的群聊,欢迎新朋友的加入。
最近研究USB复合设备
主要是把键盘和电脑音量控制两个东西给合并成一个设备
首先要知道的一点的是,不论是键盘、鼠标、或者这个标准的HID用户控制设备,本质都是HID设备
所以对于这个类型的复合设备,只要端点大小足够,其他没什么变动的,无非是修改下报告描述符
因为都是HID设备,也不需要额外的端点
关于报告描述符,我这不多解释,可以参考https://www.cnblogs.com/AlwaysOnLines/p/4552840.htm
目录
1.HID定义的设备类
2.关于报告ID
3.修改端点大小
4.报告描述符
5.查看设备
6.测试
上面是HID定义的一些设备功能
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不应该在中断传输中随着报表一起传送。
#define HID_EPIN_ADDR 0x81
#define HID_EPIN_SIZE 0x40
#define HID_EPOUT_ADDR 0x01
#define HID_EPOUT_SIZE 0x40
键盘只有8个字节,但是因为是复合设备,传输的时候要考虑报告ID的数据,会多出一个字节
__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
};
如上是修改之后的报告描述符
可以看到同时存在了两个设备,一个键盘,一个控制设备
键盘功能和音量调节都能使用