Skip to content

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 坐标
  • 压力

Clone this wiki locally