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;

Reply via email to