Nearly solved: Typhoon mouse
Dominik Brettnacher
domi at saargate.de
Mon Apr 28 10:00:17 PDT 2003
Hi,
Maybe you remember my mails from the last two weeks on the same topic - I
finally got the Typhoon Optical Mouse working with the psm(4) driver, see
the patches below.
The problem that is left now is the probe function: without my patch, this
mouse is recognized as a "4D+ Mouse", which is not compatible with the
Typhoon mouse, but returns same device ID.
I wrote a probe function, enable_typhoon(), which does pretty much the
same thing that enable_4dplus() does. Obviously, with this procedure,
using 4D+ mice will not work (I did not try because I don't have one,
but I think so).
My question now is: does anybody know a method to distinguish these two
devices?
--- /sys/i386/include/mouse.h.orig Mon Apr 28 14:49:20 2003
+++ /sys/i386/include/mouse.h Mon Apr 28 14:52:58 2003
@@ -119,6 +119,7 @@
#define MOUSE_MODEL_EXPLORER 10
#define MOUSE_MODEL_4D 11
#define MOUSE_MODEL_4DPLUS 12
+#define MOUSE_MODEL_TYPHOON 13
typedef struct mousemode {
int protocol; /* MOUSE_PROTO_XXX */
@@ -301,6 +302,9 @@
#define MOUSE_4DPLUS_PACKETSIZE 3
#define MOUSE_4DPLUS_ZNEG 0x04 /* sign bit */
#define MOUSE_4DPLUS_BUTTON4DOWN 0x08
+
+/* Typhoon Optical Mouse (PS/2) data packet */
+#define MOUSE_TYPHOON_PACKETSIZE 6
/* sysmouse extended data packet */
/*
--- /sys/isa/psm.c.orig Mon Apr 28 14:48:16 2003
+++ /sys/isa/psm.c Mon Apr 28 18:43:01 2003
@@ -275,6 +275,7 @@
static probefunc_t enable_msexplorer;
static probefunc_t enable_msintelli;
static probefunc_t enable_4dmouse;
+static probefunc_t enable_typhoon;
static probefunc_t enable_4dplus;
static probefunc_t enable_mmanplus;
static probefunc_t enable_versapad;
@@ -298,6 +299,8 @@
0x08, MOUSE_PS2_PACKETSIZE, enable_mmanplus, },
{ MOUSE_MODEL_EXPLORER, /* Microsoft IntelliMouse Explorer */
0x08, MOUSE_PS2INTELLI_PACKETSIZE, enable_msexplorer, },
+ { MOUSE_MODEL_TYPHOON, /* Typhoon Optical Mouse */
+ 0x08, MOUSE_TYPHOON_PACKETSIZE, enable_typhoon, },
{ MOUSE_MODEL_4D, /* A4 Tech 4D Mouse */
0x08, MOUSE_4D_PACKETSIZE, enable_4dmouse, },
{ MOUSE_MODEL_4DPLUS, /* A4 Tech 4D+ Mouse */
@@ -578,6 +581,7 @@
{ MOUSE_MODEL_VERSAPAD, "VersaPad" },
{ MOUSE_MODEL_EXPLORER, "IntelliMouse Explorer" },
{ MOUSE_MODEL_4D, "4D Mouse" },
+ { MOUSE_MODEL_TYPHOON, "Typhoon Optical Mouse" },
{ MOUSE_MODEL_4DPLUS, "4D+ Mouse" },
{ MOUSE_MODEL_GENERIC, "Generic PS/2 mouse" },
{ MOUSE_MODEL_UNKNOWN, NULL },
@@ -2288,6 +2292,28 @@
}
break;
+ case MOUSE_MODEL_TYPHOON:
+ /*
+ * the packet size of the Typhoon Optical Mouse is 6 bytes
+ *
+ * packet format *seems* to be as follows
+ *
+ * byte 1 - byte 3: PS/2 style, see psm(4)
+ * byte 4 == byte 1
+ * byte 5: z axis movement, either 0x01 or 0xff
+ * byte 6: 0
+ */
+ switch(sc->ipacket[4])
+ {
+ case 0x01:
+ z = 1;
+ break;
+ case 0xff:
+ z = -1;
+ break;
+ }
+ break;
+
case MOUSE_MODEL_4DPLUS:
if ((x < 16 - 256) && (y < 16 - 256)) {
/*
@@ -2741,6 +2767,31 @@
sc->hw.hwid = id;
sc->hw.buttons = 3; /* XXX some 4D mice have 4? */
+
+ return TRUE;
+}
+
+/* Typhoon Optical Mouse */
+static int
+enable_typhoon(struct psm_softc *sc)
+{
+ KBDC kbdc = sc->kbdc;
+ int id;
+
+ static unsigned char rate[] = { 200, 100, 80, 60, 40, 20 };
+ int i;
+
+ for (i = 0; i < sizeof(rate)/sizeof(rate[0]); ++i) {
+ if (set_mouse_sampling_rate(kbdc, rate[i]) != rate[i])
+ return FALSE;
+ }
+
+ id = get_aux_id(kbdc);
+ if (id != PSM_4DPLUS_ID) /* XXX */
+ return FALSE;
+
+ sc->hw.hwid = id;
+ sc->hw.buttons = 3;
return TRUE;
}
--
Yours,
Dominik
More information about the freebsd-hardware
mailing list