NetBSD Problem Report #40287

From ryo@lab.misakimix.org  Sun Dec 28 17:44:57 2008
Return-Path: <ryo@lab.misakimix.org>
Received: from mail.netbsd.org (mail.netbsd.org [204.152.190.11])
	by narn.NetBSD.org (Postfix) with ESMTP id 36C4763BC6A
	for <gnats-bugs@gnats.NetBSD.org>; Sun, 28 Dec 2008 17:44:57 +0000 (UTC)
Message-Id: <20081228174455.2D24745A4B9@lab.misakimix.org>
Date: Mon, 29 Dec 2008 02:44:55 +0900 (JST)
From: ryo@nerv.org
Reply-To: ryo@nerv.org
To: gnats-bugs@gnats.NetBSD.org
Subject: ums doesn't support TouchPanel
X-Send-Pr-Version: 3.95

>Number:         40287
>Category:       kern
>Synopsis:       ums doesn't support absolute axis device
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Dec 28 17:45:00 +0000 2008
>Originator:     Ryo Shimizu
>Release:        NetBSD 5.99.5
>Organization:
>Environment:
System: NetBSD msr 5.99.5 NetBSD 5.99.5 (KOHJINSHA) #54: Mon Dec 29 01:53:07 JST 2008  ryo@moveq.nerv.org:/usr/src/sys/arch/i386/compile/KOHJINSHA i386
Architecture: i386
Machine: i386
>Description:
add ums support for absolute axis device.
>How-To-Repeat:
boot netbsd with DIALOGUE INC PenMount USB device.
DIALOGUE INC PenMount USB is a onboard device of KOHJINSHA SA5SX04.

# dmesg
:
uhub2 at uhub1 port 4: Standard Microsystems product 0x2503, class 9/0, rev 2.00/0.01, addr 2
uhub2: multiple transaction translators
uhub2: 2 ports with 1 removable, self powered
uhidev0 at uhub2 port 1 configuration 1 interface 0
uhidev0: DIALOGUE INC PenMount USB, rev 1.00/a4.b4, addr 3, iclass 3/1
ums0 at uhidev0
ums0: X report 0x0002 not supported
:

# usbhidctl -f 0 -v -r
Report descriptor:
Input   size=6 count=1 Const page=Digitizer usage=Touch_Screen, logical range 0..63
Collection page=Generic_Desktop usage=Mouse
Collection page=0x0000 usage=0x0000
Input   size=1 count=1 page=Button usage=Button_1, logical range 0..1
Input   size=1 count=1 page=Button usage=Button_2, logical range 0..1
Input   size=16 count=1 page=Generic_Desktop usage=X, logical range 0..1023, physical range 0..32767
Input   size=16 count=1 page=Generic_Desktop usage=Y, logical range 0..1023, physical range 0..32767
Feature size=8 count=1 page=Generic_Desktop usage=0x00ff, logical range 0..1023, physical range 0..32767
Feature size=8 count=1 page=Generic_Desktop usage=0x00ff, logical range 0..1023, physical range 0..32767
Feature size=8 count=1 page=Generic_Desktop usage=0x00ff, logical range 0..1023, physical range 0..32767
Feature size=8 count=1 page=Generic_Desktop usage=0x00ff, logical range 0..1023, physical range 0..32767
Feature size=8 count=1 page=Generic_Desktop usage=0x00ff, logical range 0..1023, physical range 0..32767
End collection
End collection
Total   input size 5 bytes
Total  output size 0 bytes
Total feature size 5 bytes

>Fix:
apply this patch.

Index: ums.c
===================================================================
RCS file: /src/cvs/cvsroot/netbsd/src/sys/dev/usb/ums.c,v
retrieving revision 1.73
diff -a -c -3 -r1.73 ums.c
*** ums.c	24 May 2008 16:40:58 -0000	1.73
--- ums.c	28 Dec 2008 16:54:23 -0000
***************
*** 62,67 ****
--- 62,68 ----

  #include <dev/wscons/wsconsio.h>
  #include <dev/wscons/wsmousevar.h>
+ #include <dev/wscons/tpcalibvar.h>

  #ifdef USB_DEBUG
  #define DPRINTF(x)	if (umsdebug) logprintf x
***************
*** 95,106 ****
  #define UMS_Z		0x01	/* z direction available */
  #define UMS_SPUR_BUT_UP	0x02	/* spurious button up events */
  #define UMS_REVZ	0x04	/* Z-axis is reversed */

  	int nbuttons;

  	u_int32_t sc_buttons;	/* mouse button status */
  	device_t sc_wsmousedev;
