USB设备实现两个功能有两种方案
1、只使用一个接口,,但是使用两个应用集合和两个报告
2、使用两个接口,一个接口实现键盘功能,一个接口实现CUSTOM-HID功能
这里先使用第一种方案。
第一步,先使用cubemx实现创建一个工程,实现CUSTOM-HID功能。
第二步,修改报告描述符。
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1) 表示一个报文标签之类的用途类页
0x09, 0x01, // USAGE (Vendor Usage 1) 表示一个报告ID标志
0xa1, 0x01, // COLLECTION (Application) 表示应用集合,要以下面最后的0xc0结束它
0X85, 0X01,//报告ID
0x09, 0x01, // USAGE (Vendor Usage 1)同下同名解析
0x15, 0x00, // LOGICAL_MINIMUM (0) 同下同名解析
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 同下同名解析
0x95, 0x40, // REPORT_COUNT (64) 同下REPORT_COUNT
0x75, 0x08, // REPORT_SIZE (8) 同下REPORT_SIZE
0x81, 0x02, // INPUT (Data,Var,Abs) 表示USB要输入数据到PC的功能
0x09, 0x01, // USAGE (Vendor Usage 1) 每个功能的一个卷标志
0x15, 0x00, // LOGICAL_MINIMUM (0) 表示每个传输数据限定为0
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 表示每个传输数据的最大值限定为255
0x95, 0x40, // REPORT_COUNT (64) 每次接收的数据长度,这里是64位
0x75, 0x08, // REPORT_SIZE (8) 传输字段的宽度为8bit,表示每个传输的数据范围为0~ffff ffff
0x91, 0x02, // OUTPUT (Data,Var,Abs) 表示USB设备要接收PC的数据的功能
0xc0, // END_COLLECTION 结束标志
0x05, 0x01,//USAGE_PAGE (Generic Desktop)
0x09, 0x06,//USAGE (Keyboard)
0xa1, 0x01,//COLLECTION (Application)
0X85, 0X02,//报告ID2
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
};
第三步:修改报告描述符大小
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 101
第四步:此时已经可以枚举成功,但是需要注意发送的内容前面要加报告的ID号。
例如:
1、发送键盘按下操作。本来应该发送八个字节,但是因为有了报告ID,此处要发送九个字节。
uint8_t buffer[9] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
buffer[0] = 2;//报告ID
buffer[1] = 0;
buffer[2] = 0;
buffer[3] = 0X16;//‘S’键值
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, buffer, sizeof(buffer));
HAL_Delay(50);
2、发送HID数据。本来应该发送64个字节,但是因为有了报告ID,此处要发送65个字节。
uint8_t send_buf[65] = {//定义一个USB的发送BUFF
1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64};
send_buf[0] = 1;//报告ID
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, send_buf, sizeof(send_buf));
//实际发送到上位机的数据有65个,一个报文ID:1 + 64个send_buf 数据,一共65个数据到上位机
第五步:修改接收数据。接收到数据后,第一个字节为报告ID,后面的才是真实数据。
本文发布于:2024-02-01 04:04:47,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170673149133725.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |