Skip to content

About ELAN TouchPad

Barryblueice edited this page Feb 10, 2026 · 2 revisions

The acquisition of the HID descriptor for ELAN TouchPad is quite simple. It can be achieved by simply requesting the common HID register address:

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);

For example, the HID descriptor of ELAN 33370A is as follows:

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

The analysis is as follows:

Report ID 1:Mouse / Relative movement

Mouse (Report ID 1)

Byte Sequence Content Meaning
05 01 Usage Page (Generic Desktop) Top-level control type
09 02 Usage (Mouse) Mouse
A1 01 Collection (Application) Top-level collection
85 01 Report ID 1 Report ID 1
05 09 Usage Page (Button) Buttons
19 01 Usage Minimum (Button 1) Minimum button number
29 02 Usage Maximum (Button 2) Maximum button number
15 00 Logical Min 0 Logical minimum
25 01 Logical Max 1 Logical maximum
75 01 Report Size 1 bit Each button occupies 1 bit
95 02 Report Count 2 Two buttons
81 02 Input (Data, Variable, Absolute) Input button state
95 06 Report Count 6 Padding 6 bits
81 03 Input (Constant) Constant padding
05 01 Usage Page (Generic Desktop) X/Y movement
09 30 Usage (X) X axis
09 31 Usage (Y) Y axis
15 81 Logical Min -127 Relative movement minimum
25 7F Logical Max 127 Relative movement maximum
75 08 Report Size 8 Each axis 8 bits
95 02 Report Count 2 Two values (X/Y)
81 06 Input (Data, Variable, Relative) Relative movement

Report ID 14: Vendor-defined

Content Meaning
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: Multi-touch

Content Meaning
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)

Contains finger state, X/Y coordinates, pressure, gestures, etc. Each touch point has independent bytes.


Report ID 0D / 0C / 0B: Finger state, X/Y, pressure

Content Meaning
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 or Feature
C0 Collection end

Each finger’s state includes:

  • Tip Switch (touch status)
  • In Range (finger within touchpad area)
  • X/Y coordinates
  • Pressure

Clone this wiki locally