OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [input/] [touchscreen/] [ads7846.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * ADS7846 based touchscreen and sensor driver
3
 *
4
 * Copyright (c) 2005 David Brownell
5
 * Copyright (c) 2006 Nokia Corporation
6
 * Various changes: Imre Deak <imre.deak@nokia.com>
7
 *
8
 * Using code from:
9
 *  - corgi_ts.c
10
 *      Copyright (C) 2004-2005 Richard Purdie
11
 *  - omap_ts.[hc], ads7846.h, ts_osk.c
12
 *      Copyright (C) 2002 MontaVista Software
13
 *      Copyright (C) 2004 Texas Instruments
14
 *      Copyright (C) 2005 Dirk Behme
15
 *
16
 *  This program is free software; you can redistribute it and/or modify
17
 *  it under the terms of the GNU General Public License version 2 as
18
 *  published by the Free Software Foundation.
19
 */
20
#include <linux/hwmon.h>
21
#include <linux/init.h>
22
#include <linux/err.h>
23
#include <linux/delay.h>
24
#include <linux/input.h>
25
#include <linux/interrupt.h>
26
#include <linux/slab.h>
27
#include <linux/spi/spi.h>
28
#include <linux/spi/ads7846.h>
29
#include <asm/irq.h>
30
 
31
#ifdef  CONFIG_ARM
32
#include <asm/mach-types.h>
33
#ifdef  CONFIG_ARCH_OMAP
34
#include <asm/arch/gpio.h>
35
#endif
36
#endif
37
 
38
 
39
/*
40
 * This code has been heavily tested on a Nokia 770, and lightly
41
 * tested on other ads7846 devices (OSK/Mistral, Lubbock).
42
 * TSC2046 is just newer ads7846 silicon.
43
 * Support for ads7843 tested on Atmel at91sam926x-EK.
44
 * Support for ads7845 has only been stubbed in.
45
 *
46
 * IRQ handling needs a workaround because of a shortcoming in handling
47
 * edge triggered IRQs on some platforms like the OMAP1/2. These
48
 * platforms don't handle the ARM lazy IRQ disabling properly, thus we
49
 * have to maintain our own SW IRQ disabled status. This should be
50
 * removed as soon as the affected platform's IRQ handling is fixed.
51
 *
52
 * app note sbaa036 talks in more detail about accurate sampling...
53
 * that ought to help in situations like LCDs inducing noise (which
54
 * can also be helped by using synch signals) and more generally.
55
 * This driver tries to utilize the measures described in the app
56
 * note. The strength of filtering can be set in the board-* specific
57
 * files.
58
 */
59
 
60
#define TS_POLL_DELAY   (1 * 1000000)   /* ns delay before the first sample */
61
#define TS_POLL_PERIOD  (5 * 1000000)   /* ns delay between samples */
62
 
63
/* this driver doesn't aim at the peak continuous sample rate */
64
#define SAMPLE_BITS     (8 /*cmd*/ + 16 /*sample*/ + 2 /* before, after */)
65
 
66
struct ts_event {
67
        /* For portability, we can't read 12 bit values using SPI (which
68
         * would make the controller deliver them as native byteorder u16
69
         * with msbs zeroed).  Instead, we read them as two 8-bit values,
70
         * *** WHICH NEED BYTESWAPPING *** and range adjustment.
71
         */
72
        u16     x;
73
        u16     y;
74
        u16     z1, z2;
75
        int     ignore;
76
};
77
 
78
struct ads7846 {
79
        struct input_dev        *input;
80
        char                    phys[32];
81
 
82
        struct spi_device       *spi;
83
 
84
#if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE)
85
        struct attribute_group  *attr_group;
86
        struct device           *hwmon;
87
#endif
88
 
89
        u16                     model;
90
        u16                     vref_delay_usecs;
91
        u16                     x_plate_ohms;
92
        u16                     pressure_max;
93
 
94
        u8                      read_x, read_y, read_z1, read_z2, pwrdown;
95
        u16                     dummy;          /* for the pwrdown read */
96
        struct ts_event         tc;
97
 
98
        struct spi_transfer     xfer[18];
99
        struct spi_message      msg[5];
100
        struct spi_message      *last_msg;
101
        int                     msg_idx;
102
        int                     read_cnt;
103
        int                     read_rep;
104
        int                     last_read;
105
 
106
        u16                     debounce_max;
107
        u16                     debounce_tol;
108
        u16                     debounce_rep;
109
 
110
        u16                     penirq_recheck_delay_usecs;
111
 
112
        spinlock_t              lock;
113
        struct hrtimer          timer;
114
        unsigned                pendown:1;      /* P: lock */
115
        unsigned                pending:1;      /* P: lock */
116
// FIXME remove "irq_disabled"
117
        unsigned                irq_disabled:1; /* P: lock */
118
        unsigned                disabled:1;
119
 
120
        int                     (*filter)(void *data, int data_idx, int *val);
121
        void                    *filter_data;
122
        void                    (*filter_cleanup)(void *data);
123
        int                     (*get_pendown_state)(void);
124
};
125
 
126
/* leave chip selected when we're done, for quicker re-select? */
127
#if     0
128
#define CS_CHANGE(xfer) ((xfer).cs_change = 1)
129
#else
130
#define CS_CHANGE(xfer) ((xfer).cs_change = 0)
131
#endif
132
 
133
/*--------------------------------------------------------------------------*/
134
 
135
/* The ADS7846 has touchscreen and other sensors.
136
 * Earlier ads784x chips are somewhat compatible.
137
 */
138
#define ADS_START               (1 << 7)
139
#define ADS_A2A1A0_d_y          (1 << 4)        /* differential */
140
#define ADS_A2A1A0_d_z1         (3 << 4)        /* differential */
141
#define ADS_A2A1A0_d_z2         (4 << 4)        /* differential */
142
#define ADS_A2A1A0_d_x          (5 << 4)        /* differential */
143
#define ADS_A2A1A0_temp0        (0 << 4)        /* non-differential */
144
#define ADS_A2A1A0_vbatt        (2 << 4)        /* non-differential */
145
#define ADS_A2A1A0_vaux         (6 << 4)        /* non-differential */
146
#define ADS_A2A1A0_temp1        (7 << 4)        /* non-differential */
147
#define ADS_8_BIT               (1 << 3)
148
#define ADS_12_BIT              (0 << 3)
149
#define ADS_SER                 (1 << 2)        /* non-differential */
150
#define ADS_DFR                 (0 << 2)        /* differential */
151
#define ADS_PD10_PDOWN          (0 << 0)        /* lowpower mode + penirq */
152
#define ADS_PD10_ADC_ON         (1 << 0)        /* ADC on */
153
#define ADS_PD10_REF_ON         (2 << 0)        /* vREF on + penirq */
154
#define ADS_PD10_ALL_ON         (3 << 0)        /* ADC + vREF on */
155
 
156
#define MAX_12BIT       ((1<<12)-1)
157
 
158
/* leave ADC powered up (disables penirq) between differential samples */
159
#define READ_12BIT_DFR(x, adc, vref) (ADS_START | ADS_A2A1A0_d_ ## x \
160
        | ADS_12_BIT | ADS_DFR | \
161
        (adc ? ADS_PD10_ADC_ON : 0) | (vref ? ADS_PD10_REF_ON : 0))
162
 
163
#define READ_Y(vref)    (READ_12BIT_DFR(y,  1, vref))
164
#define READ_Z1(vref)   (READ_12BIT_DFR(z1, 1, vref))
165
#define READ_Z2(vref)   (READ_12BIT_DFR(z2, 1, vref))
166
 
167
#define READ_X(vref)    (READ_12BIT_DFR(x,  1, vref))
168
#define PWRDOWN         (READ_12BIT_DFR(y,  0, 0))      /* LAST */
169
 
170
/* single-ended samples need to first power up reference voltage;
171
 * we leave both ADC and VREF powered
172
 */
173
#define READ_12BIT_SER(x) (ADS_START | ADS_A2A1A0_ ## x \
174
        | ADS_12_BIT | ADS_SER)
175
 
176
#define REF_ON  (READ_12BIT_DFR(x, 1, 1))
177
#define REF_OFF (READ_12BIT_DFR(y, 0, 0))
178
 
179
/*--------------------------------------------------------------------------*/
180
 
181
/*
182
 * Non-touchscreen sensors only use single-ended conversions.
183
 * The range is GND..vREF. The ads7843 and ads7835 must use external vREF;
184
 * ads7846 lets that pin be unconnected, to use internal vREF.
185
 */
186
static unsigned vREF_mV;
187
module_param(vREF_mV, uint, 0);
188
MODULE_PARM_DESC(vREF_mV, "external vREF voltage, in milliVolts");
189
 
190
struct ser_req {
191
        u8                      ref_on;
192
        u8                      command;
193
        u8                      ref_off;
194
        u16                     scratch;
195
        __be16                  sample;
196
        struct spi_message      msg;
197
        struct spi_transfer     xfer[6];
198
};
199
 
200
static void ads7846_enable(struct ads7846 *ts);
201
static void ads7846_disable(struct ads7846 *ts);
202
 
203
static int device_suspended(struct device *dev)
204
{
205
        struct ads7846 *ts = dev_get_drvdata(dev);
206
        return dev->power.power_state.event != PM_EVENT_ON || ts->disabled;
207
}
208
 
209
static int ads7846_read12_ser(struct device *dev, unsigned command)
210
{
211
        struct spi_device       *spi = to_spi_device(dev);
212
        struct ads7846          *ts = dev_get_drvdata(dev);
213
        struct ser_req          *req = kzalloc(sizeof *req, GFP_KERNEL);
214
        int                     status;
215
        int                     sample;
216
        int                     use_internal;
217
 
218
        if (!req)
219
                return -ENOMEM;
220
 
221
        spi_message_init(&req->msg);
222
 
223
        /* FIXME boards with ads7846 might use external vref instead ... */
224
        use_internal = (ts->model == 7846);
225
 
226
        /* maybe turn on internal vREF, and let it settle */
227
        if (use_internal) {
228
                req->ref_on = REF_ON;
229
                req->xfer[0].tx_buf = &req->ref_on;
230
                req->xfer[0].len = 1;
231
                spi_message_add_tail(&req->xfer[0], &req->msg);
232
 
233
                req->xfer[1].rx_buf = &req->scratch;
234
                req->xfer[1].len = 2;
235
 
236
                /* for 1uF, settle for 800 usec; no cap, 100 usec.  */
237
                req->xfer[1].delay_usecs = ts->vref_delay_usecs;
238
                spi_message_add_tail(&req->xfer[1], &req->msg);
239
        }
240
 
241
        /* take sample */
242
        req->command = (u8) command;
243
        req->xfer[2].tx_buf = &req->command;
244
        req->xfer[2].len = 1;
245
        spi_message_add_tail(&req->xfer[2], &req->msg);
246
 
247
        req->xfer[3].rx_buf = &req->sample;
248
        req->xfer[3].len = 2;
249
        spi_message_add_tail(&req->xfer[3], &req->msg);
250
 
251
        /* REVISIT:  take a few more samples, and compare ... */
252
 
253
        /* converter in low power mode & enable PENIRQ */
254
        req->ref_off = PWRDOWN;
255
        req->xfer[4].tx_buf = &req->ref_off;
256
        req->xfer[4].len = 1;
257
        spi_message_add_tail(&req->xfer[4], &req->msg);
258
 
259
        req->xfer[5].rx_buf = &req->scratch;
260
        req->xfer[5].len = 2;
261
        CS_CHANGE(req->xfer[5]);
262
        spi_message_add_tail(&req->xfer[5], &req->msg);
263
 
264
        ts->irq_disabled = 1;
265
        disable_irq(spi->irq);
266
        status = spi_sync(spi, &req->msg);
267
        ts->irq_disabled = 0;
268
        enable_irq(spi->irq);
269
 
270
        if (status == 0) {
271
                /* on-wire is a must-ignore bit, a BE12 value, then padding */
272
                sample = be16_to_cpu(req->sample);
273
                sample = sample >> 3;
274
                sample &= 0x0fff;
275
        }
276
 
277
        kfree(req);
278
        return status ? status : sample;
279
}
280
 
