summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Downs <downsj@cvs.openbsd.org>1996-10-13 00:55:51 +0000
committerJason Downs <downsj@cvs.openbsd.org>1996-10-13 00:55:51 +0000
commitcb87ad0a2e91f474ae7c5cef2d3d4db3c88c9d50 (patch)
treefb3fd2d35f4f63e4295737ece7ee2eb37037a50c
parent2791bcbb96fbc04f3d2cd70d211169ad78efaee9 (diff)
provide split raw/cooked (translated) input modes. cooked mode is default,
raw mode is set by using an ioctl or opening minor dev 1. MAKEDEV created pms0r with minor dev 1.
-rw-r--r--sys/arch/i386/include/mouse.h4
-rw-r--r--sys/arch/i386/isa/pms.c138
2 files changed, 99 insertions, 43 deletions
diff --git a/sys/arch/i386/include/mouse.h b/sys/arch/i386/include/mouse.h
index 2d4a16c27d7..6ed881d6cea 100644
--- a/sys/arch/i386/include/mouse.h
+++ b/sys/arch/i386/include/mouse.h
@@ -1,6 +1,8 @@
+/* $OpenBSD: mouse.h,v 1.2 1996/10/13 00:55:50 downsj Exp $ */
/* $NetBSD: mouse.h,v 1.4 1994/10/27 04:16:10 cgd Exp $ */
/*-
+ * Copyright (c) 1996, Jason Downs.
* Copyright (c) 1992, 1993 Erik Forsberg.
* All rights reserved.
*
@@ -45,5 +47,7 @@ struct mouseinfo {
#define MOUSEIOC ('M'<<8)
#define MOUSEIOCREAD (MOUSEIOC|60)
+#define MOUSEIOCSRAW (MOUSEIOC|61)
+#define MOUSEIOCSCOOKED (MOUSEIOC|62)
#endif /* !_I386_MOUSE_H_ */
diff --git a/sys/arch/i386/isa/pms.c b/sys/arch/i386/isa/pms.c
index 6dafcc4512d..eccfe6671c1 100644
--- a/sys/arch/i386/isa/pms.c
+++ b/sys/arch/i386/isa/pms.c
@@ -1,7 +1,8 @@
-/* $OpenBSD: pms.c,v 1.10 1996/08/17 05:57:23 deraadt Exp $ */
+/* $OpenBSD: pms.c,v 1.11 1996/10/13 00:55:49 downsj Exp $ */
/* $NetBSD: pms.c,v 1.29 1996/05/12 23:12:42 mycroft Exp $ */
/*-
+ * Copyright (c) 1996, Jason Downs.
* Copyright (c) 1994 Charles Hannum.
* Copyright (c) 1992, 1993 Erik Forsberg.
* All rights reserved.
@@ -99,6 +100,8 @@ struct pms_softc { /* driver status information */
u_char sc_state; /* mouse driver state */
#define PMS_OPEN 0x01 /* device is open */
#define PMS_ASLP 0x02 /* waiting for mouse data */
+ u_char sc_flags; /* mouse driver flags */
+#define PMS_RAW 0x01 /* device is in raw mode */
u_char sc_status; /* mouse button status */
int sc_x, sc_y; /* accumulated motion in the X,Y axis */
};
@@ -115,7 +118,8 @@ struct cfdriver pms_cd = {
NULL, "pms", DV_TTY
};
-#define PMSUNIT(dev) (minor(dev))
+#define PMSUNIT(dev) (minor(dev) / 2)
+#define PMSTYPE(dev) (minor(dev) % 2)
static __inline void pms_flush __P((void));
static __inline void pms_dev_cmd __P((u_char));
@@ -246,6 +250,7 @@ pmsopen(dev, flag, mode, p)
sc->sc_state |= PMS_OPEN;
sc->sc_status = 0;
+ sc->sc_flags = (PMSTYPE(dev) ? PMS_RAW : 0);
sc->sc_x = sc->sc_y = 0;
/* Enable interrupts. */
@@ -377,7 +382,12 @@ pmsioctl(dev, cmd, addr, flag, p)
splx(s);
error = copyout(&info, addr, sizeof(struct mouseinfo));
break;
-
+ case MOUSEIOCSRAW:
+ sc->sc_flags |= PMS_RAW;
+ break;
+ case MOUSEIOCSCOOKED:
+ sc->sc_flags &= ~PMS_RAW;
+ break;
default:
error = EINVAL;
break;
@@ -408,51 +418,93 @@ pmsintr(arg)
return 0;
}
- switch (state) {
-
- case 0:
- buttons = inb(PMS_DATA);
- if ((buttons & 0xc0) == 0)
+ if (!(sc->sc_flags & PMS_RAW)) {
+ switch (state) {
+ case 0:
+ buttons = inb(PMS_DATA);
+ if ((buttons & 0xc0) == 0)
+ ++state;
+ break;
+ case 1:
+ dx = inb(PMS_DATA);
+ /* Bounding at -127 avoids a bug in XFree86. */
+ dx = (dx == -128) ? -127 : dx;
++state;
- break;
-
- case 1:
- dx = inb(PMS_DATA);
- /* Bounding at -127 avoids a bug in XFree86. */
- dx = (dx == -128) ? -127 : dx;
- ++state;
- break;
+ break;
+ case 2:
+ dy = inb(PMS_DATA);
+ dy = (dy == -128) ? -127 : dy;
+ state = 0;
+
+ buttons = ((buttons & PS2LBUTMASK) << 2) |
+ ((buttons & (PS2RBUTMASK | PS2MBUTMASK)) >> 1);
+ changed = ((buttons ^ sc->sc_status) & BUTSTATMASK) << 3;
+ sc->sc_status = buttons | (sc->sc_status & ~BUTSTATMASK) | changed;
+
+ if (dx || dy || changed) {
+ /* Update accumulated movements. */
+ sc->sc_x += dx;
+ sc->sc_y += dy;
+
+ /* Add this event to the queue. */
+ buffer[0] = 0x80 | (buttons ^ BUTSTATMASK);
+ buffer[1] = dx;
+ buffer[2] = dy;
+ buffer[3] = buffer[4] = 0;
+ (void) b_to_q(buffer, sizeof buffer, &sc->sc_q);
+
+ if (sc->sc_state & PMS_ASLP) {
+ sc->sc_state &= ~PMS_ASLP;
+ wakeup((caddr_t)sc);
+ }
+ selwakeup(&sc->sc_rsel);
+ }
- case 2:
- dy = inb(PMS_DATA);
- dy = (dy == -128) ? -127 : dy;
- state = 0;
-
- buttons = ((buttons & PS2LBUTMASK) << 2) |
- ((buttons & (PS2RBUTMASK | PS2MBUTMASK)) >> 1);
- changed = ((buttons ^ sc->sc_status) & BUTSTATMASK) << 3;
- sc->sc_status = buttons | (sc->sc_status & ~BUTSTATMASK) | changed;
-
- if (dx || dy || changed) {
- /* Update accumulated movements. */
- sc->sc_x += dx;
- sc->sc_y += dy;
-
- /* Add this event to the queue. */
- buffer[0] = 0x80 | (buttons ^ BUTSTATMASK);
- buffer[1] = dx;
- buffer[2] = dy;
- buffer[3] = buffer[4] = 0;
- (void) b_to_q(buffer, sizeof buffer, &sc->sc_q);
-
- if (sc->sc_state & PMS_ASLP) {
- sc->sc_state &= ~PMS_ASLP;
- wakeup((caddr_t)sc);
+ break;
+ }
+ } else {
+ /* read data port */
+ buffer[0] = inb(PMS_DATA);
+
+ /* emulate old state machine for the ioctl's sake. */
+ switch (state) {
+ case 0:
+ buttons = buffer[0];
+ if ((buttons & 0xc0) == 0)
+ ++state;
+ break;
+ case 1:
+ dx = buffer[0];
+ /* Bounding at -127 avoids a bug in XFree86. */
+ dx = (dx == -128) ? -127 : dx;
+ ++state;
+ break;
+ case 2:
+ dy = buffer[0];
+ dy = (dy == -128) ? -127 : dy;
+ state = 0;
+
+ buttons = ((buttons & PS2LBUTMASK) << 2) |
+ ((buttons & (PS2RBUTMASK | PS2MBUTMASK)) >> 1);
+ changed = ((buttons ^ sc->sc_status) & BUTSTATMASK) << 3;
+ sc->sc_status = buttons | (sc->sc_status & ~BUTSTATMASK) | changed;
+
+ if (dx || dy || changed) {
+ /* Update accumulated movements. */
+ sc->sc_x += dx;
+ sc->sc_y += dy;
}
- selwakeup(&sc->sc_rsel);
+ break;
}
- break;
+ /* add raw data to the queue. */
+ (void) b_to_q(buffer, 1, &sc->sc_q);
+
+ if (sc->sc_state & PMS_ASLP) {
+ sc->sc_state &= ~PMS_ASLP;
+ wakeup((caddr_t)sc);
+ }
+ selwakeup(&sc->sc_rsel);
}
return -1;