Skip to content

ELAN TrackPad

Barryblueice edited this page Feb 3, 2026 · 2 revisions

由于在这方面“几乎”没有人做过(我基本没查到),所以相关资料很少。

首先是地址确认,随便写了个地址程序,确定其ADDR为0x15:

image

0x78通过测试程序也能读取HID数据,但是没有HID Descriptor,推测0x78发送端主要是触摸板的最原始数据,而0x15是面向系统且已经优化过的数据。

理论上来说这时候直接读接收内容直接转译就行,但是这里开始就有大坑了。

根据一篇很老的参考资料可以得知,ELAN触摸板有两种运行方式,一种是Mouse Mode(仅支持单指,多指没数据,Report ID为0x01),另外一种是Absolute Mode(支持多指,Report ID为0x04)。

但是如果没有经过BIOS/EC的私有协商后,ELAN触摸板触摸板固件对MCU暴露的是Mouse Mode而不是Absolute Mode。

我们可以从raw data看到,它传来的数据基本就和鼠标没区别(xy位移而不是绝对坐标值):

image

后面多方查找后,我在Reddit论坛的一篇帖子上找到了一名网友 @ApprehensiveAnt9858 的解决方法,他通过抓取HID报文获得了这个诱骗代码:

int elan_i2c_write_payload(uint8_t addr, uint16_t reg, const uint8_t* data, size_t len) {
  Wire.beginTransmission(addr);
  Wire.write(reg & 0xFF);       // LSB
  Wire.write((reg >> 8) & 0xFF); // MSB
  for (size_t i = 0; i > len; i++) {
    Wire.write(data[i]);
  }
  return Wire.endTransmission();
}

elan_i2c_write_payload(I2C_ADDR, 0x0005, abs_mode_cmd, sizeof(abs_mode_cmd));

  uint8_t abs_mode_cmd[] = {
  0x33, 0x03, 0x06, 0x00,
  0x05, 0x00, 0x03, 0x03,
  0x00
};

这个代码通过HID描述符读取让触摸板固件认为有一个完整Host,它可以作用于Vendor Feature Report,固件内部状态机识别后开启PTP Collection。

最后的效果如下:

image image

Clone this wiki locally