-
Notifications
You must be signed in to change notification settings - Fork 5
ELAN Touchpad
Barryblueice edited this page Feb 10, 2026
·
1 revision
ELAN TouchPad的HID描述符获取很简单,通过公用的HID寄存器地址请求就可以:
static bool elan_read_descriptors() {
esp_err_t ret;
uint8_t hid_desc[32] = {0};
uint8_t req[2] = {0x01, 0x00};
ret = i2c_master_transmit_receive(
dev_handle, req, 2, hid_desc, 30, pdMS_TO_TICKS(200)
);
if (ret != ESP_OK) return false;
report_desc_len = hid_desc[4] | (hid_desc[5] << 8);
uint16_t report_reg = hid_desc[6] | (hid_desc[7] << 8);
if (report_desc_len == 0 || report_desc_len > 1024) return false;
report_desc = malloc(report_desc_len);
if (!report_desc) return false;
uint8_t reg[2] = { report_reg & 0xFF, report_reg >> 8 };
ret = i2c_master_transmit_receive(
dev_handle, reg, 2, report_desc, report_desc_len, pdMS_TO_TICKS(500)
);
if (ret != ESP_OK) {
free(report_desc);
report_desc = NULL;
return false;
}
ESP_LOGI(TAG, "Report Descriptor (%d bytes)", report_desc_len);
hex_dump(report_desc, report_desc_len);以ELAN 33370A为例,HID Descriptor如下:
05 01 09 02 A1 01 85 01 09 01 A1 00 05 09 19 01 29 02 15 00 25 01 75 01 95 02 81 02 95 06 81 03 05 01 09 30 09 31 15 81 25 7F 75 08 95 02 81 06 75 08 95 05 81 03 C0 06 00 FF 09 01 85 0E 09 C5 15 00 26 FF 00 75 08 95 04 B1 02 C0 06 00 FF 09 01 A1 01 85 5C 09 01 95 0B 75 08 81 06 85 0D 09 C5 15 00 26 FF 00 75 08 95 04 B1 02 85 0C 09 C6 96 88 04 75 08 B1 02 85 0B 09 C7 95 82 75 08 B1 02 C0 05 0D 09 05 A1 01 85 04 09 22 A1 02 15 00 25 01 09 47 09 42 95 02 75 01 81 02 75 01 95 02 81 03 95 01 75 04 25 0F 09 51 81 02 05 01 15 00 26 5F 0E 75 10 55 0D 65 11 09 30 35 00 46 B4 2D 95 01 81 02 46 20 1C 26 D5 08 26 D5 08 09 31 81 02 05 0D 15 00 25 64 95 03 C0 55 0C 66 01 10 47 FF FF 00 00 27 FF FF 00 00 75 10 95 01 09 56 81 02 09 54 25 7F 95 01 75 08 81 02 05 09 09 01 25 01 75 01 95 01 81 02 95 07 81 03 09 C5 75 08 95 02 81 03 05 0D 85 02 09 55 09 59 75 04 95 02 25 0F B1 02 85 07 09 60 75 01 95 01 15 00 25 01 B1 02 95 0F B1 03 06 00 FF 06 00 FF 85 06 09 C5 15 00 26 FF 00 75 08 96 00 01 B1 02 C0 05 0D 09 0E A1 01 85 03 09 22 A1 00 09 52 15 00 25 0A 75 10 95 01 B1 02 C0 09 22 A1 00 85 05 09 57 09 58 75 01 95 02 25 01 B1 02 95 0E B1 03 C0 C0
解析如下:
Report ID 1:鼠标 / 相对移动
| 字节顺序 | 内容 | 含义 |
|---|---|---|
| 05 01 | Usage Page (Generic Desktop) | 顶层控制类型 |
| 09 02 | Usage (Mouse) | 鼠标 |
| A1 01 | Collection (Application) | 顶层集合 |
| 85 01 | Report ID 1 | 报告 ID 1 |
| 05 09 | Usage Page (Button) | 按钮 |
| 19 01 | Usage Minimum (Button 1) | 最小按钮号 |
| 29 02 | Usage Maximum (Button 2) | 最大按钮号 |
| 15 00 | Logical Min 0 | 逻辑最小值 |
| 25 01 | Logical Max 1 | 逻辑最大值 |
| 75 01 | Report Size 1 bit | 每个按钮占 1 bit |
| 95 02 | Report Count 2 | 两个按钮 |
| 81 02 | Input (Data, Variable, Absolute) | 输入按钮状态 |
| 95 06 | Report Count 6 | 填充 6 bits |
| 81 03 | Input (Constant) | 常量填充 |
| 05 01 | Usage Page (Generic Desktop) | X/Y 移动 |
| 09 30 | Usage (X) | X 轴 |
| 09 31 | Usage (Y) | Y 轴 |
| 15 81 | Logical Min -127 | 相对移动最小值 |
| 25 7F | Logical Max 127 | 相对移动最大值 |
| 75 08 | Report Size 8 | 每轴 8 bits |
| 95 02 | Report Count 2 | X/Y 两个值 |
| 81 06 | Input (Data, Variable, Relative) | 相对移动 |
Report ID 14:厂商自定义
| 内容 | 含义 |
|---|---|
| 06 00 FF | Usage Page (Vendor-defined) |
| 09 01 | Usage |
| 85 0E | Report ID 14 |
| 09 C5 | Vendor usage |
| 15 00 | Logical Min 0 |
| 26 FF 00 | Logical Max 255 |
| 75 08 | Report Size 8 bits |
| 95 04 | Report Count 4 bytes |
| B1 02 | Feature (Data, Variable) |
Report ID 5C / 0D / 0C / 0B:多点触控
| 内容 | 含义 |
|---|---|
| 06 00 FF | Vendor usage |
| 09 01 | Usage |
| A1 01 | Collection (Application) |
| 85 5C | Report ID 92 (0x5C) |
| 09 01 | Usage |
| 95 0B | Report Count 11 bytes |
| 75 08 | Report Size 8 bits |
| 81 06 | Input (Data, Variable) |
包含手指状态、X/Y 坐标、压力、手势等数据,每个触控点有独立字节。
Report ID 0D / 0C / 0B:手指状态、X/Y、压力
| 内容 | 含义 |
|---|---|
| 09 C5 / 09 C6 / 09 C7 | Vendor-defined usages |
| 15 00 / 26 FF 00 | Logical Min/Max |
| 75 08 / 95 N | Report Size / Count |
| B1 02 / 81 02 / 81 03 | Input 或 Feature |
| C0 | Collection end |
每个手指的状态包括:
- Tip Switch (触碰状态)
- In Range (手指在触摸板范围内)
- X/Y 坐标
- 压力