summaryrefslogtreecommitdiff
path: root/packages/linux/linux-ezx
diff options
context:
space:
mode:
authorFlorian Boor <florian.boor@kernelconcepts.de>2007-03-09 10:07:11 +0000
committerFlorian Boor <florian.boor@kernelconcepts.de>2007-03-09 10:07:11 +0000
commit3eac94f967d21dcbdf8040dd35cedd00cbb690a0 (patch)
treefb7f5e778bda386048a6616603ccf7c129cee0f4 /packages/linux/linux-ezx
parent4d37fa8011c7976226f659388384eebdb95cd73c (diff)
linux-ezx: Add additional fix to improve the touchscreen behaviour.
Diffstat (limited to 'packages/linux/linux-ezx')
-rw-r--r--packages/linux/linux-ezx/wyrm-ts.diff119
1 files changed, 119 insertions, 0 deletions
diff --git a/packages/linux/linux-ezx/wyrm-ts.diff b/packages/linux/linux-ezx/wyrm-ts.diff
new file mode 100644
index 0000000000..a7ec75613c
--- /dev/null
+++ b/packages/linux/linux-ezx/wyrm-ts.diff
@@ -0,0 +1,119 @@
+--- /tmp/pcap_ts.c 2007-02-04 16:55:21.000000000 -0200
++++ linux-2.6.16/drivers/input/touchscreen/pcap_ts.c 2007-02-04 18:47:58.000000000 -0200
+@@ -31,7 +31,7 @@
+
+ #include "../../misc/ezx/ssp_pcap.h"
+
+-#if 1
++#if 0
+ #define DEBUGP(x, args ...) printk(KERN_DEBUG "%s: " x, __FUNCTION__, ## args)
+ #else
+ #define DEBUGP(x, args ...)
+@@ -39,6 +39,7 @@
+
+ #define PRESSURE 1
+ #define COORDINATE 2
++#define STANDBY 3
+
+ struct pcap_ts {
+ int irq_xy;
+@@ -97,7 +98,7 @@
+ int ret;
+ u_int32_t tmp;
+ DEBUGP("start xy read in mode %s\n",
+- pcap_ts->read_state == COORDINATE ? "COORD" : "PRESS");
++ pcap_ts->read_state == COORDINATE ? "COORD" : (pcap_ts->read_state == PRESSURE ? "PRESS" : "STANDBY"));
+
+ ret = ezx_pcap_read(SSP_PCAP_ADJ_ADC1_REGISTER, &tmp);
+ if (ret < 0)
+@@ -122,7 +123,7 @@
+ u_int32_t tmp;
+
+ DEBUGP("get xy value in mode %s\n",
+- pcap_ts->read_state == COORDINATE ? "COORD" : "PRESS");
++ pcap_ts->read_state == COORDINATE ? "COORD" : (pcap_ts->read_state == PRESSURE ? "PRESS" : "STANDBY"));
+
+ ret = ezx_pcap_read(SSP_PCAP_ADJ_ADC2_REGISTER, &tmp);
+ if (ret < 0)
+@@ -145,7 +146,16 @@
+ static irqreturn_t pcap_ts_irq_xy(int irq, void *dev_id, struct pt_regs *regs)
+ {
+ struct pcap_ts *pcap_ts = dev_id;
++// DEBUGP("read_state: %d\n", pcap_ts->read_state);
+
++ /*
++ * Ignore further read interrupts after we set STANDBY - WM
++ */
++ if (pcap_ts->read_state == STANDBY)
++ {
++ DEBUGP("ignored\n");
++ return IRQ_HANDLED;
++ }
+ if (pcap_ts_get_xy_value(pcap_ts) < 0) {
+ printk("pcap_ts: error reading XY value\n");
+ return IRQ_HANDLED;
+@@ -160,33 +170,32 @@
+ pcap_ts->pressure <= PRESSURE_MIN ) &&
+ pcap_ts->pressure == pcap_ts->pressure_last) {
+ /* pen has been released */
++ DEBUGP("UP\n");
+ input_report_key(pcap_ts->input, BTN_TOUCH, 0);
+- input_sync(pcap_ts->input);
+-
+ input_report_abs(pcap_ts->input, ABS_PRESSURE, 0);
++ input_sync(pcap_ts->input);
+
+ pcap_ts->x = pcap_ts->y = 0;
+
++ /* no need for timer, we'll get interrupted with
++ * next touch down event */
++ del_timer(&pcap_ts->timer);
++
+ /* ask PCAP2 to interrupt us if touch event happens
+ * again */
+- pcap_ts->read_state = PRESSURE;
++ pcap_ts->read_state = STANDBY;
+ pcap_ts_mode(PCAP_TS_STANDBY_MODE);
+ ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_MSR_TSM, 0);
+-
+- /* no need for timer, we'll get interrupted with
+- * next touch down event */
+- del_timer(&pcap_ts->timer);
+ } else {
+ /* pen has been touched down */
++ DEBUGP("DOWN\n");
++
+ input_report_key(pcap_ts->input, BTN_TOUCH, 1);
+ /* don't input_sync(), we don't know position yet */
+
+ if (pcap_ts->pressure == 0)
+ pcap_ts->pressure = pcap_ts->pressure_last;
+
+- input_report_abs(pcap_ts->input, ABS_PRESSURE,
+- pcap_ts->pressure);
+-
+ /* switch state machine into coordinate read mode */
+ pcap_ts->read_state = COORDINATE;
+ pcap_ts_mode(PCAP_TS_POSITION_XY_MEASUREMENT);
+@@ -196,18 +205,14 @@
+ /* we are in coordinate mode */
+ if (pcap_ts->x <= X_AXIS_MIN || pcap_ts->x >= X_AXIS_MAX ||
+ pcap_ts->y <= Y_AXIS_MIN || pcap_ts->y >= Y_AXIS_MAX) {
+- DEBUGP("invalid x/y coordinate position: PEN_UP?\n");
+-
++ DEBUGP("PEN_UP?\n");
+ pcap_ts->pressure = 0;
+-#if 0
+- input_report_key(pcap_ts->input, BTN_TOUCH, 0);
+- pcap_ts->x = pcap_ts->y = 0;
+-#endif
+ } else {
++ input_report_abs(pcap_ts->input, ABS_PRESSURE, pcap_ts->pressure);
+ input_report_abs(pcap_ts->input, ABS_X, pcap_ts->x);
+ input_report_abs(pcap_ts->input, ABS_Y, pcap_ts->y);
++ input_sync(pcap_ts->input);
+ }
+- input_sync(pcap_ts->input);
+
+ /* switch back to pressure read mode */
+ pcap_ts->read_state = PRESSURE;