Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Nov 2006 18:00:38 GMT
From:      "Dorr H. Clark" <dclark@engr.scu.edu>
To:        freebsd-usb@FreeBSD.org
Subject:   6.x fix for 90162 (was Re: usb/90162: [usb] [patch] Add support for the MS Wireless USB Mouse)
Message-ID:  <200611201800.kAKI0cgC005510@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR usb/90162; it has been noted by GNATS.

From: "Dorr H. Clark" <dclark@engr.scu.edu>
To: bug-followup@FreeBSD.org, hm@FreeBSD.org
Cc:  
Subject: 6.x fix for 90162 (was Re: usb/90162: [usb] [patch] Add support for
 the MS Wireless USB Mouse)
Date: Mon, 20 Nov 2006 09:52:53 -0800

 This change adds support for the Microsoft Wireless Notebook
 Optical Mouse, which fixes 90162.  The fix addresses the 3 problems
 associated with this mouse: its misrepresentation as a uhid device,
 invalid offsets for its buttons and x,y,z position coordinates,
 and the phantom button click.
 
 The first problem is resolved by bypassing hid_is_collection() and
 reading the usb interface descriptor directly to detect a usb mouse.
 The second problem is resolved by hard coding the offsets of the
 mouse's buttons.  The third problem is resolved by ignoring all
 interrupts requests for that mouse with the first byte of ibuf
 set to 0x14.
 
 
 Cesar Philippidis
 Hellmuth Michaelis
 Engineers
 
 Dorr H. Clark
 Advisor
 
 Graduate School of Engineering
 Santa Clara University
 
 
 (Note:  This is a 6.x fix, we believe additional work is needed for a 
 backport to 5.x)
 
 diff -uh usb.orig/ums.c usb/ums.c
 --- usb.orig/ums.c      Fri Nov  3 03:31:30 2006
 +++ usb/ums.c   Sun Nov  5 20:11:04 2006
 @@ -188,8 +188,9 @@
          if (err)
                  return (UMATCH_NONE);
 
 -       if (hid_is_collection(desc, size,
 -                             HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_MOUSE)))
 +       if (id->bInterfaceClass == UICLASS_HID &&
 +           id->bInterfaceSubClass == UISUBCLASS_BOOT &&
 +           id->bInterfaceProtocol == UIPROTO_MOUSE)
                  ret = UMATCH_IFACECLASS;
          else
                  ret = UMATCH_NONE;
 @@ -320,6 +321,29 @@
                  USB_ATTACH_ERROR_RETURN;
          }
 
 +       /*
 +        * The Microsoft Wireless Notebook Optical Mouse seems to be in 
 worse
 +        * shape than the Wireless Intellimouse 2.0, as its X, Y, wheel, 
 and all
 +        * of its other button positions are all off. It also reports 
 that it
 +        * has two addional buttons and a tilt wheel.
 +        */
 +       if (uaa->vendor == USB_VENDOR_MICROSOFT &&
 +               uaa->product == USB_PRODUCT_MICROSOFT_WLUSBMOUSE) {
 +               sc->flags = UMS_Z;
 +               sc->flags |= UMS_SPUR_BUT_UP;
 +               sc->nbuttons = 3;
 +               sc->sc_isize = 5;
 +               sc->sc_iid = 0;
 +
 +       /* 1st byte of descriptor report contains garbage for this mouse */
 +               sc->sc_loc_x.pos = 16;
 +               sc->sc_loc_y.pos = 24;
 +               sc->sc_loc_z.pos = 32;
 +               sc->sc_loc_btn[0].pos = 8;
 +               sc->sc_loc_btn[1].pos = 9;
 +               sc->sc_loc_btn[2].pos = 10;
 +       }
 +
          sc->sc_ep_addr = ed->bEndpointAddress;
          sc->sc_disconnected = 0;
          free(desc, M_TEMP);
 @@ -457,12 +481,20 @@
           * This should sort that.
           * Currently it's the only user of UMS_T so use it as an 
 identifier.
           * We probably should switch to some more official quirk.
 +        *
 +        * UPDATE: This problem affects the M$ Wireless Notebook Optical 
 Mouse,
 +        * too. However, the leading byte for this mouse is normally 0x11,
 +        * and the phantom mouse click occurs when its 0x14.
           */
          if (sc->flags & UMS_T) {
                  if (sc->sc_iid) {
                          if (*ibuf++ == 0x02)
                                  return;
                  }
 +       } else if (sc->flags & UMS_SPUR_BUT_UP) {
 +               DPRINTFN(5, ("ums_intr: #### ibuf[0] = %d ####\n", *ibuf));
 +               if (*ibuf == 0x14)
 +                       return;
          } else {
                  if (sc->sc_iid) {
                          if (*ibuf++ != sc->sc_iid)
 
 diff -uh usb.orig/usb.h usb/usb.h
 --- usb.orig/usb.h      Fri Nov  3 03:31:30 2006
 +++ usb/usb.h   Thu Nov  2 16:33:52 2006
 @@ -426,6 +426,7 @@
   #define UICLASS_HID            0x03
   #define  UISUBCLASS_BOOT       1
   #define  UIPROTO_BOOT_KEYBOARD 1
 +#define  UIPROTO_MOUSE         2
 
   #define UICLASS_PHYSICAL       0x05
 
 diff -uh usb.orig/usbdevs usb/usbdevs
 --- usb.orig/usbdevs    Fri Nov  3 03:31:30 2006
 +++ usb/usbdevs Fri Nov  3 03:45:25 2006
 @@ -1182,6 +1182,7 @@
   product MICROSOFT INTELLIEYE   0x0025  IntelliEye mouse
   product MICROSOFT INETPRO2     0x002b  Internet Keyboard Pro
   product MICROSOFT MN110                0x007a  10/100 USB NIC
 +product MICROSOFT WLUSBMOUSE   0x00b9  Wireless USB Mouse
 
   /* Microtech products */
   product MICROTECH SCSIDB25     0x0004  USB-SCSI-DB25
 



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