From owner-FreeBSD-users-jp@jp.freebsd.org  Tue Mar 30 01:47:48 1999
Received: (from daemon@localhost)
	by jaz.jp.freebsd.org (8.9.2+3.1W/8.7.3) id BAA01171;
	Tue, 30 Mar 1999 01:47:48 +0900 (JST)
	(envelope-from owner-FreeBSD-users-jp@jp.FreeBSD.org)
Received: from onion.ish.org (onion.ish.org [210.145.219.202])
	by jaz.jp.freebsd.org (8.9.2+3.1W/8.7.3) with ESMTP id BAA01163
	for <FreeBSD-users-jp@jp.freebsd.org>; Tue, 30 Mar 1999 01:47:44 +0900 (JST)
	(envelope-from ishizuka@ish.org)
Received: from localhost (localhost [127.0.0.1])
	by onion.ish.org (8.9.3/3.7Wpl1-08/27/98) with ESMTP id BAA94152
	for <FreeBSD-users-jp@jp.freebsd.org>; Tue, 30 Mar 1999 01:47:42 +0900 (JST)
To: FreeBSD-users-jp@jp.freebsd.org
In-Reply-To: <199903291344.WAA04115@jaz.jp.freebsd.org>
References: <19990328193013U.ishizuka@onion.ish.org>
	<199903291344.WAA04115@jaz.jp.freebsd.org>
X-Mailer: Mew version 1.94b16 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
X-PGP-Fingerprint20: 276D 697A C2CB 1580 C683  8F18 DA98 1A4A 50D2 C4CB
X-PGP-Fingerprint16: C6 DE 46 24 D7 9F 22 EB  79 E2 90 AB 1B 9A 35 2E
X-PGP-Public-Key: http://www.ish.org/pgp-public-key.txt
X-URL: http://www.ish.org/
Mime-Version: 1.0
Content-Type: Multipart/Mixed;
	boundary="--Next_Part(Tue_Mar_30_01:47:39_1999_518)--"
Content-Transfer-Encoding: 7bit
Message-Id: <19990330014741N.ishizuka@onion.ish.org>
Date: Tue, 30 Mar 1999 01:47:41 +0900
From: Masachika ISHIZUKA <ishizuka@ish.org>
X-Dispatcher: imput version 990329(IM112)
Lines: 235
Reply-To: FreeBSD-users-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+981115
X-Sequence: FreeBSD-users-jp 40346
Subject: [FreeBSD-users-jp 40346] Re: psm.c patch for VAIO
 505series
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org
X-Originator: ishizuka@ish.org

----Next_Part(Tue_Mar_30_01:47:39_1999_518)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

