-
Notifications
You must be signed in to change notification settings - Fork 5
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