Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/macppc/dev The driver didn't work, because it expec...



details:   https://anonhg.NetBSD.org/src/rev/92fd441c05d1
branches:  trunk
changeset: 759927:92fd441c05d1
user:      phx <phx%NetBSD.org@localhost>
date:      Mon Dec 20 19:18:24 2010 +0000

description:
The driver didn't work, because it expects the whole data packet in a
single interrupt. Reality shows that with current kernels a 81 bytes packet
is split into 3 interrupts with 32 + 32 + 17 bytes. I have added a workaround
to deal with it. The Geyser2 devices with 64 byte packets are unsupported
at the moment. Somebody needs to test it.

New: Added support for the iBook 12-inch trackpad.

diffstat:

 sys/arch/macppc/dev/pbms.c |  53 ++++++++++++++++++++++++++++++++++-----------
 1 files changed, 40 insertions(+), 13 deletions(-)

diffs (121 lines):

diff -r e5f50d2c798d -r 92fd441c05d1 sys/arch/macppc/dev/pbms.c
--- a/sys/arch/macppc/dev/pbms.c        Mon Dec 20 19:15:26 2010 +0000
+++ b/sys/arch/macppc/dev/pbms.c        Mon Dec 20 19:18:24 2010 +0000
@@ -1,4 +1,4 @@
-/* $Id: pbms.c,v 1.11 2010/11/19 18:27:12 phx Exp $ */
+/* $Id: pbms.c,v 1.12 2010/12/20 19:18:24 phx Exp $ */
 
 /*
  * Copyright (c) 2005, Johan Wallén
@@ -67,10 +67,11 @@
  *   2, 7, 12, 17, 22, 27, 32, 37, 4, 9, 14, 19, 24, 29, 34, 39, 42,
  *   47, 52, 57, 62, 67, 72, 77, 44 and 49;
  * 
- * in the Y direction, the sensors correspond to byte positions
+ * In the Y direction, the sensors correspond to byte positions
  *
  *   1, 6, 11, 16, 21, 26, 31, 36, 3, 8, 13, 18, 23, 28, 33 and 38.
  *
+ * On 12 inch iBooks only the 9 first sensors in Y-direction are used.
  * The change in the sensor values over time is more interesting than
  * their absolute values: if the pressure increases, we know that the
  * finger has just moved there.
@@ -128,6 +129,7 @@
 #include <dev/usb/usbdi.h>
 #include <dev/usb/usbdevs.h>
 #include <dev/usb/uhidev.h>
+#include <dev/usb/hid.h>
 
 #include <dev/wscons/wsconsio.h>
 #include <dev/wscons/wsmousevar.h>
@@ -206,8 +208,9 @@
                .y_factor = (y_fact),                                         \
                .y_sensors = 16                                               \
        }
-       /* 12 inch PowerBooks */
+       /* 12 inch PowerBooks/iBooks */
        POWERBOOK_TOUCHPAD(12, 0x030a, 69, 16, 52), /* XXX Not tested. */
+       POWERBOOK_TOUCHPAD(12, 0x030b, 73, 15, 96),
        /* 15 inch PowerBooks */
        POWERBOOK_TOUCHPAD(15, 0x020e, 85, 16, 57), /* XXX Not tested. */
        POWERBOOK_TOUCHPAD(15, 0x020f, 85, 16, 57),
@@ -230,10 +233,12 @@
 struct pbms_softc {
        struct uhidev sc_hdev;        /* USB parent (got the struct device). */
        int is_geyser2;
-       int sc_datalen;
+       int sc_datalen;               /* Size of a data packet */
+       int sc_bufusage;              /* Number of bytes in sc_databuf */
        int sc_acc[PBMS_SENSORS];     /* Accumulated sensor values. */
        unsigned char sc_prev[PBMS_SENSORS];   /* Previous sample. */
        unsigned char sc_sample[PBMS_SENSORS]; /* Current sample. */
+       uint8_t sc_databuf[PBMS_DATA_LEN];     /* Buffer for a data packet */
        device_t sc_wsmousedev; /* WSMouse device. */
        int sc_noise;                 /* Amount of noise. */
        int sc_theshold;              /* Threshold value. */
@@ -354,6 +359,8 @@
                                        sc->sc_datalen = 64;
                                        sc->sc_y_sensors = 9;
                                }
+                               else if (product == 0x030b)
+                                       sc->sc_y_sensors = 9;
                                break;
                        }
                }
@@ -421,6 +428,7 @@
 
        sc->sc_status |= PBMS_ENABLED;
        sc->sc_status &= ~PBMS_VALID;
+       sc->sc_bufusage = 0;
        sc->sc_buttons = 0;
        memset(sc->sc_sample, 0, sizeof(sc->sc_sample));
 
@@ -463,20 +471,39 @@
 pbms_intr(struct uhidev *addr, void *ibuf, unsigned int len)
 {
        struct pbms_softc *sc = (struct pbms_softc *)addr;
-       unsigned char *data;
+       uint8_t *data;
        int dx, dy, dz, i, s;
        uint32_t buttons;
 
-       /* Ignore incomplete data packets. */
-       if (len != sc->sc_datalen)
-               return;
-       data = ibuf;
+       /*
+        * We may have to construct the full data packet over two or three
+        * sequential interrupts, as the device only sends us chunks of
+        * 32 or 64 bytes of data.
+        * This also requires some synchronization, to make sure we place
+        * the first protocol-byte at the first byte in the bufffer.
+        */
+       if (sc->is_geyser2) {
+               /* XXX Need to check this. */
+       } else {
+               /* the last chunk is always 17 bytes */
+               if (len == 17 && sc->sc_bufusage + len != sc->sc_datalen) {
+                       sc->sc_bufusage = 0;    /* discard bad packet */
+                       return;
+               }
+       }
 
+       memcpy(sc->sc_databuf + sc->sc_bufusage, ibuf, len);
+       sc->sc_bufusage += len;
+       if (sc->sc_bufusage != sc->sc_datalen)
+               return;         /* wait until packet is complete */
+
+       /* process the now complete protocol and clear the buffer */
+       data = sc->sc_databuf;
+       sc->sc_bufusage = 0;
 #if 0
-       printf("(");
-       for (i = 0; i < len; i++)
-               printf(" %d", data[i]);
-       printf(" )\n");
+       for (i = 0; i < sc->sc_datalen; i++)
+               printf(" %02x", data[i]);
+       printf("\n");
 #endif
 
        /* The last byte is 1 if the button is pressed and 0 otherwise. */



Home | Main Index | Thread Index | Old Index