281
#if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE)
282
 
283
#define SHOW(name, var, adjust) static ssize_t \
284
name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \
285
{ \
286
        struct ads7846 *ts = dev_get_drvdata(dev); \
287
        ssize_t v = ads7846_read12_ser(dev, \
288
                        READ_12BIT_SER(var) | ADS_PD10_ALL_ON); \
289
        if (v < 0) \
290
                return v; \
291
        return sprintf(buf, "%u\n", adjust(ts, v)); \
292
} \
293
static DEVICE_ATTR(name, S_IRUGO, name ## _show, NULL);
294
 
295
 
296
/* Sysfs conventions report temperatures in millidegrees Celcius.
297
 * ADS7846 could use the low-accuracy two-sample scheme, but can't do the high
298
 * accuracy scheme without calibration data.  For now we won't try either;
299
 * userspace sees raw sensor values, and must scale/calibrate appropriately.
300
 */
301
static inline unsigned null_adjust(struct ads7846 *ts, ssize_t v)
302
{
303
        return v;
304
}
305
 
306
SHOW(temp0, temp0, null_adjust)         /* temp1_input */
307
SHOW(temp1, temp1, null_adjust)         /* temp2_input */
308
 
309
 
310
/* sysfs conventions report voltages in millivolts.  We can convert voltages
311
 * if we know vREF.  userspace may need to scale vAUX to match the board's
312
 * external resistors; we assume that vBATT only uses the internal ones.
313
 */
314
static inline unsigned vaux_adjust(struct ads7846 *ts, ssize_t v)
315
{
316
        unsigned retval = v;
317
 
318
        /* external resistors may scale vAUX into 0..vREF */
319
        retval *= vREF_mV;
320
        retval = retval >> 12;
321
        return retval;
322
}
323
 
324
static inline unsigned vbatt_adjust(struct ads7846 *ts, ssize_t v)
325
{
326
        unsigned retval = vaux_adjust(ts, v);
327
 
328
        /* ads7846 has a resistor ladder to scale this signal down */
329
        if (ts->model == 7846)
330
                retval *= 4;
331
        return retval;
332
}
333
 
334
SHOW(in0_input, vaux, vaux_adjust)
335
SHOW(in1_input, vbatt, vbatt_adjust)
336
 
337
 
338
static struct attribute *ads7846_attributes[] = {
339
        &dev_attr_temp0.attr,
340
        &dev_attr_temp1.attr,
341
        &dev_attr_in0_input.attr,
342
        &dev_attr_in1_input.attr,
343
        NULL,
344
};
345
 
346
static struct attribute_group ads7846_attr_group = {
347
        .attrs = ads7846_attributes,
348
};
349
 
350
static struct attribute *ads7843_attributes[] = {
351
        &dev_attr_in0_input.attr,
352
        &dev_attr_in1_input.attr,
353
        NULL,
354
};
355
 
356
static struct attribute_group ads7843_attr_group = {
357
        .attrs = ads7843_attributes,
358
};
359
 
360
static struct attribute *ads7845_attributes[] = {
361
        &dev_attr_in0_input.attr,
362
        NULL,
363
};
364
 
365
static struct attribute_group ads7845_attr_group = {
366
        .attrs = ads7845_attributes,
367
};
368
 
369
static int ads784x_hwmon_register(struct spi_device *spi, struct ads7846 *ts)
370
{
371
        struct device *hwmon;
372
        int err;
373
 
374
        /* hwmon sensors need a reference voltage */
375
        switch (ts->model) {
376
        case 7846:
377
                if (!vREF_mV) {
378
                        dev_dbg(&spi->dev, "assuming 2.5V internal vREF\n");
379
                        vREF_mV = 2500;
380
                }
381
                break;
382
        case 7845:
383
        case 7843:
384
                if (!vREF_mV) {
385
                        dev_warn(&spi->dev,
386
                                "external vREF for ADS%d not specified\n",
387
                                ts->model);
388
                        return 0;
389
                }
390
                break;
391
        }
392
 
393
        /* different chips have different sensor groups */
394
        switch (ts->model) {
395
        case 7846:
396
                ts->attr_group = &ads7846_attr_group;
397
                break;
398
        case 7845:
399
                ts->attr_group = &ads7845_attr_group;
400
                break;
401
        case 7843:
402
                ts->attr_group = &ads7843_attr_group;
403
                break;
404
        default:
405
                dev_dbg(&spi->dev, "ADS%d not recognized\n", ts->model);
406
                return 0;
407
        }
408
 
409
        err = sysfs_create_group(&spi->dev.kobj, ts->attr_group);
410
        if (err)
411
                return err;
412
 
413
        hwmon = hwmon_device_register(&spi->dev);
414
        if (IS_ERR(hwmon)) {
415
                sysfs_remove_group(&spi->dev.kobj, ts->attr_group);
416
                return PTR_ERR(hwmon);
417
        }
418
 
419
        ts->hwmon = hwmon;
420
        return 0;
421
}
422
 
423
static void ads784x_hwmon_unregister(struct spi_device *spi,
424
                                     struct ads7846 *ts)
425
{
426
        if (ts->hwmon) {
427
                sysfs_remove_group(&spi->dev.kobj, ts->attr_group);
428
                hwmon_device_unregister(ts->hwmon);
429
        }
430
}
431
 
432
#else
433
static inline int ads784x_hwmon_register(struct spi_device *spi,
434
                                         struct ads7846 *ts)
435
{
436
        return 0;
437
}
438
 
439
static inline void ads784x_hwmon_unregister(struct spi_device *spi,
440
                                            struct ads7846 *ts)
441
{
442
}
443
#endif
444
 
445
static int is_pen_down(struct device *dev)
446
{
447
        struct ads7846  *ts = dev_get_drvdata(dev);
448
 
449
        return ts->pendown;
450
}
451
 
452
static ssize_t ads7846_pen_down_show(struct device *dev,
453
                                     struct device_attribute *attr, char *buf)
454
{
455
        return sprintf(buf, "%u\n", is_pen_down(dev));
456
}
457
 
458
static DEVICE_ATTR(pen_down, S_IRUGO, ads7846_pen_down_show, NULL);
459
 
460
static ssize_t ads7846_disable_show(struct device *dev,
461
                                     struct device_attribute *attr, char *buf)
462
{
463
        struct ads7846  *ts = dev_get_drvdata(dev);
464
 
465
        return sprintf(buf, "%u\n", ts->disabled);
466
}
467
 
468
static ssize_t ads7846_disable_store(struct device *dev,
469
                                     struct device_attribute *attr,
470
                                     const char *buf, size_t count)
471
{
472
        struct ads7846 *ts = dev_get_drvdata(dev);
473
        char *endp;
474
        int i;
475
 
476
        i = simple_strtoul(buf, &endp, 10);
477
        spin_lock_irq(&ts->lock);
478
 
479
        if (i)
480
                ads7846_disable(ts);
481
        else
482
                ads7846_enable(ts);
483
 
484
        spin_unlock_irq(&ts->lock);
485
 
486
        return count;
487
}
488
 
489
static DEVICE_ATTR(disable, 0664, ads7846_disable_show, ads7846_disable_store);
490
 
491
static struct attribute *ads784x_attributes[] = {
492
        &dev_attr_pen_down.attr,
493
        &dev_attr_disable.attr,
494
        NULL,
495
};
496
 
497
static struct attribute_group ads784x_attr_group = {
498
        .attrs = ads784x_attributes,
499
};
500
 
501
/*--------------------------------------------------------------------------*/
502
 
503
/*
504
 * PENIRQ only kicks the timer.  The timer only reissues the SPI transfer,
505
 * to retrieve touchscreen status.
506
 *
507
 * The SPI transfer completion callback does the real work.  It reports
508
 * touchscreen events and reactivates the timer (or IRQ) as appropriate.
509
 */
510
 
511
static void ads7846_rx(void *ads)
512
{
513
        struct ads7846          *ts = ads;
514
        unsigned                Rt;
515
        u16                     x, y, z1, z2;
516
 
517
        /* ads7846_rx_val() did in-place conversion (including byteswap) from
518
         * on-the-wire format as part of debouncing to get stable readings.
519
         */
520
        x = ts->tc.x;
521
        y = ts->tc.y;
522
        z1 = ts->tc.z1;
523
        z2 = ts->tc.z2;
524
 
525
        /* range filtering */
526
        if (x == MAX_12BIT)
527
                x = 0;
528
 
529
        if (likely(x && z1)) {
530
                /* compute touch pressure resistance using equation #2 */
531
                Rt = z2;
532
                Rt -= z1;
533
                Rt *= x;
534
                Rt *= ts->x_plate_ohms;
535
                Rt /= z1;
536
                Rt = (Rt + 2047) >> 12;
537
        } else
538
                Rt = 0;
539
 
540
        if (ts->model == 7843)
541
                Rt = ts->pressure_max / 2;
542
 
543
        /* Sample found inconsistent by debouncing or pressure is beyond
544
         * the maximum. Don't report it to user space, repeat at least
545
         * once more the measurement
546
         */
547
        if (ts->tc.ignore || Rt > ts->pressure_max) {
548
#ifdef VERBOSE
549
                pr_debug("%s: ignored %d pressure %d\n",
550
                        ts->spi->dev.bus_id, ts->tc.ignore, Rt);
551
#endif
552
                hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD),
553
                              HRTIMER_MODE_REL);
554
                return;
555
        }
