Synaptics touchpad patch - please test

Marcin Koziej creep at desk.pl
Sun Nov 20 13:38:26 GMT 2005


I'm sorry, Thunderbird wrapped the patch and trashed it. I'm sending it again then..

--- psm-extbuttons.patch begins here ---
--- sys/dev/atkbdc/psm.c.orig    Sat Jul 30 17:53:18 2005
+++ sys/dev/atkbdc/psm.c    Sun Jul 31 13:25:55 2005
@@ -2511,13 +2511,14 @@

      case MOUSE_MODEL_SYNAPTICS:
          /* TouchPad PS/2 absolute mode message format
+         * with capFourButtons:
           *
           *  Bits:        7   6   5   4   3   2   1   0 (LSB)
           *  ------------------------------------------------
           *  ipacket[0]:  1   0  W3  W2   0  W1   R   L
           *  ipacket[1]: Yb  Ya  Y9  Y8  Xb  Xa  X9  X8
           *  ipacket[2]: Z7  Z6  Z5  Z4  Z3  Z2  Z1  Z0
-         *  ipacket[3]:  1   1  Yc  Xc   0  W0   D   U
+         *  ipacket[3]:  1   1  Yc  Xc   0  W0 D^R U^L
           *  ipacket[4]: X7  X6  X5  X4  X3  X2  X1  X0
           *  ipacket[5]: Y7  Y6  Y5  Y4  Y3  Y2  Y1  Y0
           *
@@ -2531,6 +2532,20 @@
           *  Y: x position
           *  Z: pressure
           *
+         * Without capFourButtons but with extButtons and/or capMiddle
+         *  Bits:        7   6   5   4      3      2      1      0 (LSB)
+         *  ------------------------------------------------------
+         *  ipacket[3]:  1   1  Yc  Xc      0     W0    E^R    M^L
+         *  ipacket[4]: X7  X6  X5  X4  X3|b7  X2|b5  X1|b3  X0|b1
+         *  ipacket[5]: Y7  Y6  Y5  Y4  Y3|b8  Y2|b6  Y1|b4  Y0|b2
+         *
+         * Legend:
+         * M: middle physical mouse button
+         * E: extended mouse buttons repored instead of low bits of X and Y
+         * b1-b8: extended mouse buttons. Only ((extButtons + 1) >> 1) bits
+         *        are used in packet 4 and 5, for reading X and Y value
+         *        they should be zeroed.
+         *
           * Absolute reportable limits:    0 - 6143.
           * Typical bezel limits:       1472 - 5472.
           * Typical edge marings:       1632 - 5312.
@@ -2590,38 +2605,41 @@
          if (pb->ipacket[0] & 0x02)
            touchpad_buttons |= MOUSE_BUTTON3DOWN;

-        if (sc->synhw.capExtended && sc->synhw.capFourButtons) {
-        if ((pb->ipacket[3] & 0x01) && (pb->ipacket[0] & 0x01) == 0)
-            touchpad_buttons |= MOUSE_BUTTON4DOWN;
-        if ((pb->ipacket[3] & 0x02) && (pb->ipacket[0] & 0x02) == 0)
-            touchpad_buttons |= MOUSE_BUTTON5DOWN;
-        }
-
-        /*
-         * In newer pads - bit 0x02 in the third byte of
-         * the packet indicates that we have an extended
-         * button press.
-         */
-        if (pb->ipacket[3] & 0x02) {
-            /*
-         * if directional_scrolls is not 1, we treat
-              * any of the scrolling directions as middle-click.
-              */
-        if (sc->syninfo.directional_scrolls) {
-            if (pb->ipacket[4] & 0x01)
-            touchpad_buttons |= MOUSE_BUTTON4DOWN;
-            if (pb->ipacket[5] & 0x01)
-            touchpad_buttons |= MOUSE_BUTTON5DOWN;
-            if (pb->ipacket[4] & 0x02)
-            touchpad_buttons |= MOUSE_BUTTON6DOWN;
-               if (pb->ipacket[5] & 0x02)
-            touchpad_buttons |= MOUSE_BUTTON7DOWN;
-        } else {
-            if ((pb->ipacket[4] & 0x0F) || (pb->ipacket[5] & 0x0F))
-            touchpad_buttons |= MOUSE_BUTTON2DOWN;
+        if (sc->synhw.capExtended && sc->synhw.capFourButtons) {
+            if ((pb->ipacket[3] ^ pb->ipacket[0]) & 0x01)
+                touchpad_buttons |= MOUSE_BUTTON4DOWN;
+            if ((pb->ipacket[3] ^ pb->ipacket[0]) & 0x02)
+                touchpad_buttons |= MOUSE_BUTTON5DOWN;
+        }
+        else if (sc->synhw.capExtended)
+        {
+            /* Middle button */
+            if ((pb->ipacket[3] & sc->synhw.capMiddle) && ((pb->ipacket[0] ^ pb->ipacket[3]) & 0x01))
+                touchpad_buttons |= MOUSE_BUTTON2DOWN;
+            /* Extended buttons */
+            if (sc->synhw.extButtons > 0 && ((pb->ipacket[0] ^ pb->ipacket[3]) & 0x02))
+            {
+                if (sc->syninfo.directional_scrolls) {
+                    /* Iterate over extButtons bits, see legend. */
+                    int cb=0;
+                    for (cb = 0; cb < sc->synhw.extButtons; cb++)
+                    {
+                        if (pb->ipacket[4 + (cb%2)] & (1 << (cb >> 1)) )
+                            touchpad_buttons |= (MOUSE_BUTTON4DOWN << cb);
+                    }
+                } else {
+                    /* Or just report middle button as the user requested */
+                    touchpad_buttons |= MOUSE_BUTTON2DOWN;
+                }
+                /*
+                 * Zeros out bits used by buttons.
+                 * ( sc->synhw.extButons + 1 ) >> 1  bits will be masked out in both bytes.
+                 * ( 1 << x ) - 1 computest the mask for x bits.
+                 */
+                pb->ipacket[4] &= ~((1 << ((sc->synhw.extButtons+1) >> 1)) - 1);
+                pb->ipacket[5] &= ~((1 << ((sc->synhw.extButtons+1) >> 1)) - 1);
+            }
          }
-
-        }

          ms.button = touchpad_buttons | guest_buttons;

@@ -3247,7 +3265,8 @@
  {
      int status[3];
      KBDC kbdc;
-
+    unsigned char nExtQueries=0;
+
      if (!synaptics_support)
      return (FALSE);

@@ -3366,7 +3385,7 @@
      /* Read the extended capability bits */
      if (mouse_ext_command(kbdc, 2) == 0)
      return (FALSE);
-    if (get_mouse_status(kbdc, status, 0, 3) != 3)
+    if (get_mouse_status(kbdc, status, 0, 2) != 2)
      return (FALSE);
      if (status[1] != 0x47) {
      printf("  Failed to read extended capability bits\n");
@@ -3375,13 +3394,14 @@

      /* Set the different capabilities when they exist */
      if ((status[0] & 0x80) >> 7) {
-    sc->synhw.capExtended    = (status[0] & 0x80) >> 7;
-        sc->synhw.capPassthrough = (status[2] & 0x80) >> 7;
-        sc->synhw.capSleep       = (status[2] & 0x10) >> 4;
-        sc->synhw.capFourButtons = (status[2] & 0x08) >> 3;
-        sc->synhw.capMultiFinger = (status[2] & 0x02) >> 1;
-        sc->synhw.capPalmDetect  = (status[2] & 0x01);
-
+        sc->synhw.capExtended    = (status[0] & 0x80) >> 7;
+        nExtQueries              = (status[0] & 0x70) >> 4;        // 3 bit.
+        sc->synhw.capPassthrough = (status[1] & 0x80) >> 7;
+        sc->synhw.capSleep       = (status[1] & 0x10) >> 4;
+        sc->synhw.capFourButtons = (status[1] & 0x08) >> 3;
+        sc->synhw.capMultiFinger = (status[1] & 0x02) >> 1;
+        sc->synhw.capPalmDetect  = (status[1] & 0x01);
+        sc->synhw.capMiddle         = sc->synhw.capFourButtons ? 0 : (status[0] & 0x04) >> 2;
      if (verbose >= 2) {
          printf("  Extended capabilities:\n");
          printf("   capExtended: %d\n", sc->synhw.capExtended);
@@ -3390,6 +3410,7 @@
          printf("   capFourButtons: %d\n", sc->synhw.capFourButtons);
          printf("   capMultiFinger: %d\n", sc->synhw.capMultiFinger);
          printf("   capPalmDetect: %d\n", sc->synhw.capPalmDetect);
+        printf("   Number of extended queries: %d\n", nExtQueries);
      }

      /*
@@ -3443,8 +3464,20 @@
       *
       * XXX: I'm not sure this is used anywhere.
       */
+    sc->synhw.extButtons = 0;
      if (sc->synhw.capExtended && sc->synhw.capFourButtons)
-    sc->hw.buttons = 4;
+        sc->hw.buttons = 4;
+    else if (sc->synhw.capExtended && nExtQueries>0)
+    {
+         if (mouse_ext_command(kbdc, 9) == 0)
+            return (FALSE);
+        if (get_mouse_status(kbdc, status, 0, 3) != 3)
+            return (FALSE);
+        sc->synhw.extButtons = (status[1] & 0xf0) >> 4;
+        sc->hw.buttons = 2 + sc->synhw.capMiddle + sc->synhw.extButtons;
+    }
+    else
+        sc->hw.buttons = 2 + sc->synhw.capMiddle;

      return (TRUE);
  }
--- sys/sys/mouse.h.orig    Sat Jul 30 18:03:30 2005
+++ sys/sys/mouse.h    Sun Jul 31 11:56:25 2005
@@ -103,10 +103,12 @@
      int infoGeometry;
      int capExtended;
      int capSleep;
+    int capMiddle;
      int capFourButtons;
      int capMultiFinger;
      int capPalmDetect;
      int capPassthrough;
+    int extButtons;
  } synapticshw_t;

  /* iftype */
--- psm-extbuttons.patch ends here ---

--- psm-tap.patch begins here ---
--- sys/dev/atkbdc/psm.c.orig    Sat Jul 30 17:53:18 2005
+++ sys/dev/atkbdc/psm.c    Sun Jul 31 13:25:55 2005
@@ -2741,7 +2759,7 @@

          if (sc->zmax > tap_threshold &&
              timevalcmp(&sc->lastsoftintr, &sc->taptimeout, <=)) {
-            if (w == 0)
+            if (w == 0 && z > 3)
                  ms.button |= MOUSE_BUTTON3DOWN;
              else if (w == 1)
                  ms.button |= MOUSE_BUTTON2DOWN;
--- psm-tap.patch ends here ---



More information about the freebsd-mobile mailing list