Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 25 Sep 2003 23:18:04 -0400 (EDT)
From:      Tom Convery <tpc@tomfoo.com>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   kern/57230: [patch] psm(4) incorrectly identifies an IntelliMouse Explorer attached through an Avocent SwitchView KVM
Message-ID:  <200309260318.h8Q3I48p033068@builder.tomfoo.com>
Resent-Message-ID: <200309260320.h8Q3KItk059877@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         57230
>Category:       kern
>Synopsis:       [patch] psm(4) incorrectly identifies an IntelliMouse Explorer attached through an Avocent SwitchView KVM
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Sep 25 20:20:18 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator:     Tom Convery <tpc@tomfoo.com>
>Release:        FreeBSD 5.1-CURRENT i386
>Organization:
>Environment:
System: FreeBSD builder.tomfoo.com 5.1-CURRENT FreeBSD 5.1-CURRENT #4: Wed Sep 24 09:48:01 EDT 2003 tom@builder.tomfoo.com:/usr/obj/usr/src/sys/BUILDER i386


	
>Description:
psm(4) identifies an IntelliMouse Explorer (4 buttons + wheel) as a standard
IntelliMouse (2 buttons + wheel) when the Explorer is attached through an
Avocent SwitchView KVM. According to Avocent's documentation, the SwitchView
is compatible with the IntelliMouse Explorer.

As best I can tell, the misidentification happens because psm doesn't probe
the Explorer exactly as described by Microsoft at
http://www.microsoft.com/whdc/hwdev/tech/input/5b_wheel.mspx, and the 
SwitchView needs the exact probe sequence to be happy.
>How-To-Repeat:
Attach an IntelliMouse Explorer through an Avocent SwitchView to a PS/2 
mouse port.
>Fix:
This patch fixes the problem for me. It does not break detection of either
a plain Intellimouse or an Intellimouse Explorer attached directly to the
PS/2 port.

This patch should apply to -STABLE as well.

--- intellimouse.patch begins here ---
--- src/sys/isa/psm.c.orig	Sat Jul 12 14:36:04 2003
+++ src/sys/isa/psm.c	Thu Sep 25 12:49:55 2003
@@ -751,6 +751,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);
 
@@ -2647,18 +2669,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;
@@ -2676,11 +2718,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;
 }
--- intellimouse.patch ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200309260318.h8Q3I48p033068>