556
 
557
        /* Maybe check the pendown state before reporting. This discards
558
         * false readings when the pen is lifted.
559
         */
560
        if (ts->penirq_recheck_delay_usecs) {
561
                udelay(ts->penirq_recheck_delay_usecs);
562
                if (!ts->get_pendown_state())
563
                        Rt = 0;
564
        }
565
 
566
        /* NOTE: We can't rely on the pressure to determine the pen down
567
         * state, even this controller has a pressure sensor.  The pressure
568
         * value can fluctuate for quite a while after lifting the pen and
569
         * in some cases may not even settle at the expected value.
570
         *
571
         * The only safe way to check for the pen up condition is in the
572
         * timer by reading the pen signal state (it's a GPIO _and_ IRQ).
573
         */
574
        if (Rt) {
575
                struct input_dev *input = ts->input;
576
 
577
                if (!ts->pendown) {
578
                        input_report_key(input, BTN_TOUCH, 1);
579
                        ts->pendown = 1;
580
#ifdef VERBOSE
581
                        dev_dbg(&ts->spi->dev, "DOWN\n");
582
#endif
583
                }
584
                input_report_abs(input, ABS_X, x);
585
                input_report_abs(input, ABS_Y, y);
586
                input_report_abs(input, ABS_PRESSURE, Rt);
587
 
588
                input_sync(input);
589
#ifdef VERBOSE
590
                dev_dbg(&ts->spi->dev, "%4d/%4d/%4d\n", x, y, Rt);
591
#endif
592
        }
