kern/57230: [patch] psm(4) incorrectly identifies anIntelliMouse
Explorer attached through an Avocent SwitchView KVM
Tom Convery
tpc at tomfoo.com
Sat Dec 20 21:00:39 PST 2003
The following reply was made to PR kern/57230; it has been noted by GNATS.
From: Tom Convery <tpc at tomfoo.com>
To: freebsd-gnats-submit at FreeBSD.org
Cc:
Subject: Re: kern/57230: [patch] psm(4) incorrectly identifies an IntelliMouse
Explorer attached through an Avocent SwitchView KVM
Date: Sat, 20 Dec 2003 23:52:58 -0500
This is a multi-part message in MIME format.
--------------030004040903090200060007
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Attached is an update patch that applies cleanly to 5-CURRENT as of
mid-December 2003.
--------------030004040903090200060007
Content-Type: text/plain;
name="intellimouse.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="intellimouse.patch"
--- psm.c.orig Sat Dec 20 23:34:43 2003
+++ psm.c Sat Dec 20 23:47:52 2003
@@ -774,6 +774,28 @@
}
}
+ /*
+ * The Avocent SwitchView KVM appears to force an Intellimouse Explorer
+ * to revert to plain Intellimouse protocol whenever the device is
+ * disabled. This hack checks to see if we previously detected an Explorer,
+ * and tests if the device is now reporting a different ID. If this is the
+ * case, we try to re-enable Explorer functionality.
+ */
+ if ((sc->hw.hwid == PSM_EXPLORER_ID) &&
+ (get_aux_id(sc->kbdc) != PSM_EXPLORER_ID)) {
+ log(LOG_DEBUG, "psm%d: Intellimouse Explorer reverted to lower "
+ "protocol.\n", sc->unit);
+ enable_msexplorer(sc);
+ if (get_aux_id(sc->kbdc) == PSM_EXPLORER_ID)
+ log(LOG_DEBUG, "psm%d: Restored Intellimouse Explorer protocol.\n",
+ sc->unit);
+ else
+ log(LOG_DEBUG, "psm%d: Could not restore Intellimouse Explorer "
+ " protocol.\n", sc->unit);
+ /* We shouldn't get here unless someone switched mice out from
+ * underneath us. How and/or should we deal with this? */
+ }
+
if (get_mouse_status(sc->kbdc, stat, 0, 3) < 3)
log(LOG_DEBUG, "psm%d: failed to get status (doopen).\n", sc->unit);
@@ -2768,18 +2790,38 @@
static int
enable_msexplorer(struct psm_softc *sc)
{
+ /* IntelliMouse initialization sequence */
static unsigned char rate0[] = { 200, 100, 80, };
+ /* IntelliMouse Explorer initialization sequence */
static unsigned char rate1[] = { 200, 200, 80, };
KBDC kbdc = sc->kbdc;
int id;
int i;
- /* the special sequence to enable the extra buttons and the roller. */
+ /*
+ * According to Microsoft's documentation for the IntelliMouse Explorer,
+ * full functionality is activated by first sending the IntelliMouse
+ * initialization sequence, then sending the Explorer initialization
+ * sequence.
+ * Reference: http://www.microsoft.com/whdc/hwdev/tech/input/5b_wheel.mspx
+ */
+
+ /* First send the IntelliMouse init sequence */
+ for (i = 0; i < sizeof(rate0)/sizeof(rate0[0]); ++i) {
+ if (set_mouse_sampling_rate(kbdc, rate0[i]) != rate0[i])
+ return FALSE;
+ }
+ /* If we've got an Explorer, it will claim to be an IntelliMouse here */
+ id = get_aux_id(kbdc);
+ if (id != PSM_INTELLI_ID)
+ return FALSE;
+
+ /* Now send the Explorer init sequence */
for (i = 0; i < sizeof(rate1)/sizeof(rate1[0]); ++i) {
if (set_mouse_sampling_rate(kbdc, rate1[i]) != rate1[i])
return FALSE;
}
- /* the device will give the genuine ID only after the above sequence */
+ /* If we've got an Explorer, now it will identify itself */
id = get_aux_id(kbdc);
if (id != PSM_EXPLORER_ID)
return FALSE;
@@ -2797,11 +2839,18 @@
* sequence; it will make the KVM think the mouse is IntelliMouse
* when it is in fact IntelliMouse Explorer.
*/
+
+#if 0
+ /*
+ * This breaks IntelliMouse Explorer support with the Avocent
+ * SwitchView, which DOES actually understand the Explorer protocol.
+ */
for (i = 0; i < sizeof(rate0)/sizeof(rate0[0]); ++i) {
if (set_mouse_sampling_rate(kbdc, rate0[i]) != rate0[i])
break;
}
id = get_aux_id(kbdc);
+#endif
return TRUE;
}
--------------030004040903090200060007--
More information about the freebsd-bugs
mailing list