From owner-FreeBSD-users-jp@jp.freebsd.org  Thu Dec  5 21:04:44 1996
Received: by jaz.jp.freebsd.org (8.8.3+2.6Wbeta9/8.7.3) id VAA11857
	Thu, 5 Dec 1996 21:04:44 +0900 (JST)
Received: by jaz.jp.freebsd.org (8.8.3+2.6Wbeta9/8.7.3) with ESMTP id VAA11852
	for <freebsd-users-jp@jp.freebsd.org>; Thu, 5 Dec 1996 21:04:40 +0900 (JST)
Received: from aulin.st.rim.or.jp (ppp614.st.rim.or.jp [202.247.132.214]) by mail.st.rim.or.jp (8.8.3/3.4W3-rim1.1) with SMTP id VAA22943; Thu, 5 Dec 1996 21:04:35 +0900 (JST)
Received: from localhost (yokamura@localhost) by aulin.st.rim.or.jp (8.6.12/3.3W7-95011320) with SMTP id VAA00299; Thu, 5 Dec 1996 21:03:45 +0900
Message-Id: <199612051203.VAA00299@aulin.st.rim.or.jp>
To: FreeBSD-users-jp@jp.freebsd.org
cc: yokamura@st.rim.or.jp
Date: Thu, 05 Dec 1996 21:03:45 +0900
From: Okamura Yoshihito <yokamura@st.rim.or.jp>
Reply-To: FreeBSD-users-jp@jp.freebsd.org
X-Distribute: distribute [version 2.1 (Alpha) patchlevel=19]
X-Sequence: FreeBSD-users-jp 7251
Subject: [FreeBSD-users-jp 7251] about PS/2 mouse
Errors-To: owner-FreeBSD-users-jp@jp.freebsd.org
Sender: owner-FreeBSD-users-jp@jp.freebsd.org