593
 
594
        hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD),
595
                        HRTIMER_MODE_REL);
596
}
597
 
598
static int ads7846_debounce(void *ads, int data_idx, int *val)
599
{
600
        struct ads7846          *ts = ads;
601
 
602
        if (!ts->read_cnt || (abs(ts->last_read - *val) > ts->debounce_tol)) {
603
                /* Start over collecting consistent readings. */
604
                ts->read_rep = 0;
605
                /* Repeat it, if this was the first read or the read
606
                 * wasn't consistent enough. */
607
                if (ts->read_cnt < ts->debounce_max) {
608
                        ts->last_read = *val;
609
                        ts->read_cnt++;
610
                        return ADS7846_FILTER_REPEAT;
611
                } else {
612
                        /* Maximum number of debouncing reached and still
613
                         * not enough number of consistent readings. Abort
614
                         * the whole sample, repeat it in the next sampling
615
                         * period.
616
                         */
617
                        ts->read_cnt = 0;
618
                        return ADS7846_FILTER_IGNORE;
619
                }
620
        } else {
621
                if (++ts->read_rep > ts->debounce_rep) {
622
                        /* Got a good reading for this coordinate,
623
                         * go for the next one. */
624
                        ts->read_cnt = 0;
625
                        ts->read_rep = 0;
626
                        return ADS7846_FILTER_OK;
627
                } else {
628
                        /* Read more values that are consistent. */
629
                        ts->read_cnt++;
630
                        return ADS7846_FILTER_REPEAT;
631
                }
632
        }
633
}
634
 
635
static int ads7846_no_filter(void *ads, int data_idx, int *val)
636
{
637
        return ADS7846_FILTER_OK;
638
}
639
 
640
static void ads7846_rx_val(void *ads)
641
{
642
        struct ads7846 *ts = ads;
643
        struct spi_message *m;
644
        struct spi_transfer *t;
645
        u16 *rx_val;
646
        int val;
647
        int action;
648
        int status;
649
 
650
        m = &ts->msg[ts->msg_idx];
651
        t = list_entry(m->transfers.prev, struct spi_transfer, transfer_list);
652
        rx_val = t->rx_buf;
653
 
654
        /* adjust:  on-wire is a must-ignore bit, a BE12 value, then padding;
655
         * built from two 8 bit values written msb-first.
656
         */
657
        val = be16_to_cpu(*rx_val) >> 3;
658
 
659
        action = ts->filter(ts->filter_data, ts->msg_idx, &val);
660
        switch (action) {
661
        case ADS7846_FILTER_REPEAT:
662
                break;
663
        case ADS7846_FILTER_IGNORE:
664
                ts->tc.ignore = 1;
665
                /* Last message will contain ads7846_rx() as the
666
                 * completion function.
667
                 */
668
                m = ts->last_msg;
669
                break;
670
        case ADS7846_FILTER_OK:
671
                *rx_val = val;
672
                ts->tc.ignore = 0;
673
                m = &ts->msg[++ts->msg_idx];
674
                break;
675
        default:
676
                BUG();
677
        }
678
        status = spi_async(ts->spi, m);
679
        if (status)
680
                dev_err(&ts->spi->dev, "spi_async --> %d\n",
681
                                status);
682
}
683
 
684
static enum hrtimer_restart ads7846_timer(struct hrtimer *handle)
685
{
686
        struct ads7846  *ts = container_of(handle, struct ads7846, timer);
687
        int             status = 0;
688
 
689
        spin_lock_irq(&ts->lock);
690
 
691
        if (unlikely(!ts->get_pendown_state() ||
692
                     device_suspended(&ts->spi->dev))) {
693
                if (ts->pendown) {
694
                        struct input_dev *input = ts->input;
695
 
696
                        input_report_key(input, BTN_TOUCH, 0);
697
                        input_report_abs(input, ABS_PRESSURE, 0);
698
                        input_sync(input);
699
 
700
                        ts->pendown = 0;
701
#ifdef VERBOSE
702
                        dev_dbg(&ts->spi->dev, "UP\n");
703
#endif
704
                }
705
 
706
                /* measurement cycle ended */
707
                if (!device_suspended(&ts->spi->dev)) {
708
                        ts->irq_disabled = 0;
709
                        enable_irq(ts->spi->irq);
710
                }
711
                ts->pending = 0;
712
        } else {
713
                /* pen is still down, continue with the measurement */
714
                ts->msg_idx = 0;
715
                status = spi_async(ts->spi, &ts->msg[0]);
716
                if (status)
717
                        dev_err(&ts->spi->dev, "spi_async --> %d\n", status);
718
        }
719
 
720
        spin_unlock_irq(&ts->lock);
721
        return HRTIMER_NORESTART;
722
}
723
 
724
static irqreturn_t ads7846_irq(int irq, void *handle)
725
{
726
        struct ads7846 *ts = handle;
727
        unsigned long flags;
728
 
729
        spin_lock_irqsave(&ts->lock, flags);
730
        if (likely(ts->get_pendown_state())) {
731
                if (!ts->irq_disabled) {
732
                        /* The ARM do_simple_IRQ() dispatcher doesn't act
733
                         * like the other dispatchers:  it will report IRQs
734
                         * even after they've been disabled.  We work around
735
                         * that here.  (The "generic irq" framework may help...)
736
                         */
737
                        ts->irq_disabled = 1;
738
                        disable_irq(ts->spi->irq);
739
                        ts->pending = 1;
740
                        hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_DELAY),
741
                                        HRTIMER_MODE_REL);
742
                }
