分析键盘复制粘贴的HID描述符

下面是自定义复制(Ctrl+C)和粘贴(Ctrl+V)描述符

const u8 use_hid_descriptor[] = {
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x06,                    // USAGE (Keyboard)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x85, 0x01,                    //   REPORT_ID (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    0x09, 0xe0,                    //   USAGE (Keyboard LeftControl)
    0x81, 0x06,                    //   INPUT (Data,Var,Rel)
    0x09, 0x06,                    //   USAGE (Keyboard c and C)
    0x81, 0x06,                    //   INPUT (Data,Var,Rel)
    0x09, 0x19,                    //   USAGE (Keyboard v and V)
    0x81, 0x06,                    //   INPUT (Data,Var,Rel)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x75, 0x05,                    //   REPORT_SIZE (5)
    0x81, 0x07,                    //   INPUT (Cnst,Var,Rel)                    
    0xc0,                          // END_COLLECTION
};
  1. 全局设置
    0x05, 0x01
    USAGE_PAGE (Generic Desktop)
    设备属于通用桌面设备类别(如键盘、鼠标)。

    0x09, 0x06
    USAGE (Keyboard)
    具体用途为键盘设备。

    0xA1, 0x01
    COLLECTION (Application)
    开始一个应用集合,包含后续所有相关项。

  2. 报告配置
    0x85, 0x01
    REPORT_ID (1)
    定义输入报告的ID为1(用于区分多个报告)。

  3. 按键状态定义
    0x75, 0x01
    REPORT_SIZE (1)
    每个字段占1位。

    0x95, 0x01
    REPORT_COUNT (1)
    每项包含1个字段。

    0x15, 0x00
    LOGICAL_MINIMUM (0)
    逻辑最小值为0(按键未按下)。

    0x25, 0x01
    LOGICAL_MAXIMUM (1)
    逻辑最大值为1(按键按下)。

  4. 具体按键映射
    0x05, 0x07
    USAGE_PAGE (Keyboard)
    切换到键盘用途页,定义具体按键。

    左Ctrl键

    0x09, 0xE0
    USAGE (Keyboard LeftControl)
    左Ctrl键的Usage ID为0xE0。

    0x81, 0x06
    INPUT (Data, Var, Abs)
    数据字段,变量类型(每个位独立),绝对值(0或1)。

    c键

    0x09, 0x06
    USAGE (Keyboard c and C)
    c键的Usage ID为0x06。

    0x81, 0x06
    同上,对应输入字段。

    v键

    0x09, 0x19
    USAGE (Keyboard v and V)
    v键的Usage ID为0x19。

    0x81, 0x06
    同上,对应输入字段。

  5. 填充字段
    0x95, 0x01
    REPORT_COUNT (1)
    1个字段。

    0x75, 0x05
    REPORT_SIZE (5)
    每个字段占5位。

    0x81, 0x07
    INPUT (Cnst, Var, Abs)
    常量字段(值固定),变量类型,绝对值。
    用途:填充剩余的5位,确保报告长度为1字节(8位)。

  6. 结束集合
    0xC0
    END_COLLECTION
    结束应用集合。

报告结构
输入报告为1字节,格式如下(按位顺序):

| Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
|-------|-------|-------|-------|-------|-------|-------|-------|
|   填充(全0|   v键 |   c键 | 左Ctrl |

Bit 0: 左Ctrl键状态(0=未按下,1=按下)。

Bit 1: c键状态。

Bit 2: v键状态。

Bits 3-7: 填充位,固定为0。

0x03时代表按下Ctrl C(复制),0x05时代表按下Ctrl V(粘贴)。在上报0x03后需要再上报0x00表示按键松开。

更新:
在实际使用中连接手机发送0x03会直接打出字母C。没有达到复制的效果,可以使用下面的描述符进行描述

0x05, 0x01,        // Usage Page (Generic Desktop)
0x09, 0x06,        // Usage (Keyboard)
0xA1, 0x01,        // Collection (Application)
0x05, 0x07,        //   Usage Page (Keyboard)
// 修饰键部分(左Ctrl/Shift等)
0x19, 0xE0,        //   Usage Minimum (Left Control)
0x29, 0xE7,        //   Usage Maximum (Right GUI)
0x15, 0x00,        //   Logical Minimum (0)
0x25, 0x01,        //   Logical Maximum (1)
0x75, 0x01,        //   Report Size (1 bit)
0x95, 0x08,        //   Report Count (8位,对应8个修饰键)
0x81, 0x02,        //   Input (Data,Var,Abs) ; Modifier Keys
// 保留字节
0x95, 0x01,        //   Report Count (1)
0x75, 0x08,        //   Report Size (8位)
0x81, 0x03,        //   Input (Const,Var,Abs) ; Reserved
// 按键数组(最多6个按键)
0x05, 0x07,        //   Usage Page (Keyboard)
0x19, 0x00,        //   Usage Minimum (0x00)
0x29, 0x65,        //   Usage Maximum (0x65)
0x15, 0x00,        //   Logical Minimum (0)
0x25, 0x65,        //   Logical Maximum (101)
0x75, 0x08,        //   Report Size (8位)
0x95, 0x06,        //   Report Count (6个按键)
0x81, 0x00,        //   Input (Data,Array,Abs) ; Key Codes
0xC0,              // End Collection

Ctrl + C数据:{0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00};
Ctrl + V数据:{0x01, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00};
抬起:{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿着拖鞋满街跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值