Skip to content

由 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

Released under the MIT License. Build Time 2026-09-11 14:52:23