743
        }
744
        spin_unlock_irqrestore(&ts->lock, flags);
745
 
746
        return IRQ_HANDLED;
747
}
748
 
749
/*--------------------------------------------------------------------------*/
750
 
751
/* Must be called with ts->lock held */
752
static void ads7846_disable(struct ads7846 *ts)
753
{
754
        if (ts->disabled)
755
                return;
756
 
757
        ts->disabled = 1;
758
 
759
        /* are we waiting for IRQ, or polling? */
760
        if (!ts->pending) {
761
                ts->irq_disabled = 1;
762
                disable_irq(ts->spi->irq);
763
        } else {
764
                /* the timer will run at least once more, and
765
                 * leave everything in a clean state, IRQ disabled
766
                 */
767
                while (ts->pending) {
768
                        spin_unlock_irq(&ts->lock);
769
                        msleep(1);
770
                        spin_lock_irq(&ts->lock);
771
                }
772
        }
773
 
774
        /* we know the chip's in lowpower mode since we always
775
         * leave it that way after every request
776
         */
777
 
778
}
779
 
780
/* Must be called with ts->lock held */
781
static void ads7846_enable(struct ads7846 *ts)
782
{
783
        if (!ts->disabled)
784
                return;
785
 
786
        ts->disabled = 0;
787
        ts->irq_disabled = 0;
788
        enable_irq(ts->spi->irq);
789
}
790
 
791
static int ads7846_suspend(struct spi_device *spi, pm_message_t message)
792
{
793
        struct ads7846 *ts = dev_get_drvdata(&spi->dev);
794
 
795
        spin_lock_irq(&ts->lock);
796
 
797
        spi->dev.power.power_state = message;
798
        ads7846_disable(ts);
799
 
800
        spin_unlock_irq(&ts->lock);
801
 
802
        return 0;
803
 
804
}
805
 
806
static int ads7846_resume(struct spi_device *spi)
807
{
808
        struct ads7846 *ts = dev_get_drvdata(&spi->dev);
809
 
810
        spin_lock_irq(&ts->lock);
811
 
812
        spi->dev.power.power_state = PMSG_ON;
813
        ads7846_enable(ts);
814
 
815
        spin_unlock_irq(&ts->lock);
816
 
817
        return 0;
818
}
819
 
820
static int __devinit ads7846_probe(struct spi_device *spi)
821
{
822
        struct ads7846                  *ts;
823
        struct input_dev                *input_dev;
824
        struct ads7846_platform_data    *pdata = spi->dev.platform_data;
825
        struct spi_message              *m;
826
        struct spi_transfer             *x;
827
        int                             vref;
828
        int                             err;
829
 
830
        if (!spi->irq) {
831
                dev_dbg(&spi->dev, "no IRQ?\n");
832
                return -ENODEV;
833
        }
834
 
835
        if (!pdata) {
836
                dev_dbg(&spi->dev, "no platform data?\n");
837
                return -ENODEV;
838
        }
839
 
840
        /* don't exceed max specified sample rate */
841
        if (spi->max_speed_hz > (125000 * SAMPLE_BITS)) {
842
                dev_dbg(&spi->dev, "f(sample) %d KHz?\n",
843
                                (spi->max_speed_hz/SAMPLE_BITS)/1000);
844
                return -EINVAL;
845
        }
846
 
847
        /* REVISIT when the irq can be triggered active-low, or if for some
848
         * reason the touchscreen isn't hooked up, we don't need to access
849
         * the pendown state.
850
         */
851
        if (pdata->get_pendown_state == NULL) {
852
                dev_dbg(&spi->dev, "no get_pendown_state function?\n");
853
                return -EINVAL;
854
        }
855
 
856
        /* We'd set TX wordsize 8 bits and RX wordsize to 13 bits ... except
857
         * that even if the hardware can do that, the SPI controller driver
858
         * may not.  So we stick to very-portable 8 bit words, both RX and TX.
859
         */
860
        spi->bits_per_word = 8;
861
        spi->mode = SPI_MODE_0;
862
        err = spi_setup(spi);
863
        if (err < 0)
864
                return err;
865
 
866
        ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL);
867
        input_dev = input_allocate_device();
868
        if (!ts || !input_dev) {
869
                err = -ENOMEM;
870
                goto err_free_mem;
871
        }
872
 
873
        dev_set_drvdata(&spi->dev, ts);
874
        spi->dev.power.power_state = PMSG_ON;
875
 
876
        ts->spi = spi;
877
        ts->input = input_dev;
878
 
879
        hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
880
        ts->timer.function = ads7846_timer;
881
 
882
        spin_lock_init(&ts->lock);
883
 
884
        ts->model = pdata->model ? : 7846;
885
        ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100;
886
        ts->x_plate_ohms = pdata->x_plate_ohms ? : 400;
887
        ts->pressure_max = pdata->pressure_max ? : ~0;
888
 
889
        if (pdata->filter != NULL) {
890
                if (pdata->filter_init != NULL) {
891
                        err = pdata->filter_init(pdata, &ts->filter_data);
892
                        if (err < 0)
893
                                goto err_free_mem;
894
                }
895
                ts->filter = pdata->filter;
896
                ts->filter_cleanup = pdata->filter_cleanup;
897
        } else if (pdata->debounce_max) {
898
                ts->debounce_max = pdata->debounce_max;
899
                if (ts->debounce_max < 2)
900
                        ts->debounce_max = 2;
901
                ts->debounce_tol = pdata->debounce_tol;
902
                ts->debounce_rep = pdata->debounce_rep;
903
                ts->filter = ads7846_debounce;
904
                ts->filter_data = ts;
905
        } else
906
                ts->filter = ads7846_no_filter;
907
        ts->get_pendown_state = pdata->get_pendown_state;
