【外设移植】USB设备之USB鼠标+M61开发板

[复制链接]
查看2857 | 回复20 | 2024-1-9 15:38:52 | 显示全部楼层 |阅读模式

【外设移植】USB设备之USB键盘+M61开发板 - DIY 经验分享 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)

1. 报告描述符

有了上一篇USB键盘的基础后,搞一个USB鼠标就简简单单了。和USB键盘一样,USB鼠标也是HID设备。因此只需要修改HID报告描述符就能成功的把USB键盘改造成一个USB鼠标。

将上一篇中的hid报告描述符改成如下的形式。

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,

    0x15, 0x81, /*     LOGICAL_MINIMUM (-127) */
    0x25, 0x7F, /*     LOGICAL_MAXIMUM (127) */
    0x75, 0x08, /*     REPORT_SIZE (8) */
    0x95, 0x03, /*     REPORT_COUNT (2) */

    0x81, 0x06, /*     INPUT (Data,Var,Rel) */
    0xC0, 0x09,
    0x3c, 0x05,
    0xff, 0x09,

    0x01, 0x15,
    0x00, 0x25,
    0x01, 0x75,
    0x01, 0x95,

    0x02, 0xb1,
    0x22, 0x75,
    0x06, 0x95,
    0x01, 0xb1,

    0x01, 0xc0 /*   END_COLLECTION */
};

2. 返回报文

hid鼠标的通信数据形式和键盘是不一样的,发送数据的形式如下:

image.png

USB-HID键鼠通讯数据格式 - 技术干货 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)

可以看出来上述的4个字节其实可以用一个结构来清晰的表示出来:

struct hid_mouse {
    uint8_t buttons;
    int8_t x;
    int8_t y;
    int8_t wheel;
};

那么在发送数据的时候只需要填写这个就可以了。

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鼠标就完成了。是不是很简单?

本帖被以下淘专辑推荐:

选择去发光,而不是被照亮
回复

使用道具 举报

bzhou830 | 2024-1-9 15:39:58 | 显示全部楼层
附上代码

02mouse.zip

7.32 KB, 下载次数: 9

选择去发光,而不是被照亮
回复

使用道具 举报

WT_0213 | 2024-1-9 15:42:31 | 显示全部楼层
回复

使用道具 举报

bzhou830 | 2024-1-9 15:48:28 | 显示全部楼层

大佬真积极,哈哈
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

1084504793 | 2024-1-9 15:59:54 | 显示全部楼层
回复

使用道具 举报

爱笑 | 2024-1-9 16:15:28 | 显示全部楼层
用心做好保姆工作
回复

使用道具 举报

曹县 | 2024-1-9 16:18:19 | 显示全部楼层
回复

使用道具 举报

bzhou830 | 2024-1-9 16:42:57 | 显示全部楼层
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

bzhou830 | 2024-1-9 16:45:29 | 显示全部楼层
选择去发光,而不是被照亮
回复 支持 反对

使用道具 举报

干簧管 | 2024-1-9 19:18:40 | 显示全部楼层
玛丽哥怎么完成得这么迅速
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则