From owner-freebsd-usb@FreeBSD.ORG Thu Mar 15 18:50:04 2007 Return-Path: X-Original-To: freebsd-usb@hub.freebsd.org Delivered-To: freebsd-usb@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 2591416A401 for ; Thu, 15 Mar 2007 18:50:04 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [69.147.83.40]) by mx1.freebsd.org (Postfix) with ESMTP id 0624813C44B for ; Thu, 15 Mar 2007 18:50:04 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.13.4/8.13.4) with ESMTP id l2FIo38n090033 for ; Thu, 15 Mar 2007 18:50:03 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.13.4/8.13.4/Submit) id l2FIo3nb090032; Thu, 15 Mar 2007 18:50:03 GMT (envelope-from gnats) Resent-Date: Thu, 15 Mar 2007 18:50:03 GMT Resent-Message-Id: <200703151850.l2FIo3nb090032@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-usb@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, "Rui Paulo" Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 1F2D816A402 for ; Thu, 15 Mar 2007 18:49:08 +0000 (UTC) (envelope-from rpaulo@gmail.com) Received: from hu-out-0506.google.com (hu-out-0506.google.com [72.14.214.225]) by mx1.freebsd.org (Postfix) with ESMTP id 9333E13C465 for ; Thu, 15 Mar 2007 18:49:07 +0000 (UTC) (envelope-from rpaulo@gmail.com) Received: by hu-out-0506.google.com with SMTP id 38so2030552huc for ; Thu, 15 Mar 2007 11:49:06 -0700 (PDT) Received: by 10.114.158.1 with SMTP id g1mr374904wae.1173982862171; Thu, 15 Mar 2007 11:21:02 -0700 (PDT) Received: by 10.114.130.11 with HTTP; Thu, 15 Mar 2007 11:21:01 -0700 (PDT) Message-Id: Date: Thu, 15 Mar 2007 18:21:01 +0000 From: "Rui Paulo" Sender: rpaulo@gmail.com To: FreeBSD-gnats-submit@FreeBSD.org Cc: Subject: usb/110349: Support for USB mouses with W axis and inverted Z axis X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 15 Mar 2007 18:50:04 -0000 >Number: 110349 >Category: usb >Synopsis: Support for USB mouses with W axis and inverted Z axis >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-usb >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Thu Mar 15 18:50:03 GMT 2007 >Closed-Date: >Last-Modified: >Originator: Rui Paulo >Release: FreeBSD 7.0-CURRENT i386 >Organization: N/A >Environment: System: FreeBSD macbook.local 7.0-CURRENT FreeBSD 7.0-CURRENT #15: Thu Mar 15 01:26:27 WET 2007 rpaulo@macbook.local:/usr/obj/usr/src/sys/MACBOOK i386 >Description: FreeBSD lacks the NetBSD changes in sys/dev/usb/ums.c that make USB mouses with W axis (horizontal scroll) work (like the Apple Mighty mouse). This patch also makes USB mouses with inverted Z Axis work. Note that to make the W axis work, one has to make sysmouse understand it and teach it too to X11. >How-To-Repeat: Plug a Apple Mighty Mouse. You'll notice that the horizontal scroll is mapped to the vertical scroll. >Fix: The following patch syncs ums.c with NetBSD (only the Z Axis differences were done): Index: ums.c =================================================================== RCS file: /home/ncvs/src/sys/dev/usb/ums.c,v retrieving revision 1.83 diff -u -p -r1.83 ums.c --- ums.c 17 Jan 2007 03:50:45 -0000 1.83 +++ ums.c 15 Mar 2007 15:36:35 -0000 @@ -104,7 +104,7 @@ struct ums_softc { u_char *sc_ibuf; u_int8_t sc_iid; int sc_isize; - struct hid_location sc_loc_x, sc_loc_y, sc_loc_z, sc_loc_t; + struct hid_location sc_loc_x, sc_loc_y, sc_loc_z, sc_loc_t, sc_loc_w; struct hid_location *sc_loc_btn; usb_callout_t callout_handle; /* for spurious button ups */ @@ -116,6 +116,7 @@ struct ums_softc { #define UMS_Z 0x01 /* z direction available */ #define UMS_SPUR_BUT_UP 0x02 /* spurious button up events */ #define UMS_T 0x04 /* aa direction available (tilt) */ +#define UMS_REVZ 0x08 /* Z-axis is reversed */ int nbuttons; #define MAX_BUTTONS 31 /* chosen because sc_buttons is int */ @@ -209,7 +210,7 @@ USB_ATTACH(ums) usbd_status err; char devinfo[1024]; u_int32_t flags; - int i; + int i, wheel; struct hid_location loc_btn; sc->sc_disconnected = 1; @@ -266,14 +267,44 @@ USB_ATTACH(ums) USB_ATTACH_ERROR_RETURN; } - /* try to guess the Z activator: first check Z, then WHEEL */ - if (hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_Z), - hid_input, &sc->sc_loc_z, &flags) || - hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_WHEEL), - hid_input, &sc->sc_loc_z, &flags) || - hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_TWHEEL), - hid_input, &sc->sc_loc_z, &flags)) { + /* Try the wheel first as the Z activator since it's tradition. */ + wheel = hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, + HUG_WHEEL), + hid_input, &sc->sc_loc_z, &flags); + + if (wheel) { + if ((flags & MOUSE_FLAGS_MASK) != MOUSE_FLAGS) { + printf("\n%s: Wheel report 0x%04x not supported\n", + device_get_nameunit(sc->sc_dev), flags); + sc->sc_loc_z.size = 0; /* Bad Z coord, ignore it */ + } else { + sc->flags |= UMS_Z; + if (!(uaa->vendor == USB_VENDOR_APPLE && + uaa->product == USB_PRODUCT_APPLE_OPTICALM)) { + /* Some wheels need the Z axis reversed. */ + sc->flags |= UMS_REVZ; + } + + } + /* + * We might have both a wheel and Z direction, if so put + * put the Z on the W coordinate. + */ + if (hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, + HUG_Z), + hid_input, &sc->sc_loc_w, &flags)) { + if ((flags & MOUSE_FLAGS_MASK) != MOUSE_FLAGS) { + printf("\n%s: Z report 0x%04x not supported\n", + device_get_nameunit(sc->sc_dev), flags); + sc->sc_loc_w.size = 0; /* Bad Z, ignore */ + } + } + } else if (hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, + HUG_Z), + hid_input, &sc->sc_loc_z, &flags)) { if ((flags & MOUSE_FLAGS_MASK) != MOUSE_FLAGS) { + printf("\n%s: Z report 0x%04x not supported\n", + device_get_nameunit(sc->sc_dev), flags); sc->sc_loc_z.size = 0; /* Bad Z coord, ignore it */ } else { sc->flags |= UMS_Z; @@ -424,7 +455,7 @@ ums_intr(xfer, addr, status) { struct ums_softc *sc = addr; u_char *ibuf; - int dx, dy, dz, dt; + int dx, dy, dz, dw, dt; int buttons = 0; int i; @@ -474,6 +505,9 @@ ums_intr(xfer, addr, status) dx = hid_get_data(ibuf, &sc->sc_loc_x); dy = -hid_get_data(ibuf, &sc->sc_loc_y); dz = -hid_get_data(ibuf, &sc->sc_loc_z); + dw = hid_get_data(ibuf, &sc->sc_loc_w); + if (sc->flags & UMS_REVZ) + dz = -dz; if (sc->flags & UMS_T) dt = -hid_get_data(ibuf, &sc->sc_loc_t); else @@ -482,16 +516,17 @@ ums_intr(xfer, addr, status) if (hid_get_data(ibuf, &sc->sc_loc_btn[i])) buttons |= (1 << UMS_BUT(i)); - if (dx || dy || dz || dt || (sc->flags & UMS_Z) + if (dx || dy || dz || dt || dw || (sc->flags & UMS_Z) || buttons != sc->status.button) { - DPRINTFN(5, ("ums_intr: x:%d y:%d z:%d t:%d buttons:0x%x\n", - dx, dy, dz, dt, buttons)); + DPRINTFN(5, ("ums_intr: x:%d y:%d z:%d w:%d t:%d buttons:0x%x\n", + dx, dy, dz, dw, dt, buttons)); sc->status.button = buttons; sc->status.dx += dx; sc->status.dy += dy; sc->status.dz += dz; - /* sc->status.dt += dt;*/ /* no way to export this yet */ + /* sc->status.dt += dt; */ /* no way to export this yet */ + /* sc->status.dw += dw; */ /* idem */ /* Discard data in case of full buffer */ if (sc->qcount == sizeof(sc->qbuf)) { Index: usbdevs =================================================================== RCS file: /home/ncvs/src/sys/dev/usb/usbdevs,v retrieving revision 1.288 diff -u -p -r1.288 usbdevs --- usbdevs 27 Feb 2007 22:27:53 -0000 1.288 +++ usbdevs 15 Mar 2007 15:36:36 -0000 @@ -688,6 +688,7 @@ product APPLE IPOD_07 0x1207 iPod '07' product APPLE IPOD_08 0x1208 iPod '08' product APPLE IPODVIDEO 0x1209 iPod Video product APPLE IPODNANO 0x120a iPod Nano +product APPLE OPTICALM 0x0304 Apple Optical USB Mouse /* Arkmicro Technologies */ product ARKMICRO ARK3116 0x0232 ARK3116 Serial @@ -1491,6 +1492,7 @@ product PRIMAX COMFORT 0x4d01 Comfort product PRIMAX MOUSEINABOX 0x4d02 Mouse-in-a-Box product PRIMAX PCGAUMS1 0x4d04 Sony PCGA-UMS1 + /* Prolific products */ product PROLIFIC PL2301 0x0000 PL2301 Host-Host interface product PROLIFIC PL2302 0x0001 PL2302 Host-Host interface >Release-Note: >Audit-Trail: >Unformatted: