由 bzhou830 贡献,Ai-Thinker 进行整理
【外设移植】USB设备之USB键盘+M61开发板 - DIY 经验分享 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)
1. 报告描述符
有了上一篇USB键盘的基础后,搞一个USB鼠标就简简单单了。和USB键盘一样,USB鼠标也是HID设备。因此只需要修改HID报告描述符就能成功的把USB键盘改造成一个USB鼠标。
将上一篇中的hid报告描述符改成如下的形式。
cpp
static const uint8_t hid_mouse_report_desc[HID_MOUSE_REPORT_DESC_SIZE] = {
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
0x09, 0x02, /* USAGE (Mouse) */
0xA1, 0x01, /* COLLECTION (Application) */
0x09, 0x01, /* USAGE (Pointer) */
0xA1, 0x00, /* COLLECTION (Physical) */
0x05, 0x09, /* USAGE_PAGE (Button) */
0x19, 0x01, /* USAGE_MINIMUM (Button 1) */
0x29, 0x03, /* USAGE_MAXIMUM (Button 3) */
0x15, 0x00, /* LOGICAL_MINIMUM (0) */
0x25, 0x01, /* LOGICAL_MAXIMUM (1) */
0x95, 0x03, /* REPORT_COUNT (3) */
0x75, 0x01, /* REPORT_SIZE (1) */
0x81, 0x02, /* INPUT (Data,Var,Abs) */
0x95, 0x01, /* REPORT_COUNT (1) */
0x75, 0x05, /* REPORT_SIZE (5) */
0x81, 0x01, /* INPUT (Cnst,Var,Abs) */
0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */
0x09, 0x30, /* USAGE (X) */
0x09, 0x31, /* USAGE (Y) */
0x09, 0x38, /* USAGE (Wheel) */
0x15, 0x81, /* LOGICAL_MINIMUM (-127) */
0x25, 0x7F, /* LOGICAL_MAXIMUM (127) */
0x75, 0x08, /* REPORT_SIZE (8) */
0x95, 0x03, /* REPORT_COUNT (3) */
0x81, 0x06, /* INPUT (Data,Var,Rel) */
0xC0, 0x09, /* END_COLLECTION, USAGE */
0x3c, 0x05, /* USAGE (Wheel), USAGE_PAGE */
0xff, 0x09, /* USAGE_PAGE (Vendor Defined), USAGE */
0x01, 0x15, /* USAGE (Vendor Defined 1), LOGICAL_MINIMUM */
0x00, 0x25, /* LOGICAL_MINIMUM (0), LOGICAL_MAXIMUM */
0x01, 0x75, /* LOGICAL_MAXIMUM (1), REPORT_SIZE */
0x01, 0x95, /* REPORT_SIZE (1), REPORT_COUNT */
0x02, 0xb1, /* REPORT_COUNT (2), FEATURE (Data,Var,Abs) */
0x22, 0x75, /* FEATURE (Data,Var,Abs), REPORT_SIZE */
0x06, 0x95, /* REPORT_SIZE (6), REPORT_COUNT */
0x01, 0xb1, /* REPORT_COUNT (1), FEATURE (Cnst,Var,Abs) */
0x01, 0xc0 /* FEATURE (Cnst,Var,Abs), END_COLLECTION */
};2. 返回报文
hid鼠标的通信数据形式和键盘是不一样的,发送数据的形式如下:

USB-HID键鼠通讯数据格式 - 技术干货 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)
可以看出来上述的4个字节其实可以用一个结构来清晰的表示出来:
cpp
struct hid_mouse {
uint8_t buttons;
int8_t x;
int8_t y;
int8_t wheel;
};那么在发送数据的时候只需要填写这个就可以了。
cpp
void hid_mouse_test(void)
{
/*!< move mouse pointer */
mouse_cfg.x = 5;
int ret = usbd_ep_start_write(HID_INT_EP, (uint8_t *)&mouse_cfg, 4);
if (ret < 0)
{
return;
}
}好了,这样HID鼠标就完成了。是不是很简单?
遇到问题?
如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

