pms(4): elantech-v4 detection

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

pms(4): elantech-v4 detection

Ulf Brosziewski
With this patch, pms recognizes all elantech-v4 touchpads (see
https://marc.info/?l=openbsd-tech&m=156554256223597&w=2 ).  Some
models may have external hardware buttons, they are identified by
checking a flag in the firmware version number.

OK?

Index: dev/pckbc/pms.c
===================================================================
RCS file: /cvs/src/sys/dev/pckbc/pms.c,v
retrieving revision 1.88
diff -u -p -r1.88 pms.c
--- dev/pckbc/pms.c 26 Jan 2019 11:57:21 -0000 1.88
+++ dev/pckbc/pms.c 13 Aug 2019 21:46:49 -0000
@@ -143,6 +143,7 @@ struct elantech_softc {
  int max_x, max_y;
  int old_x, old_y;
 };
+#define ELANTECH_IS_CLICKPAD(sc) (((sc)->elantech->fw_version & 0x1000) != 0)

 struct pms_softc { /* driver status information */
  struct device sc_dev;
@@ -1945,9 +1946,7 @@ elantech_get_hwinfo_v4(struct pms_softc
  if (synaptics_query(sc, ELANTECH_QUE_FW_VER, &fw_version))
  return (-1);

- if ((fw_version & 0x0f0000) >> 16 != 6
-    && (fw_version & 0x0f0000) >> 16 != 8
-    && (fw_version & 0x0f0000) >> 16 != 15)
+ if ((fw_version & 0x0f0000) >> 16 < 6)
  return (-1);

  elantech->fw_version = fw_version;
@@ -1975,7 +1974,8 @@ elantech_get_hwinfo_v4(struct pms_softc
  elantech->flags |= ELANTECH_F_TRACKPOINT;

  hw->type = WSMOUSE_TYPE_ELANTECH;
- hw->hw_type = WSMOUSEHW_CLICKPAD;
+ hw->hw_type = (ELANTECH_IS_CLICKPAD(sc)
+    ? WSMOUSEHW_CLICKPAD : WSMOUSEHW_TOUCHPAD);
  hw->mt_slots = ELANTECH_MAX_FINGERS;

  elantech->width = hw->x_max / (capabilities[1] - 1);
@@ -2179,8 +2179,9 @@ pms_enable_elantech_v4(struct pms_softc
  goto err;
  }

- printf("%s: Elantech Clickpad, version %d, firmware 0x%x\n",
-    DEVNAME(sc), 4, sc->elantech->fw_version);
+ printf("%s: Elantech %s, version 4, firmware 0x%x\n",
+    DEVNAME(sc), (ELANTECH_IS_CLICKPAD(sc) ?  "Clickpad"
+    : "Touchpad"), sc->elantech->fw_version);

  if (sc->elantech->flags & ELANTECH_F_TRACKPOINT) {
  a.accessops = &pms_sec_accessops;