linux-ezx: Add additional fix to improve the touchscreen behaviour.
authorFlorian Boor <florian.boor@kernelconcepts.de>
Fri, 9 Mar 2007 10:07:11 +0000 (10:07 +0000)
committerFlorian Boor <florian.boor@kernelconcepts.de>
Fri, 9 Mar 2007 10:07:11 +0000 (10:07 +0000)
packages/linux/linux-ezx/wyrm-ts.diff [new file with mode: 0644]
packages/linux/linux-ezx_2.6.19+2.6.20-rc2.bb

diff --git a/packages/linux/linux-ezx/wyrm-ts.diff b/packages/linux/linux-ezx/wyrm-ts.diff
new file mode 100644 (file)
index 0000000..a7ec756
--- /dev/null
@@ -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;
index 8b65609..b5202fc 100644 (file)
@@ -5,7 +5,7 @@ HOMEPAGE = "http://www.openezx.org"
 LICENSE = "GPL"
 DEPENDS += "quilt-native"
 EZX = "ezx0"
-PR = "${EZX}-r1"
+PR = "${EZX}-r2"
 
 DEFAULT_PREFERENCE = "-1"
 DEFAULT_PREFERENCE_rokr-e2 = "1"
@@ -30,7 +30,8 @@ SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.19.tar.bz2 \
           ${DMSRC}/sumatra.c.patch;patch=1;pnum=1 \
           ${DMSRC}/uncompress.h.patch;patch=1;pnum=5 \
            file://logo_linux_clut224.ppm \ 
-           file://defconfig-${MACHINE}"
+           file://defconfig-${MACHINE} \
+           file://wyrm-ts.diff;patch=1"
 
 S = "${WORKDIR}/linux-2.6.19"