From: <cri...@us...> - 2006-08-21 17:15:31
|
Revision: 554 Author: cristianop Date: 2006-08-21 10:15:17 -0700 (Mon, 21 Aug 2006) ViewCVS: http://svn.sourceforge.net/hackndev/?rev=554&view=rev Log Message: ----------- palmtx: simple handling of 'on hold' jitter Modified Paths: -------------- linux4palm/linux/trunk/arch/arm/mach-pxa/palmtx/palmld_ac97.c Modified: linux4palm/linux/trunk/arch/arm/mach-pxa/palmtx/palmld_ac97.c =================================================================== --- linux4palm/linux/trunk/arch/arm/mach-pxa/palmtx/palmld_ac97.c 2006-08-20 17:17:41 UTC (rev 553) +++ linux4palm/linux/trunk/arch/arm/mach-pxa/palmtx/palmld_ac97.c 2006-08-21 17:15:17 UTC (rev 554) @@ -44,12 +44,14 @@ #define PRESSURE_MIN 0 #define PRESSURE_MAX 150 //300 +#define DIG2_INIT 0x0001 /* initial value for digitiser2 register */ #define WM9712_PIL 0x00100 #define WM97XX_POLL 0x8000 /* initiate a polling measurement */ #define AC97_LINK_FRAME 21 /* time in uS for AC97 link frame */ -#define WM97XX_DELAY(i) ((i << 4) & 0x00f0) /* sample delay times */ #define DEFAULT_PRESSURE_TRESHOLD 45160 /* default pressure treshold for pen up/down */ +#define DEFAULT_X_JITTER_TRESHOLD 5; +#define DEFAULT_Y_JITTER_TRESHOLD 35; #define palmld_ac97_WORK_QUEUE_NAME "palmld_ac97.c" @@ -62,7 +64,14 @@ module_param(dbglvl, int, 0); MODULE_PARM_DESC(dbglvl, "debug level (0 is disabled)"); +static int xdjtrsh = DEFAULT_X_JITTER_TRESHOLD; +module_param(xdjtrsh, int, 0); +MODULE_PARM_DESC(ptrsh, "treshold for x coordinates jitter"); +static int ydjtrsh = DEFAULT_Y_JITTER_TRESHOLD; +module_param(ydjtrsh, int, 0); +MODULE_PARM_DESC(ptrsh, "treshold for y coordinates jitter"); + static DECLARE_MUTEX_LOCKED(queue_sem); static DECLARE_MUTEX(digitiser_sem); static DECLARE_MUTEX(battery_update_mutex); @@ -79,6 +88,9 @@ static int previous_voltage; static u16 d2base; +static int lastx = 0; +static int lasty = 0; + #if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE) /* original APM hook */ static void (*apm_get_power_status_orig)(struct apm_power_info *info); @@ -329,37 +341,33 @@ static void palmld_ac97_pendown(struct device *dev) { - //ac97_t *ac97 = dev->platform_data; int xread, yread, pressure; + int xval, yval; int valid_coords=0, btn_pressed = 0; /* take readings until the pen goes up */ do { - //printk("wm9712: starting read\n"); - //down(&digitiser_sem); - - /* power up digitiser */ - //wm97xx_set_digitiser_power(dev, WM97XX_PRP_DET_DIG); - /* take readings */ xread = palmld_ac97_take_reading(dev, WM97XX_ADCSEL_X); yread = palmld_ac97_take_reading(dev, WM97XX_ADCSEL_Y); pressure = palmld_ac97_take_reading(dev, WM97XX_ADCSEL_PRES); - /* power down digitiser to conserve power */ - //wm97xx_set_digitiser_power(dev, WM97XX_PRP_DET); - //up(&digitiser_sem); - - valid_coords = (xread & 0xfff) && (yread & 0xfff) && (pressure & 0xfff); - - if(valid_coords && (pressure < ptrsh)) { + //valid_coords = (xread & 0xfff) && (yread & 0xfff) && (pressure & 0xfff); + xval = xread & 0xfff; + yval = yread & 0xfff; + valid_coords = (xval) && (yval) && (pressure & 0xfff); + + if(valid_coords && (pressure < ptrsh)) { + if(abs(xval - lastx) <= xdjtrsh){ xval = lastx; } + if(abs(yval - lasty) <= ydjtrsh){ yval = lasty; } btn_pressed = 1; input_report_key(palmld_ac97_input, BTN_TOUCH, 1); - input_report_abs(palmld_ac97_input, ABS_X, xread & 0xfff); - input_report_abs(palmld_ac97_input, ABS_Y, yread & 0xfff); + input_report_abs(palmld_ac97_input, ABS_X, xval); + input_report_abs(palmld_ac97_input, ABS_Y, yval); input_report_abs(palmld_ac97_input, ABS_PRESSURE, pressure & 0xfff); - //printk("x: %d, y=%d, p=%d\n", xread, yread, pressure); input_sync(palmld_ac97_input); + lastx = xval; + lasty = yval; set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(HZ/100); @@ -374,6 +382,8 @@ input_report_abs(palmld_ac97_input, ABS_Y, 0); input_report_abs(palmld_ac97_input, ABS_PRESSURE, 0); input_sync(palmld_ac97_input); + lastx = 0; + lasty = 0; } } @@ -390,9 +400,9 @@ if(polarity & levels & WM97XX_GPIO_13) { // power up digitiser: - // test if doing it for all read cycle helps down(&digitiser_sem); wm97xx_set_digitiser_power(dev, WM97XX_PRP_DET_DIG); + palmld_ac97_pendown(dev); /* power down digitiser to conserve power */ @@ -435,9 +445,7 @@ if(!machine_is_xscale_palmtx()) return -ENODEV; - //printk("palmld_ac97_probe: start\n"); - - /* for use by bettery level monitor */ + /* for use by battery level monitor */ palmld_ac97_dev = dev; set_irq_type(IRQ_GPIO_PALMTX_WM9712_IRQ, IRQT_RISING); @@ -453,7 +461,7 @@ ac97->bus->ops->write(ac97, 0x54, 0); /* disable digitiser to save power, enable pen-down detect */ - d2 = ac97->bus->ops->read(ac97, AC97_WM97XX_DIGITISER2); + d2 = DIG2_INIT; d2 |= WM97XX_PRP_DET; d2base = d2; ac97->bus->ops->write(ac97, AC97_WM97XX_DIGITISER2, d2); @@ -468,40 +476,24 @@ wm97xx_gpio_mode(ac97, WM97XX_GPIO_13, WM97XX_GPIO_IN, WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_STICKY, WM97XX_GPIO_WAKE); - /* enable ada detect interrupt */ - /* - wm97xx_gpio_mode(ac97, WM97XX_GPIO_12, WM97XX_GPIO_IN, - WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_NOTSTICKY, WM97XX_GPIO_NOWAKE); - */ - /* turn off irq gpio inverting */ ac97->bus->ops->write(ac97, 0x58, ac97->bus->ops->read(ac97, 0x58)&~1); - /* turn on the digitiser and pen down detector */ d2 = ac97->bus->ops->read(ac97, AC97_WM97XX_DIGITISER2); d2 |= WM97XX_PRP_DETW; ac97->bus->ops->write(ac97, AC97_WM97XX_DIGITISER2, d2); - // init the digitiser - //d2 = WM97XX_RPR | (1&0x3f); - //d2 |= WM9712_PIL; - - //d2 |= WM97XX_PRP_DETW; - //ac97->bus->ops->write(ac97, AC97_WM97XX_DIGITISER2, d2); - - /* setup the input device */ palmld_ac97_input = input_allocate_device(); palmld_ac97_input->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); - //palmld_ac97_input->evbit[0] = BIT(EV_ABS); palmld_ac97_input->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); input_set_abs_params(palmld_ac97_input, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0); input_set_abs_params(palmld_ac97_input, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0); input_set_abs_params(palmld_ac97_input, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0); - palmld_ac97_input->name = "Palm TX touchscreen (Wolfson WM9712G)"; + palmld_ac97_input->name = "Palm TX touchscreen (Wolfson WM9712)"; palmld_ac97_input->dev = dev; palmld_ac97_input->id.bustype = BUS_HOST; input_register_device(palmld_ac97_input); @@ -514,8 +506,6 @@ palmld_ac97_workqueue = create_workqueue(palmld_ac97_WORK_QUEUE_NAME); INIT_WORK(&palmld_ac97_irq_task, palmld_ac97_irq_work, dev); - - /* register battery */ if(battery_class_register(&palmld_battery)) { @@ -527,7 +517,6 @@ } - //printk("palmld_ac97_probe: end\n"); up(&queue_sem); return 0; } @@ -542,7 +531,7 @@ } static struct device_driver palmld_ac97_driver = { - .name = "WM9712G", + .name = "WM9712", .bus = &ac97_bus_type, .probe = palmld_ac97_probe, .remove = palmld_ac97_remove, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |