--- linux-2.6.16/drivers/input/touchscreen/pcap_ts.c.orig 2006-07-20 10:45:10.000000000 +0800 +++ linux-2.6.16/drivers/input/touchscreen/pcap_ts.c 2006-07-27 14:23:39.000000000 +0800 @@ -61,6 +61,8 @@ #define PRESSURE_MAX X_AXIS_MAX #define PRESSURE_MIN X_AXIS_MIN +#define SAMPLE_INTERVAL (HZ/100) + static int pcap_ts_mode(u_int32_t mode) { int ret; @@ -154,8 +156,6 @@ pcap_ts->x, pcap_ts->y, pcap_ts->pressure); if (pcap_ts->read_state == PRESSURE) { - input_report_abs(pcap_ts->input, ABS_PRESSURE, - pcap_ts->pressure); if ((pcap_ts->pressure >= PRESSURE_MAX || pcap_ts->pressure <= PRESSURE_MIN ) && pcap_ts->pressure == pcap_ts->pressure_last) { @@ -163,6 +163,8 @@ input_report_key(pcap_ts->input, BTN_TOUCH, 0); input_sync(pcap_ts->input); + input_report_abs(pcap_ts->input, ABS_PRESSURE, 0); + pcap_ts->x = pcap_ts->y = 0; /* ask PCAP2 to interrupt us if touch event happens @@ -179,18 +181,24 @@ 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); pcap_ts_start_xy_read(pcap_ts); - - mod_timer(&pcap_ts->timer, jiffies + HZ/20); } } else { /* 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"); + + pcap_ts->pressure = 0; #if 0 input_report_key(pcap_ts->input, BTN_TOUCH, 0); pcap_ts->x = pcap_ts->y = 0; @@ -203,8 +211,8 @@ /* switch back to pressure read mode */ pcap_ts->read_state = PRESSURE; - pcap_ts_mode(PCAP_TS_STANDBY_MODE); - ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_MSR_TSM, 0); + pcap_ts_mode(PCAP_TS_PRESSURE_MEASUREMENT); + mod_timer(&pcap_ts->timer, jiffies + SAMPLE_INTERVAL); } return IRQ_HANDLED; @@ -231,9 +239,6 @@ { struct pcap_ts *pcap_ts = (struct pcap_ts *) data; - ezx_pcap_bit_set(SSP_PCAP_ADJ_BIT_MSR_TSM, 1); - pcap_ts_mode(PCAP_TS_PRESSURE_MEASUREMENT); - pcap_ts->read_state = PRESSURE; pcap_ts_start_xy_read(pcap_ts); }