Module Name:    src
Committed By:   macallan
Date:           Wed Oct 29 00:48:12 UTC 2014

Modified Files:
        src/sys/dev/adb: adb_ms.c

Log Message:
actually support EMP
( as in, look for additional motion info bits, not just buttons )


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/adb/adb_ms.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/adb/adb_ms.c
diff -u src/sys/dev/adb/adb_ms.c:1.15 src/sys/dev/adb/adb_ms.c:1.16
--- src/sys/dev/adb/adb_ms.c:1.15	Mon Nov 18 11:02:34 2013
+++ src/sys/dev/adb/adb_ms.c	Wed Oct 29 00:48:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: adb_ms.c,v 1.15 2013/11/18 11:02:34 nisimura Exp $	*/
+/*	$NetBSD: adb_ms.c,v 1.16 2014/10/29 00:48:12 macallan Exp $	*/
 
 /*
  * Copyright (C) 1998	Colin Wood
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: adb_ms.c,v 1.15 2013/11/18 11:02:34 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: adb_ms.c,v 1.16 2014/10/29 00:48:12 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -564,8 +564,38 @@ adbms_process_event(struct adbms_softc *
 			break;
 	}
 
-	dx = ((int)(buffer[1] & 0x3f)) - ((buffer[1] & 0x40) ? 64 : 0);
-	dy = ((int)(buffer[0] & 0x3f)) - ((buffer[0] & 0x40) ? 64 : 0);
+	if (sc->sc_adbdev->handler_id != ADBMS_EXTENDED) {
+		dx = ((int)(buffer[1] & 0x3f)) - ((buffer[1] & 0x40) ? 64 : 0);
+		dy = ((int)(buffer[0] & 0x3f)) - ((buffer[0] & 0x40) ? 64 : 0);
+	} else {
+		/* EMP crap, additional motion bits */
+		int shift = 7, ddx, ddy, sign, smask;
+
+#ifdef ADBMS_DEBUG
+		printf("EMP packet:");
+		for (i = 0; i < len; i++)
+			printf(" %02x", buffer[i]);
+		printf("\n");
+#endif
+		dx = (int)buffer[1] & 0x7f;
+		dy = (int)buffer[0] & 0x7f;
+		for (i = 2; i < len; i++) {
+			ddx = (buffer[i] & 0x07);
+			ddy = (buffer[i] & 0x70) >> 4;
+			dx |= (ddx << shift);
+			dy |= (ddy << shift);
+			shift += 3;
+		}
+		sign = 1 << (shift - 1);
+		smask = 0xffffffff << shift;
+		if (dx & sign)
+			dx |= smask;
+		if (dy & sign)
+			dy |= smask;
+#ifdef ADBMS_DEBUG
+		printf("%d %d %08x %d\n", dx, dy, smask, shift);
+#endif
+	}
 
 	if (sc->sc_class == MSCLASS_TRACKPAD) {
 

Reply via email to