aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorDima Kogan <dkogan@cds.caltech.edu>2008-11-19 17:10:52 +0000
committerAndy Green <agreen@pads.home.warmcat.com>2008-11-19 17:10:52 +0000
commit22ea8413a4b90d637f42dfa6314d124718dd191c (patch)
treee53501b4438bbfb0a773a1330247051535c27ad3 /drivers
parentc1bdeafc8af94d65f7b0a9a35a95c7a6ef0008d7 (diff)
soft_tap.patch
Hi all. I'm seeing a behavior in my freerunner where light taps on the touchscreen are not registered as clicks by the kernel even though the base hardware does report clicking events. I'm seeing the kernel generate extra "unclick" events in these cases. It looks like in the driver, an unclick event is processed before the click event, thus suppressing the click from ever being generated. I'm attaching a patch that addresses this. I'm now able to type much faster on the matchbox keyboard, even when using my fingertips instead of fingernails. Dima Signed-off-by: Dima Kogan <dkogan@cds.caltech.edu>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/input/touchscreen/s3c2410_ts.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c
index 0933a33bc9a..5b4cd52ec01 100644
--- a/drivers/input/touchscreen/s3c2410_ts.c
+++ b/drivers/input/touchscreen/s3c2410_ts.c
@@ -118,6 +118,7 @@ struct s3c2410ts {
struct s3c2410ts_sample raw_running_avg;
int reject_threshold_vs_avg;
int flag_previous_exceeded_threshold;
+ int flag_first_touch_sent;
};
static struct s3c2410ts ts;
@@ -130,6 +131,7 @@ static void clear_raw_fifo(void)
ts.raw_running_avg.x = 0;
ts.raw_running_avg.y = 0;
ts.flag_previous_exceeded_threshold = 0;
+ ts.flag_first_touch_sent = 0;
}
@@ -153,6 +155,19 @@ static void touch_timer_fire(unsigned long data)
updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) &&
(!(data1 & S3C2410_ADCDAT0_UPDOWN));
+ // if we need to send an untouch event, but we haven't yet sent the
+ // touch event (this happens if the touchscreen was tapped lightly),
+ // send the touch event first
+ if (!updown && !ts.flag_first_touch_sent && ts.count != 0) {
+ input_report_abs(ts.dev, ABS_X, ts.xp >> ts.shift);
+ input_report_abs(ts.dev, ABS_Y, ts.yp >> ts.shift);
+
+ input_report_key(ts.dev, BTN_TOUCH, 1);
+ input_report_abs(ts.dev, ABS_PRESSURE, 1);
+ input_sync(ts.dev);
+ ts.flag_first_touch_sent = 1;
+ }
+
if (updown) {
if (ts.count != 0) {
ts.xp >>= ts.shift;
@@ -174,6 +189,7 @@ static void touch_timer_fire(unsigned long data)
input_report_key(ts.dev, BTN_TOUCH, 1);
input_report_abs(ts.dev, ABS_PRESSURE, 1);
input_sync(ts.dev);
+ ts.flag_first_touch_sent = 1;
}
ts.xp = 0;
@@ -190,6 +206,7 @@ static void touch_timer_fire(unsigned long data)
input_report_key(ts.dev, BTN_TOUCH, 0);
input_report_abs(ts.dev, ABS_PRESSURE, 0);
input_sync(ts.dev);
+ ts.flag_first_touch_sent = 0;
writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
}