下面是自定义复制(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
};
-
全局设置
0x05, 0x01
USAGE_PAGE (Generic Desktop)
设备属于通用桌面设备类别(如键盘、鼠标)。0x09, 0x06
USAGE (Keyboard)
具体用途为键盘设备。0xA1, 0x01
COLLECTION (Application)
开始一个应用集合,包含后续所有相关项。 -
报告配置
0x85, 0x01
REPORT_ID (1)
定义输入报告的ID为1(用于区分多个报告)。 -
按键状态定义
0x75, 0x01
REPORT_SIZE (1)
每个字段占1位。0x95, 0x01
REPORT_COUNT (1)
每项包含1个字段。0x15, 0x00
LOGICAL_MINIMUM (0)
逻辑最小值为0(按键未按下)。0x25, 0x01
LOGICAL_MAXIMUM (1)
逻辑最大值为1(按键按下)。 -
具体按键映射
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
同上,对应输入字段。 -
填充字段
0x95, 0x01
REPORT_COUNT (1)
1个字段。0x75, 0x05
REPORT_SIZE (5)
每个字段占5位。0x81, 0x07
INPUT (Cnst, Var, Abs)
常量字段(值固定),变量类型,绝对值。
用途:填充剩余的5位,确保报告长度为1字节(8位)。 -
结束集合
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};