! 
  	char			sc_dying;
  };

--- 96,111 ----
  #define UMS_Z		0x01	/* z direction available */
  #define UMS_SPUR_BUT_UP	0x02	/* spurious button up events */
  #define UMS_REVZ	0x04	/* Z-axis is reversed */
+ #define UMS_TPANEL	0x08	/* absolute XY-axis */

  	int nbuttons;

  	u_int32_t sc_buttons;	/* mouse button status */
+ 	int sc_x;		/* last X (UMS_TPANEL) */
+ 	int sc_y;		/* last Y (UMS_TPANEL) */
  	device_t sc_wsmousedev;
! 	struct tpcalib_softc sc_tpcalib;
! 	struct wsmouse_calibcoords sc_calibcoords;
  	char			sc_dying;
  };

***************
*** 162,167 ****
--- 167,175 ----
  	sc->sc_hdev.sc_parent = uha->parent;
  	sc->sc_hdev.sc_report_id = uha->reportid;

+ 	memset(&sc->sc_calibcoords, 0, sizeof(sc->sc_calibcoords));
+ 	sc->sc_calibcoords.samplelen = WSMOUSE_CALIBCOORDS_RESET;
+ 
  	quirks = usbd_get_quirks(uha->parent->sc_udev)->uq_flags;
  	if (quirks & UQ_MS_REVZ)
  		sc->flags |= UMS_REVZ;
***************
*** 179,189 ****
  		       USBDEVNAME(sc->sc_hdev.sc_dev));
  		USB_ATTACH_ERROR_RETURN;
  	}
! 	if ((flags & MOUSE_FLAGS_MASK) != MOUSE_FLAGS) {
! 		aprint_error("\n%s: X report 0x%04x not supported\n",
! 		       USBDEVNAME(sc->sc_hdev.sc_dev), flags);
! 		USB_ATTACH_ERROR_RETURN;
! 	}

  	if (!hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_Y),
  	       uha->reportid, hid_input, &sc->sc_loc_y, &flags)) {
--- 187,194 ----
  		       USBDEVNAME(sc->sc_hdev.sc_dev));
  		USB_ATTACH_ERROR_RETURN;
  	}
! 	if ((flags & MOUSE_FLAGS_MASK) == 0)
! 		sc->flags |= UMS_TPANEL;

  	if (!hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_Y),
  	       uha->reportid, hid_input, &sc->sc_loc_y, &flags)) {
***************
*** 191,201 ****
  		       USBDEVNAME(sc->sc_hdev.sc_dev));
  		USB_ATTACH_ERROR_RETURN;
  	}
! 	if ((flags & MOUSE_FLAGS_MASK) != MOUSE_FLAGS) {
! 		aprint_error("\n%s: Y report 0x%04x not supported\n",
! 		       USBDEVNAME(sc->sc_hdev.sc_dev), flags);
! 		USB_ATTACH_ERROR_RETURN;
! 	}

  	/* Try the wheel first as the Z activator since it's tradition. */
  	wheel = hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP,
--- 196,203 ----
  		       USBDEVNAME(sc->sc_hdev.sc_dev));
  		USB_ATTACH_ERROR_RETURN;
  	}