> $B$"$H!"(Bkernel$B$K(B
> options         PSM_HOOKAPM
> options         PSM_RESETAFTERSUSPEND
> $B$N(B2$B9T$r2C$($J$$$H!"(Bsuspend$B$7$F(Bresume$B$7$?8e!"%?%C%A%Q%C%I$K?($k$H(B
> Mar 29 20:14:42 wrench /kernel: psmintr: out of sync (0008 != 00c8).
> $B$H$$$&$h$&$J%(%i!<%m%0$rEG$$$F0[>o$JF0:n$r$7$^$7$?!#(B
> $B%Q%C%A$r$"$F$kA0$O$3$N(B2$B9T$,$J$/$F$bLdBj$O$J$+$C$?$G$9!#(B

  $B@PDM!w?yJB$G$9!#(B

  $B%a!<%k$"$j$,$H$&$4$6$$$^$9!#(Bsuspend/resume $B$O;H$C$F$J$+$C(B
$B$?$N$G!"A4A35$IU$-$^$;$s$G$7$?!#(B
  $B%Q%C%A$rEv$F$k$H(B VersaPad $B$,%Q%C%AEv$FA0$H$OA4A3JL$N%b!<%I(B
$B$GF0$/$h$&$K$J$k$N$G$9$,!"(Bsuspend/resume $B$9$k$HB?J,DL>o$N%b(B
$B!<%I$KLa$C$F$7$^$&$?$a$H;W$o$l$^$9!#$7$?$,$C$F!"B?J,!"(Bkernel
config $B$K%*%W%7%g%s$rDI2C$7$F$b$i$&$7$+2sHrJ}K!$,$J$$$H;W$$(B
$B$^$9!#(B
  $B8=:_!"(Bpsm.c $B$N%a%s%F%J!<$N2#ED$5$s$HO"Mm$r<h$C$F!"(BVersaPad
$BBP1~5!G=$rK\2H$KF~$l$F$b$i$($k$h$&$K$*4j$$$7$F$k$H$3$m$G$9!#(B
$B$b$C$HNI$$J}K!$,$"$l$P!"@'HsD>$7$F2<$5$$!#59$7$/$*4j$$CW$7$^(B
$B$9!#(B

P.S. $B:#8=:_$N%Q%C%A$O0J2<$NDL$j$G$9!#(B

----Next_Part(Tue_Mar_30_01:47:39_1999_518)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="versapad-19990330.diff"

--- sys/i386/isa/psm.c.orig	Tue Jan 12 09:36:33 1999
+++ sys/i386/isa/psm.c	Tue Mar 30 01:25:32 1999
@@ -163,6 +163,8 @@
     unsigned char ipacket[16];	/* interim input buffer */
     int           inputbytes;	/* # of bytes in the input buffer */
     int           button;	/* the latest button state */
+    int		  xold;	/* previous absolute X position */
+    int		  yold;	/* previous absolute Y position */
 #ifdef DEVFS
     void          *devfs_token;
     void          *b_devfs_token;
@@ -195,6 +197,7 @@
 				    | PSM_CONFIG_IGNPORTERROR)
 
 /* other flags (flags) */
+#define PSM_FLAGS_FINGERDOWN	0x0001 /* VersaPad finger down */
 
 /* for backward compatibility */
 #define OLD_MOUSE_GETHWINFO	_IOR('M', 1, old_mousehw_t)
@@ -264,6 +267,7 @@
 static probefunc_t enable_kmouse;
 static probefunc_t enable_msintelli;
 static probefunc_t enable_mmanplus;
+static probefunc_t enable_versapad;
 static int tame_mouse __P((struct psm_softc *, mousestatus_t *, unsigned char *));
 
 static struct {
@@ -284,10 +288,12 @@
       0x80, MOUSE_PS2_PACKETSIZE, enable_kmouse, },
     { MOUSE_MODEL_INTELLI,		/* Microsoft IntelliMouse */
       0xc8, MOUSE_INTELLI_PACKETSIZE, enable_msintelli, },
+    { MOUSE_MODEL_VERSAPAD,            /* Interlink electronics VersaPad */
+      0xe8, MOUSE_VERSAPAD_PACKETSIZE, enable_versapad, },
     { MOUSE_MODEL_GENERIC,
       0xc0, MOUSE_PS2_PACKETSIZE, NULL, },
 };
-#define GENERIC_MOUSE_ENTRY	6
+#define GENERIC_MOUSE_ENTRY	7
 
 /* device driver declarateion */
 struct isa_driver psmdriver = { psmprobe, psmattach, "psm", FALSE };
@@ -517,6 +523,7 @@
         { MOUSE_MODEL_THINK,		"ThinkingMouse" },
         { MOUSE_MODEL_INTELLI,		"IntelliMouse" },
         { MOUSE_MODEL_MOUSEMANPLUS,	"MouseMan+" },
+        { MOUSE_MODEL_VERSAPAD,		"VersaPad" },
         { MOUSE_MODEL_GENERIC,		"Generic PS/2 mouse" },
         { MOUSE_MODEL_UNKNOWN,		NULL },
     };
@@ -1726,11 +1733,22 @@
 	MOUSE_BUTTON2DOWN | MOUSE_BUTTON3DOWN,
         MOUSE_BUTTON1DOWN | MOUSE_BUTTON2DOWN | MOUSE_BUTTON3DOWN
     };
+    static int butmap_versapad[8] = {
+	0, 
+	MOUSE_BUTTON3DOWN, 
+	MOUSE_BUTTON4DOWN, 
+	MOUSE_BUTTON3DOWN | MOUSE_BUTTON4DOWN, 
+	MOUSE_BUTTON1DOWN, 
+	MOUSE_BUTTON1DOWN | MOUSE_BUTTON3DOWN, 
+	MOUSE_BUTTON1DOWN | MOUSE_BUTTON4DOWN,
+	MOUSE_BUTTON1DOWN | MOUSE_BUTTON3DOWN | MOUSE_BUTTON4DOWN
+    };
     register struct psm_softc *sc = psm_softc[unit];
     mousestatus_t ms;
     int x, y, z;
     int c;
     int l;
+    int x0, y0;
 
     /* read until there is nothing to read */
     while((c = read_aux_data_no_wait(sc->kbdc)) != -1) {
@@ -1763,14 +1781,15 @@
 
 	c = sc->ipacket[0];
 
-        /* 
+	/* 
 	 * A kludge for Kensington device! 
 	 * The MSB of the horizontal count appears to be stored in 
 	 * a strange place. This kludge doesn't affect other mice 
 	 * because the bit is the overflow bit which is, in most cases, 
 	 * expected to be zero when we reach here. XXX 
 	 */
-        sc->ipacket[1] |= (c & MOUSE_PS2_XOVERFLOW) ? 0x80 : 0;
+	if (sc->hw.model != MOUSE_MODEL_VERSAPAD)
+	    sc->ipacket[1] |= (c & MOUSE_PS2_XOVERFLOW) ? 0x80 : 0;
 
         /* ignore the overflow bits... */
         x = (c & MOUSE_PS2_XNEG) ?  sc->ipacket[1] - 256 : sc->ipacket[1];
@@ -1822,6 +1841,60 @@
 	    ms.button |= (c & MOUSE_PS2_TAP) ? MOUSE_BUTTON4DOWN : 0;
 	    break;
 
+	case MOUSE_MODEL_VERSAPAD:
+	    /* VersaPad PS/2 absolute mode message format
+	     *
+	     * [packet1]     7   6   5   4   3   2   1   0(LSB)
+	     *  ipacket[0]:  1   1   0   A   1   L   T   R
+	     *  ipacket[1]: H7  H6  H5  H4  H3  H2  H1  H0
+	     *  ipacket[2]: V7  V6  V5  V4  V3  V2  V1  V0
+	     *  ipacket[3]:  1   1   1   A   1   L   T   R
+	     *  ipacket[4]:V11 V10  V9  V8 H11 H10  H9  H8
+	     *  ipacket[5]:  0  P6  P5  P4  P3  P2  P1  P0
+	     *
+	     * [note]
+	     *  R: right physical mouse button (1=on)
+	     *  T: touch pad virtual button (1=tapping)
+	     *  L: left physical mouse button (1=on)
+	     *  A: position data is valid (1=valid)
+	     *  H: horizontal data (12bit signed integer. H11 is sign bit.)
+	     *  V: vertical data (12bit signed integer. V11 is sign bit.)
+	     *  P: pressure data
+	     *
+	     * Tapping is mapped to MOUSE_BUTTON4.
+	     */
+	    ms.button = butmap_versapad[c & MOUSE_PS2_BUTTONS];
+	    x = y = 0;
+	    if (c & 0x10) {
+		x0 = sc->ipacket[1] | (((sc->ipacket[4]) & 0xf) << 8);
+		y0 = sc->ipacket[2] | (((sc->ipacket[4]) & 0xf0) << 4);
+		if (x0 & 0x800)
+		    x0 -= 0x1000;
+		if (y0 & 0x800)
+		    y0 -= 0x1000;
+		if (sc->flags & PSM_FLAGS_FINGERDOWN) {
+		    x = sc->xold - x0;
+		    y = y0 - sc->yold;
+		    if (x < 0)
+			x++;
+		    else if (x)
+			x--;
+		    if (y < 0)
+			y++;
+		    else if (y)
+			y--;
+		}
+		else
+		    sc->flags |= PSM_FLAGS_FINGERDOWN;
+		sc->xold = x0;
+		sc->yold = y0;
+	    }
+	    else
+		sc->flags &= ~PSM_FLAGS_FINGERDOWN;
+	    c = ((x < 0) ? MOUSE_PS2_XNEG : 0)
+		| ((y < 0) ? MOUSE_PS2_YNEG : 0);
+	    break;
+
 	case MOUSE_MODEL_GENERIC:
 	default:
 	    break;
@@ -2147,6 +2220,28 @@
     sc->hw.buttons = 3;
 
     return TRUE;
+}
+
+/* Interlink electronics VersaPad */
+static int
+enable_versapad(struct psm_softc *sc)
+{
+    KBDC kbdc = sc->kbdc;
+    int data[3];
+
+    set_mouse_resolution(kbdc, PSMD_RES_MEDIUM_HIGH); /* set res. 2 */
+    set_mouse_sampling_rate(kbdc, 100);		/* set rate 100 */
+    set_mouse_scaling(kbdc, 1);			/* set scale 1:1 */
+    set_mouse_scaling(kbdc, 1);			/* set scale 1:1 */
+    set_mouse_scaling(kbdc, 1);			/* set scale 1:1 */
+    set_mouse_scaling(kbdc, 1);			/* set scale 1:1 */
+    if (get_mouse_status(kbdc, data, 0, 3) < 3)	/* get status */
+	return FALSE;
+    if (data[2] != 0xa || data[1] != 0 )	/* rate == 0xa && res. == 0 */
+	return FALSE;
+    set_mouse_scaling(kbdc, 1);			/* set scale 1:1 */
+
+    return TRUE;				/* PS/2 absolute mode */
 }
 
 static int psm_devsw_installed = FALSE;
--- sys/i386/include/mouse.h.orig	Mon Feb 22 01:08:43 1999
+++ sys/i386/include/mouse.h	Mon Mar 29 09:22:35 1999
@@ -115,6 +115,7 @@
 #define MOUSE_MODEL_EASYSCROLL		6
 #define MOUSE_MODEL_MOUSEMANPLUS	7
 #define MOUSE_MODEL_KIDSPAD		8
+#define MOUSE_MODEL_VERSAPAD		9
 
 typedef struct mousemode {
 	int protocol;		/* MOUSE_PROTO_XXX */
@@ -213,6 +214,9 @@
 #define MOUSE_MM_BUTTON3DOWN	0x01	/* right */
 #define MOUSE_MM_XPOSITIVE	0x10
 #define MOUSE_MM_YPOSITIVE	0x08
+
+/* VersaPad data packet */
+#define MOUSE_VERSAPAD_PACKETSIZE	6
 
 /* PS/2 mouse data packet */
 #define MOUSE_PS2_PACKETSIZE	3

----Next_Part(Tue_Mar_30_01:47:39_1999_518)----