$B!!2,B<$G$9!#$A$g$C$HA0$K%M%C%H%K%e!<%9$G!"(BPS/2$B%^%&%9;HMQ$7!"%^%&%9$NF0(B
$B$-$,;_$^$k$h$&$J=E$$%W%m%0%i%`$r<B9T$7$F$$$k:GCf$K%^%&%9$rF0$+$7$?$j$9(B
$B$k$H!"%^%&%9$N%3%s%H%m!<%k$,$G$-$J$/$J$C$F$7$^$&$H$$$&Ej9F$,$"$j$^$7$?(B
$B$,!";d$N=j$b(Bnetscape$B$N5/F0Cf$K%^%&%9$rF0$+$7$?$j$9$k$H$3$N$h$&$J>uBV$K(B
$B$J$C$F$7$^$$:$$C$F$*$j$^$7$?!#(B

$B!!;d$O(BX$B$O(BAccelerated-X 1.3$B$r;HMQ$7$F$$$^$9$,!"(Bpsm$B%I%i%$%P$K$bLdBj$O$"(B
$B$j$=$&$G$9$,!"(BAccelerated-X$B<+?H$K$b(BPS/2 Mouse$B$N=hM}$KLdBj$,$"$k$h$&$G(B
$B$9!#$=$3$G(BPS/2 Mouse$B%W%m%H%3%k$r$d$a$F!"%7%j%"%k%^%&%9$HF1$8%W%m%H%3%k(B
$B$G(BX$B$r;HMQ$G$-$k$h$&$K!"(B psm$B%I%i%$%P$r2~B$$7$^$7$?!#$3$N2~B$$O(BNetBSD1.2
$B$N%I%i%$%P$r;29M$K$7$F9T$$$^$7$?!#$3$N%I%i%$%P$H(BAccelerated-X$B$N(BMouse
Type$B$r(BMouseSystems$B$K$7$F;HMQ$7$?$+$.$j!"%^%&%9$N%3%s%H%m!<%k$,$G$-$J$$(B
$B8=>]$OH/@8$7$F$$$^$;$s!#(BXFree86$B$G$b@_Dj$rJQ$($l$P;HMQ$G$-$k$H;W$$$^$9(B
$B$,!";d$O(BXFree86$B$O;HMQ$7$?$3$H$,$J$$$N$G!"$I$N$h$&$K@_Dj$rJQ99$9$k$N$+(B
$B$O$o$+$j$^$;$s!#(B

$B!!0J2<$,$=$N%Q%C%A$G$9!#(BFreeBSD2.1.6RELEASE$BMQ$G$9!#(B

*** psm.c.orig	Wed May  8 05:13:11 1996
--- psm.c	Thu Dec  5 19:53:57 1996
*************** psmioctl(dev_t dev, int cmd, caddr_t add
*** 397,414 ****
  	return (error);
  }
  
  void psmintr(int unit)
  {
  	struct psm_softc *sc = &psm_softc[unit];
  	int ioport = psmaddr[unit];
  
! 	sc->inq.queue[sc->inq.last++ % MSBSZ] = inb(ioport+PSM_DATA);
! 	sc->inq.count++;
! 	if (sc -> state & PSM_ASLP) {
! 		sc->state &= ~PSM_ASLP;
! 		wakeup((caddr_t)sc);
  	}
- 	selwakeup(&sc->rsel);
  }
  
  int
--- 397,465 ----
  	return (error);
  }
  
+ /* Masks for the first byte of a packet */
+ #define PS2LBUTMASK 0x01
+ #define PS2RBUTMASK 0x02
+ #define PS2MBUTMASK 0x04
+ 
  void psmintr(int unit)
  {
  	struct psm_softc *sc = &psm_softc[unit];
  	int ioport = psmaddr[unit];
+ 	static int state = 0;
+ 	static u_char buttons;
+ 	static char dx, dy; 
+ 	u_char changed;
+ 	u_char buffer[5];
  
! 	if ((sc->state & PSM_OPEN) == 0) {
! 		return;
! 	}
! 	switch (state) {
! 	case 0:
! 		buttons = inb(ioport+PSM_DATA);
! 		if ((buttons & 0xc0) == 0) ++state;
! 		break;
! 	case 1:
! 		dx = inb(ioport+PSM_DATA);
! 		/* Bounding at -127 avoids a bug in XFree86. */
! 		dx = (dx == -128) ? -127 : dx;
! 		++state;
! 		break;
! 	case 2:
! 		dy = inb(ioport+PSM_DATA);
! 		dy = (dy == -128) ? -127 : dy;
! 		state = 0;
! 		buttons = ((buttons & PS2LBUTMASK) << 2) |
! 			  ((buttons & (PS2RBUTMASK | PS2MBUTMASK)) >> 1);
! 		changed = ((buttons ^ sc->status) & BUTSTATMASK) << 3;
! 		sc->status = buttons | (sc->status & ~BUTSTATMASK) | changed;
! 		if (dx || dy || changed) {
! 			/* Add this event to the queue. */
! 			buffer[0] = 0x80 | (buttons ^ BUTSTATMASK);
! 			buffer[1] = dx;
! 			buffer[2] = dy;
! 			buffer[3] = buffer[4] = 0;
! 			if (sc->inq.last + sizeof(buffer) >= MSBSZ) {
! 				bcopy(buffer,&sc->inq.queue[sc->inq.last],
! 				      MSBSZ - sc->inq.last);
! 				bcopy(&buffer[MSBSZ-sc->inq.last],
! 				      sc->inq.queue,
! 				      sizeof(buffer) - (MSBSZ - sc->inq.last));
! 			}
! 			else {
! 				bcopy(buffer,&sc->inq.queue[sc->inq.last],sizeof(buffer));
! 			}
! 			sc->inq.last = (sc->inq.last + sizeof(buffer)) % MSBSZ;
! 			sc->inq.count += sizeof(buffer);
! 			if (sc -> state & PSM_ASLP) {
! 				sc->state &= ~PSM_ASLP;
! 				wakeup((caddr_t)sc);
! 			}
! 			selwakeup(&sc->rsel);
! 		}
! 		break;
  	}
  }
  
  int


						okamura
