Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 29 Nov 2009 20:48:20 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r199948 - head/sys/dev/usb/input
Message-ID:  <200911292048.nATKmKVc008767@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Sun Nov 29 20:48:19 2009
New Revision: 199948
URL: http://svn.freebsd.org/changeset/base/199948

Log:
  Early-generation touchpads do not send periodic calibration frames for
  baseline subtraction, and are very temperature sensitive, so would slowly
  drift out of a calibrated state when under load. Escape this by taking
  the last frame before we decide that the pad is idle as a finger-free
  baseline.
  
  Tested on:	iBook G4

Modified:
  head/sys/dev/usb/input/atp.c

Modified: head/sys/dev/usb/input/atp.c
==============================================================================
--- head/sys/dev/usb/input/atp.c	Sun Nov 29 20:47:43 2009	(r199947)
+++ head/sys/dev/usb/input/atp.c	Sun Nov 29 20:48:19 2009	(r199948)
@@ -1850,6 +1850,21 @@ atp_intr(struct usb_xfer *xfer, usb_erro
 			sc->sc_idlecount++;
 			if (sc->sc_idlecount >= ATP_IDLENESS_THRESHOLD) {
 				DPRINTFN(ATP_LLEVEL_INFO, "idle\n");
+
+				/*
+				 * Use the last frame before we go idle for
+				 * calibration on pads which do not send
+				 * calibration frames.
+				 */
+				if (sc->sc_params->prot < ATP_PROT_GEYSER3) {
+					memcpy(sc->base_x, sc->cur_x,
+					    sc->sc_params->n_xsensors *
+					    sizeof(*(sc->base_x)));
+					memcpy(sc->base_y, sc->cur_y,
+					    sc->sc_params->n_ysensors *
+					    sizeof(*(sc->base_y)));
+				}
+
 				sc->sc_idlecount = 0;
 				usbd_transfer_start(sc->sc_xfer[ATP_RESET]);
 			}



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