908
 
909
        if (pdata->penirq_recheck_delay_usecs)
910
                ts->penirq_recheck_delay_usecs =
911
                                pdata->penirq_recheck_delay_usecs;
912
 
913
        snprintf(ts->phys, sizeof(ts->phys), "%s/input0", spi->dev.bus_id);
914
 
915
        input_dev->name = "ADS784x Touchscreen";
916
        input_dev->phys = ts->phys;
917
        input_dev->dev.parent = &spi->dev;
918
 
919
        input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
920
        input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
921
        input_set_abs_params(input_dev, ABS_X,
922
                        pdata->x_min ? : 0,
923
                        pdata->x_max ? : MAX_12BIT,
924
                        0, 0);
925
        input_set_abs_params(input_dev, ABS_Y,
926
                        pdata->y_min ? : 0,
927
                        pdata->y_max ? : MAX_12BIT,
928
                        0, 0);
929
        input_set_abs_params(input_dev, ABS_PRESSURE,
930
                        pdata->pressure_min, pdata->pressure_max, 0, 0);
931
 
932
        vref = pdata->keep_vref_on;
933
 
934
        /* set up the transfers to read touchscreen state; this assumes we
935
         * use formula #2 for pressure, not #3.
936
         */
937
        m = &ts->msg[0];
938
        x = ts->xfer;
939
 
940
        spi_message_init(m);
941
 
942
        /* y- still on; turn on only y+ (and ADC) */
943
        ts->read_y = READ_Y(vref);
944
        x->tx_buf = &ts->read_y;
945
        x->len = 1;
946
        spi_message_add_tail(x, m);
947
 
948
        x++;
949
        x->rx_buf = &ts->tc.y;
950
        x->len = 2;
951
        spi_message_add_tail(x, m);
952
 
953
        /* the first sample after switching drivers can be low quality;
954
         * optionally discard it, using a second one after the signals
955
         * have had enough time to stabilize.
956
         */
957
        if (pdata->settle_delay_usecs) {
958
                x->delay_usecs = pdata->settle_delay_usecs;
959
 
960
                x++;
961
                x->tx_buf = &ts->read_y;
962
                x->len = 1;
963
                spi_message_add_tail(x, m);
964
 
965
                x++;
966
                x->rx_buf = &ts->tc.y;
967
                x->len = 2;
968
                spi_message_add_tail(x, m);
969
        }
970
 
971
        m->complete = ads7846_rx_val;
972
        m->context = ts;
973
 
974
        m++;
975
        spi_message_init(m);
976
 
977
        /* turn y- off, x+ on, then leave in lowpower */
978
        x++;
979
        ts->read_x = READ_X(vref);
980
        x->tx_buf = &ts->read_x;
981
        x->len = 1;
982
        spi_message_add_tail(x, m);
983
 
984
        x++;
985
        x->rx_buf = &ts->tc.x;
986
        x->len = 2;
987
        spi_message_add_tail(x, m);
988
 
989
        /* ... maybe discard first sample ... */
990
        if (pdata->settle_delay_usecs) {
991
                x->delay_usecs = pdata->settle_delay_usecs;
992
 
993
                x++;
994
                x->tx_buf = &ts->read_x;
995
                x->len = 1;
996
                spi_message_add_tail(x, m);
997
 
998
                x++;
999
                x->rx_buf = &ts->tc.x;
1000
                x->len = 2;
1001
                spi_message_add_tail(x, m);
1002
        }
1003
 
1004
        m->complete = ads7846_rx_val;
1005
        m->context = ts;
1006
 
1007
        /* turn y+ off, x- on; we'll use formula #2 */
1008
        if (ts->model == 7846) {
1009
                m++;
1010
                spi_message_init(m);
1011
 
1012
                x++;
1013
                ts->read_z1 = READ_Z1(vref);
1014
                x->tx_buf = &ts->read_z1;
1015
                x->len = 1;
1016
                spi_message_add_tail(x, m);
1017
 
1018
                x++;
1019
                x->rx_buf = &ts->tc.z1;
1020
                x->len = 2;
1021
                spi_message_add_tail(x, m);
1022
 
1023
                /* ... maybe discard first sample ... */
1024
                if (pdata->settle_delay_usecs) {
1025
                        x->delay_usecs = pdata->settle_delay_usecs;
1026
 
1027
                        x++;
1028
                        x->tx_buf = &ts->read_z1;
1029
                        x->len = 1;
1030
                        spi_message_add_tail(x, m);
1031
 
1032
                        x++;
1033
                        x->rx_buf = &ts->tc.z1;
1034
                        x->len = 2;
1035
                        spi_message_add_tail(x, m);
1036
                }
1037
 
1038
                m->complete = ads7846_rx_val;
1039
                m->context = ts;
1040
 
1041
                m++;
1042
                spi_message_init(m);
1043
 
1044
                x++;
1045
                ts->read_z2 = READ_Z2(vref);
1046
                x->tx_buf = &ts->read_z2;
1047
                x->len = 1;
1048
                spi_message_add_tail(x, m);
1049
 
1050
                x++;
1051
                x->rx_buf = &ts->tc.z2;
1052
                x->len = 2;
1053
                spi_message_add_tail(x, m);
1054
 
1055
                /* ... maybe discard first sample ... */
1056
                if (pdata->settle_delay_usecs) {
1057
                        x->delay_usecs = pdata->settle_delay_usecs;
1058
 
1059
                        x++;
1060
                        x->tx_buf = &ts->read_z2;
1061
                        x->len = 1;
1062
                        spi_message_add_tail(x, m);
1063
 
1064
                        x++;
1065
                        x->rx_buf = &ts->tc.z2;
1066
                        x->len = 2;
1067
                        spi_message_add_tail(x, m);
1068
                }
1069
 
1070
                m->complete = ads7846_rx_val;
1071
                m->context = ts;
1072
        }