! 	if ((flags & MOUSE_FLAGS_MASK) == 0)
! 		sc->flags |= UMS_TPANEL;

  	/* Try the wheel first as the Z activator since it's tradition. */
  	wheel = hid_locate(desc, size, HID_USAGE2(HUP_GENERIC_DESKTOP,
***************
*** 246,254 ****
  			break;
  	sc->nbuttons = i - 1;

! 	aprint_normal(": %d button%s%s\n",
  	    sc->nbuttons, sc->nbuttons == 1 ? "" : "s",
! 	    sc->flags & UMS_Z ? " and Z dir." : "");

  	for (i = 1; i <= sc->nbuttons; i++)
  		hid_locate(desc, size, HID_USAGE2(HUP_BUTTON, i),
--- 248,257 ----
  			break;
  	sc->nbuttons = i - 1;

! 	aprint_normal(": %d button%s%s%s\n",
  	    sc->nbuttons, sc->nbuttons == 1 ? "" : "s",
! 	    sc->flags & UMS_Z ? ", Z dir" : "",
! 	    sc->flags & UMS_TPANEL ? ", touchpanel" : "");

  	for (i = 1; i <= sc->nbuttons; i++)
  		hid_locate(desc, size, HID_USAGE2(HUP_BUTTON, i),
***************
*** 275,280 ****
--- 278,287 ----

  	sc->sc_wsmousedev = config_found(self, &a, wsmousedevprint);

+ 	tpcalib_init(&sc->sc_tpcalib);
+ 	tpcalib_ioctl(&sc->sc_tpcalib, WSMOUSEIO_SCALIBCOORDS,
+ 	    (void *)&sc->sc_calibcoords, 0, 0);
+ 
  	USB_ATTACH_SUCCESS_RETURN;
  }

***************
*** 334,361 ****

  	DPRINTFN(5,("ums_intr: len=%d\n", len));

! 	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;
  	for (i = 0; i < sc->nbuttons; i++)
  		if (hid_get_data(ibuf, &sc->sc_loc_btn[i]))
  			buttons |= (1 << UMS_BUT(i));

! 	if (dx != 0 || dy != 0 || dz != 0 || dw != 0 ||
! 	    buttons != sc->sc_buttons) {
! 		DPRINTFN(10, ("ums_intr: x:%d y:%d z:%d w:%d buttons:0x%x\n",
! 			dx, dy, dz, dw, buttons));
! 		sc->sc_buttons = buttons;
! 		if (sc->sc_wsmousedev != NULL) {
! 			s = spltty();
! 			wsmouse_input(sc->sc_wsmousedev,
! 					buttons,
! 					dx, dy, dz, dw,
! 					WSMOUSE_INPUT_DELTA);
! 			splx(s);
  		}
  	}
  }
--- 341,394 ----

  	DPRINTFN(5,("ums_intr: len=%d\n", len));

! 	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;
  	for (i = 0; i < sc->nbuttons; i++)
  		if (hid_get_data(ibuf, &sc->sc_loc_btn[i]))
  			buttons |= (1 << UMS_BUT(i));

! 	if (sc->flags & UMS_TPANEL) {
! 		tpcalib_trans(&sc->sc_tpcalib, dx, dy, &dx, &dy);
! 		if (dx != sc->sc_x || dy != sc->sc_y || dz != 0 || dw != 0 ||
! 		    buttons != sc->sc_buttons) {
! 
! 			DPRINTFN(10, ("ums_intr: absx:%d absy:%d, z:%d w:%d buttons:0x%x\n",
! 			    dx, dy, dz, dw, buttons));
! 
! 			sc->sc_x = dx;
! 			sc->sc_y = dy;
! 			sc->sc_buttons = buttons;
! 			if (sc->sc_wsmousedev != NULL) {
! 				s = spltty();
! 				wsmouse_input(sc->sc_wsmousedev,
! 				    buttons,
! 				    dx, dy, dz, dw,
! 				    WSMOUSE_INPUT_ABSOLUTE_X |
! 				    WSMOUSE_INPUT_ABSOLUTE_Y);
! 				splx(s);
! 			}
! 		}
! 	} else {
! 		dy = -dy;
! 		if (dx != 0 || dy != 0 || dz != 0 || dw != 0 ||
! 		    buttons != sc->sc_buttons) {
! 
! 			DPRINTFN(10, ("ums_intr: x:%d y:%d z:%d w:%d buttons:0x%x\n",
! 			    dx, dy, dz, dw, buttons));
! 
! 			sc->sc_buttons = buttons;
! 			if (sc->sc_wsmousedev != NULL) {
! 				s = spltty();
! 				wsmouse_input(sc->sc_wsmousedev,
! 				    buttons,
! 				    dx, dy, dz, dw,
! 				    WSMOUSE_INPUT_DELTA);
! 				splx(s);
! 			}
  		}
  	}
  }
***************
*** 401,410 ****
      struct lwp * p)

  {
  	switch (cmd) {
  	case WSMOUSEIO_GTYPE:
! 		*(u_int *)data = WSMOUSE_TYPE_USB;
  		return (0);
  	}

  	return (EPASSTHROUGH);
--- 434,452 ----
      struct lwp * p)

  {
+ 	struct ums_softc *sc = (struct ums_softc *)v;
+ 
  	switch (cmd) {
  	case WSMOUSEIO_GTYPE:
! 		if (sc->flags & UMS_TPANEL)
! 			*(u_int *)data = WSMOUSE_TYPE_TPANEL;
! 		else
! 			*(u_int *)data = WSMOUSE_TYPE_USB;
  		return (0);
+ 
+ 	case WSMOUSEIO_SCALIBCOORDS:
+ 	case WSMOUSEIO_GCALIBCOORDS:
+ 		return tpcalib_ioctl(&sc->sc_tpcalib, cmd, data, flag, p);
  	}

  	return (EPASSTHROUGH);

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.