ad7877.c (e92c27fb5319d8b12f0c291c827e252f0e17afc4) | ad7877.c (47026b25fc6cd2d7ec85d4a83c472bca20946a94) |
---|---|
1/* 2 * Copyright (C) 2006-2008 Michael Hennerich, Analog Devices Inc. 3 * 4 * Description: AD7877 based touchscreen, sensor (ADCs), DAC and GPIO driver 5 * Based on: ads7846.c 6 * 7 * Bugs: Enter bugs at http://blackfin.uclinux.org/ 8 * --- 319 unchanged lines hidden (view full) --- 328 status = spi_sync(spi, &req->msg); 329 sample = req->sample; 330 331 kfree(req); 332 333 return status ? : sample; 334} 335 | 1/* 2 * Copyright (C) 2006-2008 Michael Hennerich, Analog Devices Inc. 3 * 4 * Description: AD7877 based touchscreen, sensor (ADCs), DAC and GPIO driver 5 * Based on: ads7846.c 6 * 7 * Bugs: Enter bugs at http://blackfin.uclinux.org/ 8 * --- 319 unchanged lines hidden (view full) --- 328 status = spi_sync(spi, &req->msg); 329 sample = req->sample; 330 331 kfree(req); 332 333 return status ? : sample; 334} 335 |
336static void ad7877_rx(struct ad7877 *ts) | 336static int ad7877_rx(struct ad7877 *ts) |
337{ 338 struct input_dev *input_dev = ts->input; 339 unsigned Rt; 340 u16 x, y, z1, z2; 341 342 x = ts->conversion_data[AD7877_SEQ_XPOS] & MAX_12BIT; 343 y = ts->conversion_data[AD7877_SEQ_YPOS] & MAX_12BIT; 344 z1 = ts->conversion_data[AD7877_SEQ_Z1] & MAX_12BIT; --- 10 unchanged lines hidden (view full) --- 355 */ 356 357 if (likely(x && z1)) { 358 /* compute touch pressure resistance using equation #1 */ 359 Rt = (z2 - z1) * x * ts->x_plate_ohms; 360 Rt /= z1; 361 Rt = (Rt + 2047) >> 12; 362 | 337{ 338 struct input_dev *input_dev = ts->input; 339 unsigned Rt; 340 u16 x, y, z1, z2; 341 342 x = ts->conversion_data[AD7877_SEQ_XPOS] & MAX_12BIT; 343 y = ts->conversion_data[AD7877_SEQ_YPOS] & MAX_12BIT; 344 z1 = ts->conversion_data[AD7877_SEQ_Z1] & MAX_12BIT; --- 10 unchanged lines hidden (view full) --- 355 */ 356 357 if (likely(x && z1)) { 358 /* compute touch pressure resistance using equation #1 */ 359 Rt = (z2 - z1) * x * ts->x_plate_ohms; 360 Rt /= z1; 361 Rt = (Rt + 2047) >> 12; 362 |
363 if (!timer_pending(&ts->timer)) 364 input_report_key(input_dev, BTN_TOUCH, 1); 365 |
|
363 input_report_abs(input_dev, ABS_X, x); 364 input_report_abs(input_dev, ABS_Y, y); 365 input_report_abs(input_dev, ABS_PRESSURE, Rt); 366 input_sync(input_dev); | 366 input_report_abs(input_dev, ABS_X, x); 367 input_report_abs(input_dev, ABS_Y, y); 368 input_report_abs(input_dev, ABS_PRESSURE, Rt); 369 input_sync(input_dev); |
370 return 0; |
|
367 } | 371 } |
372 373 return -EINVAL; |
|
368} 369 370static inline void ad7877_ts_event_release(struct ad7877 *ts) 371{ 372 struct input_dev *input_dev = ts->input; 373 374 input_report_abs(input_dev, ABS_PRESSURE, 0); | 374} 375 376static inline void ad7877_ts_event_release(struct ad7877 *ts) 377{ 378 struct input_dev *input_dev = ts->input; 379 380 input_report_abs(input_dev, ABS_PRESSURE, 0); |
381 input_report_key(input_dev, BTN_TOUCH, 0); |
|
375 input_sync(input_dev); 376} 377 378static void ad7877_timer(unsigned long handle) 379{ 380 struct ad7877 *ts = (void *)handle; 381 382 ad7877_ts_event_release(ts); --- 25 unchanged lines hidden (view full) --- 408 return IRQ_HANDLED; 409} 410 411static void ad7877_callback(void *_ts) 412{ 413 struct ad7877 *ts = _ts; 414 415 spin_lock_irq(&ts->lock); | 382 input_sync(input_dev); 383} 384 385static void ad7877_timer(unsigned long handle) 386{ 387 struct ad7877 *ts = (void *)handle; 388 389 ad7877_ts_event_release(ts); --- 25 unchanged lines hidden (view full) --- 415 return IRQ_HANDLED; 416} 417 418static void ad7877_callback(void *_ts) 419{ 420 struct ad7877 *ts = _ts; 421 422 spin_lock_irq(&ts->lock); |
416 417 ad7877_rx(ts); | 423 if (!ad7877_rx(ts)) 424 mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT); |
418 ts->pending = 0; | 425 ts->pending = 0; |
419 mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT); 420 | |
421 spin_unlock_irq(&ts->lock); 422} 423 424static void ad7877_disable(struct ad7877 *ts) 425{ 426 mutex_lock(&ts->mutex); 427 428 if (!ts->disabled) { --- 294 unchanged lines hidden (view full) --- 723 ts->pen_down_acc_interval = pdata->pen_down_acc_interval; 724 725 snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&spi->dev)); 726 727 input_dev->name = "AD7877 Touchscreen"; 728 input_dev->phys = ts->phys; 729 input_dev->dev.parent = &spi->dev; 730 | 426 spin_unlock_irq(&ts->lock); 427} 428 429static void ad7877_disable(struct ad7877 *ts) 430{ 431 mutex_lock(&ts->mutex); 432 433 if (!ts->disabled) { --- 294 unchanged lines hidden (view full) --- 728 ts->pen_down_acc_interval = pdata->pen_down_acc_interval; 729 730 snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&spi->dev)); 731 732 input_dev->name = "AD7877 Touchscreen"; 733 input_dev->phys = ts->phys; 734 input_dev->dev.parent = &spi->dev; 735 |
736 __set_bit(EV_KEY, input_dev->evbit); 737 __set_bit(BTN_TOUCH, input_dev->keybit); |
|
731 __set_bit(EV_ABS, input_dev->evbit); 732 __set_bit(ABS_X, input_dev->absbit); 733 __set_bit(ABS_Y, input_dev->absbit); 734 __set_bit(ABS_PRESSURE, input_dev->absbit); 735 736 input_set_abs_params(input_dev, ABS_X, 737 pdata->x_min ? : 0, 738 pdata->x_max ? : MAX_12BIT, --- 133 unchanged lines hidden --- | 738 __set_bit(EV_ABS, input_dev->evbit); 739 __set_bit(ABS_X, input_dev->absbit); 740 __set_bit(ABS_Y, input_dev->absbit); 741 __set_bit(ABS_PRESSURE, input_dev->absbit); 742 743 input_set_abs_params(input_dev, ABS_X, 744 pdata->x_min ? : 0, 745 pdata->x_max ? : MAX_12BIT, --- 133 unchanged lines hidden --- |