1073
 
1074
        /* power down */
1075
        m++;
1076
        spi_message_init(m);
1077
 
1078
        x++;
1079
        ts->pwrdown = PWRDOWN;
1080
        x->tx_buf = &ts->pwrdown;
1081
        x->len = 1;
1082
        spi_message_add_tail(x, m);
1083
 
1084
        x++;
1085
        x->rx_buf = &ts->dummy;
1086
        x->len = 2;
1087
        CS_CHANGE(*x);
1088
        spi_message_add_tail(x, m);
1089
 
1090
        m->complete = ads7846_rx;
1091
        m->context = ts;
1092
 
1093
        ts->last_msg = m;
1094
 
1095
        if (request_irq(spi->irq, ads7846_irq, IRQF_TRIGGER_FALLING,
1096
                        spi->dev.driver->name, ts)) {
1097
                dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
1098
                err = -EBUSY;
1099
                goto err_cleanup_filter;
1100
        }
1101
 
1102
        err = ads784x_hwmon_register(spi, ts);
1103
        if (err)
1104
                goto err_free_irq;
1105
 
1106
        dev_info(&spi->dev, "touchscreen, irq %d\n", spi->irq);
1107
 
1108
        /* take a first sample, leaving nPENIRQ active and vREF off; avoid
1109
         * the touchscreen, in case it's not connected.
1110
         */
1111
        (void) ads7846_read12_ser(&spi->dev,
1112
                          READ_12BIT_SER(vaux) | ADS_PD10_ALL_ON);
1113
 
1114
        err = sysfs_create_group(&spi->dev.kobj, &ads784x_attr_group);
1115
        if (err)
1116
                goto err_remove_hwmon;
1117
 
1118
        err = input_register_device(input_dev);
1119
        if (err)
1120
                goto err_remove_attr_group;
1121
 
1122
        return 0;
1123
 
1124
 err_remove_attr_group:
1125
        sysfs_remove_group(&spi->dev.kobj, &ads784x_attr_group);
1126
 err_remove_hwmon:
1127
        ads784x_hwmon_unregister(spi, ts);
1128
 err_free_irq:
1129
        free_irq(spi->irq, ts);
1130
 err_cleanup_filter:
1131
        if (ts->filter_cleanup)
1132
                ts->filter_cleanup(ts->filter_data);
1133
 err_free_mem:
1134
        input_free_device(input_dev);
1135
        kfree(ts);
1136
        return err;
1137
}
1138
 
1139
static int __devexit ads7846_remove(struct spi_device *spi)
1140
{
1141
        struct ads7846          *ts = dev_get_drvdata(&spi->dev);
1142
 
1143
        ads784x_hwmon_unregister(spi, ts);
1144
        input_unregister_device(ts->input);
1145
 
1146
        ads7846_suspend(spi, PMSG_SUSPEND);
1147
 
1148
        sysfs_remove_group(&spi->dev.kobj, &ads784x_attr_group);
1149
 
1150
        free_irq(ts->spi->irq, ts);
1151
        /* suspend left the IRQ disabled */
1152
        enable_irq(ts->spi->irq);
1153
 
1154
        if (ts->filter_cleanup)
1155
                ts->filter_cleanup(ts->filter_data);
1156
 
1157
        kfree(ts);
1158
 
1159
        dev_dbg(&spi->dev, "unregistered touchscreen\n");
1160
        return 0;
1161
}
1162
 
1163
static struct spi_driver ads7846_driver = {
1164
        .driver = {
1165
                .name   = "ads7846",
1166
                .bus    = &spi_bus_type,
1167
                .owner  = THIS_MODULE,
1168
        },
1169
        .probe          = ads7846_probe,
1170
        .remove         = __devexit_p(ads7846_remove),
1171
        .suspend        = ads7846_suspend,
1172
        .resume         = ads7846_resume,
1173
};
1174
 
1175
static int __init ads7846_init(void)
1176
{
1177
        /* grr, board-specific init should stay out of drivers!! */
1178
 
1179
#ifdef  CONFIG_ARCH_OMAP
1180
        if (machine_is_omap_osk()) {
1181
                /* GPIO4 = PENIRQ; GPIO6 = BUSY */
1182
                omap_request_gpio(4);
1183
                omap_set_gpio_direction(4, 1);
1184
                omap_request_gpio(6);
1185
                omap_set_gpio_direction(6, 1);
1186
        }
1187
        // also TI 1510 Innovator, bitbanging through FPGA
1188
        // also Nokia 770
1189
        // also Palm Tungsten T2
1190
#endif
1191
 
1192
        // PXA:
1193
        // also Dell Axim X50
1194
        // also HP iPaq H191x/H192x/H415x/H435x
1195
        // also Intel Lubbock (additional to UCB1400; as temperature sensor)
1196
        // also Sharp Zaurus C7xx, C8xx (corgi/sheperd/husky)
1197
 
1198
        // Atmel at91sam9261-EK uses ads7843
1199
 
1200
        // also various AMD Au1x00 devel boards
1201
 
1202
        return spi_register_driver(&ads7846_driver);
1203
}
1204
module_init(ads7846_init);
1205
 
1206
static void __exit ads7846_exit(void)
1207
{
1208
        spi_unregister_driver(&ads7846_driver);
1209
 
1210
#ifdef  CONFIG_ARCH_OMAP
1211
        if (machine_is_omap_osk()) {
1212
                omap_free_gpio(4);
1213
                omap_free_gpio(6);
1214
        }
1215
#endif
1216
 
1217
}
1218
module_exit(ads7846_exit);
1219
 
1220
MODULE_DESCRIPTION("ADS7846 TouchScreen Driver");
1221
MODULE_LICENSE("GPL");

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.