mirror of https://github.com/hak5/openwrt.git
83 lines
2.7 KiB
Diff
83 lines
2.7 KiB
Diff
|
From eff39cde0d3cdd2afd5e1b4be5a8eb6cf195543e Mon Sep 17 00:00:00 2001
|
||
|
From: Dima Kogan <dkogan@cds.caltech.edu>
|
||
|
Date: Thu, 11 Sep 2008 20:38:55 +0800
|
||
|
Subject: [PATCH] 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>
|
||
|
---
|
||
|
drivers/input/touchscreen/s3c2410_ts.c | 17 +++++++++++++++++
|
||
|
1 files changed, 17 insertions(+), 0 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c
|
||
|
index 9fb95c1..fc1c500 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);
|
||
|
}
|
||
|
--
|
||
|
1.5.6.5
|
||
|
|