From c3be736aeb24f44cf95dfad8fe3f1c7c6f367aaf Mon Sep 17 00:00:00 2001 From: merge Date: Mon, 8 Dec 2008 11:03:03 +0000 Subject: MERGE-via-pending-tracking-hist-MERGE-via-stable-tracking-remove-skip-filter-1228733704 pending-tracking-hist top was MERGE-via-stable-tracking-remove-skip-filter-1228733704 / 552c6fdd4c644ab2618ad27564d159ed28bbd859 ... parent commitmessage: From: merge MERGE-via-stable-tracking-hist-remove-skip-filter stable-tracking-hist top was remove-skip-filter / 92bdef8636873a19efc05b2a19578a0aa93dba41 ... parent commitmessage: From: Nelson Castillo Remove skip filter With more reliable points median and mean filters perform a better job. We no longer need this filter. Signed-off-by: Nelson Castillo --- drivers/input/touchscreen/s3c2410_ts.c | 119 +++------------------------------ 1 file changed, 11 insertions(+), 108 deletions(-) (limited to 'drivers/input/touchscreen/s3c2410_ts.c') diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c index ea0f58aaf32..8e6bc0a0371 100644 --- a/drivers/input/touchscreen/s3c2410_ts.c +++ b/drivers/input/touchscreen/s3c2410_ts.c @@ -19,7 +19,7 @@ * ChangeLog * * 2004-09-05: Herbert Pƶtzl - * - added clock (de-)allocation code + * - added clock (de-)allocation code * * 2005-03-06: Arnaud Patard * - h1940_ -> s3c2410 (this driver is now also used on the n30 @@ -35,11 +35,14 @@ * controller * * 2007-05-23: Harald Welte - * - Add proper support for S32440 + * - Add proper support for S32440 * * 2008-06-23: Andy Green * - removed averaging system * - added generic Touchscreen filter stuff + * + * 2008-11-27: Nelson Castillo + * - improve interrupt handling */ #include @@ -97,13 +100,9 @@ static char *s3c2410ts_name = "s3c2410 TouchScreen"; #define TS_EVENT_FIFO_SIZE (2 << 6) /* must be a power of 2 */ #define TS_STATE_STANDBY 0 /* initial state */ -#define TS_STATE_PRESSED_PENDING 1 -#define TS_STATE_PRESSED 2 -#define TS_STATE_RELEASE_PENDING 3 -#define TS_STATE_RELEASE 4 - -#define SKIP_NHEAD 2 -#define SKIP_NTAIL 1 +#define TS_STATE_PRESSED 1 +#define TS_STATE_RELEASE_PENDING 2 +#define TS_STATE_RELEASE 3 /* * Per-touchscreen data. @@ -180,92 +179,8 @@ static void ts_input_report(int event, int coords[]) input_sync(ts.dev); } - -/* - * Skip filter for touchscreen values. - * - * Problem: The first and the last sample might be unreliable. We provide - * this filter as a separate function in order to keep the event_send_timer_f - * function simple. This filter: - * - * - Skips NHEAD points after IE_DOWN - * - Skips NTAIL points before IE_UP - * - Ignores a click if we have less than (NHEAD + NTAILl + 1) points - */ - -struct skip_filter_event { - int coords[2]; -}; - -struct skip_filter { - unsigned N; - unsigned M; - int sent; - struct skip_filter_event buf[SKIP_NTAIL]; -}; - -struct skip_filter ts_skip; - -static void ts_skip_filter_reset(void) -{ - ts_skip.N = 0; - ts_skip.M = 0; - ts_skip.sent = 0; -} - -static void ts_skip_filter(int event, int coords[]) -{ - /* skip the first N samples */ - if (ts_skip.N < SKIP_NHEAD) { - if (IE_UP == event) - ts_skip_filter_reset(); - else - ts_skip.N++; - return; - } - - /* We didn't send DOWN -- Ignore UP */ - if (IE_UP == event && !ts_skip.sent) { - ts_skip_filter_reset(); - return; - } - - /* Just accept the event if NTAIL == 0 */ - if (!SKIP_NTAIL) { - ts_input_report(event, coords); - if (IE_UP == event) - ts_skip_filter_reset(); - else - ts_skip.sent = 1; - return; - } - - /* NTAIL > 0, Queue current point if we need to */ - if (!ts_skip.sent && ts_skip.M < SKIP_NTAIL) { - memcpy(&ts_skip.buf[ts_skip.M++].coords[0], &coords[0], - sizeof(int) * 2); - return; - } - - /* queue full: accept one, queue one */ - - if (ts_skip.M >= SKIP_NTAIL) - ts_skip.M = 0; - - ts_input_report(event, ts_skip.buf[ts_skip.M].coords); - - if (event == IE_UP) { - ts_skip_filter_reset(); - } else { - memcpy(&ts_skip.buf[ts_skip.M++].coords[0], &coords[0], - sizeof(int) * 2); - ts_skip.sent = 1; - } -} - - /* - * Manage the state of the touchscreen. Send events to the skip filter. + * Manage the state of the touchscreen. */ static void event_send_timer_f(unsigned long data); @@ -294,9 +209,6 @@ static void event_send_timer_f(unsigned long data) if (ts.state == TS_STATE_RELEASE_PENDING) /* Ignore short UP event */ ts.state = TS_STATE_PRESSED; - else - /* Defer PRESSED until we get a valid point */ - ts.state = TS_STATE_PRESSED_PENDING; break; case 'U': @@ -313,9 +225,8 @@ static void event_send_timer_f(unsigned long data) != sizeof(int) * 2)) goto ts_exit_error; - ts_skip_filter(IE_DOWN, buf); + ts_input_report(IE_DOWN, buf); ts.state = TS_STATE_PRESSED; - break; default: @@ -332,7 +243,7 @@ static void event_send_timer_f(unsigned long data) * while to avoid jitter. If we get a DOWN * event we do not send it. */ - ts_skip_filter(IE_UP, NULL); + ts_input_report(IE_UP, NULL); ts.state = TS_STATE_STANDBY; if (ts.tsf[0]) @@ -517,8 +428,6 @@ static int __init s3c2410ts_probe(struct platform_device *pdev) ts.dev->id.version = S3C2410TSVERSION; ts.state = TS_STATE_STANDBY; - ts_skip_filter_reset(); - /* create the filter chain set up for the 2 coordinates we produce */ ret = ts_filter_create_chain( (struct ts_filter_api **)&info->filter_sequence, @@ -710,9 +619,3 @@ static void __exit s3c2410ts_exit(void) module_init(s3c2410ts_init); module_exit(s3c2410ts_exit); -/* - Local variables: - compile-command: "make ARCH=arm CROSS_COMPILE=/usr/local/arm/3.3.2/bin/arm-linux- -k -C ../../.." - c-basic-offset: 8 - End: -*/ -- cgit v1.2.3