ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / drivers / input / touchscreen / h3600_ts_input.c
1 /*
2  * $Id: h3600_ts_input.c,v 1.4 2002/01/23 06:39:37 jsimmons Exp $
3  *
4  *  Copyright (c) 2001 "Crazy" James Simmons jsimmons@transvirtual.com 
5  *
6  *  Sponsored by Transvirtual Technology. 
7  * 
8  *  Derived from the code in h3600_ts.[ch] by Charles Flynn  
9  */
10
11 /*
12  * Driver for the h3600 Touch Screen and other Atmel controlled devices.
13  */
14
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 as published by
18  * the Free Software Foundation; either version 2 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program; if not, write to the Free Software
28  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29  *
30  * Should you need to contact me, the author, you can do so by
31  * e-mail - mail your message to <jsimmons@transvirtual.com>.
32  */
33
34 #include <linux/errno.h>
35 #include <linux/kernel.h>
36 #include <linux/module.h>
37 #include <linux/slab.h>
38 #include <linux/input.h>
39 #include <linux/serio.h>
40 #include <linux/init.h>
41 #include <linux/delay.h>
42 #include <linux/pm.h>
43
44 /* SA1100 serial defines */
45 #include <asm/arch/hardware.h>
46 #include <asm/arch/irqs.h>
47
48 /*
49  * Definitions & global arrays.
50  */
51
52 /* The start and end of frame characters SOF and EOF */
53 #define CHAR_SOF                0x02
54 #define CHAR_EOF                0x03
55 #define FRAME_OVERHEAD          3       /* CHAR_SOF,CHAR_EOF,LENGTH = 3 */
56
57 /*
58         Atmel events and response IDs contained in frame.
59         Programmer has no control over these numbers.
60         TODO there are holes - specifically  1,7,0x0a
61 */
62 #define VERSION_ID              0       /* Get Version (request/respose) */
63 #define KEYBD_ID                2       /* Keyboard (event) */
64 #define TOUCHS_ID               3       /* Touch Screen (event)*/
65 #define EEPROM_READ_ID          4       /* (request/response) */
66 #define EEPROM_WRITE_ID         5       /* (request/response) */
67 #define THERMAL_ID              6       /* (request/response) */
68 #define NOTIFY_LED_ID           8       /* (request/response) */
69 #define BATTERY_ID              9       /* (request/response) */
70 #define SPI_READ_ID             0x0b    /* ( request/response) */
71 #define SPI_WRITE_ID            0x0c    /* ( request/response) */
72 #define FLITE_ID                0x0d    /* backlight ( request/response) */
73 #define STX_ID                  0xa1    /* extension pack status (req/resp) */
74
75 #define MAX_ID                  14
76
77 #define H3600_MAX_LENGTH 16
78 #define H3600_KEY 0xf 
79
80 #define H3600_SCANCODE_RECORD   1        /* 1 -> record button */
81 #define H3600_SCANCODE_CALENDAR 2        /* 2 -> calendar */
82 #define H3600_SCANCODE_CONTACTS 3        /* 3 -> contact */
83 #define H3600_SCANCODE_Q        4        /* 4 -> Q button */
84 #define H3600_SCANCODE_START    5        /* 5 -> start menu */
85 #define H3600_SCANCODE_UP       6        /* 6 -> up */
86 #define H3600_SCANCODE_RIGHT    7        /* 7 -> right */
87 #define H3600_SCANCODE_LEFT     8        /* 8 -> left */
88 #define H3600_SCANCODE_DOWN     9        /* 9 -> down */
89
90 static char *h3600_name = "H3600 TouchScreen";
91
92 /*
93  * Per-touchscreen data.
94  */
95 struct h3600_dev {
96         struct input_dev dev;
97         struct serio *serio;
98         unsigned char event;    /* event ID from packet */
99         unsigned char chksum;
100         unsigned char len;
101         unsigned char idx;
102         unsigned char buf[H3600_MAX_LENGTH];
103         char phys[32];
104 };
105
106 static void action_button_handler(int irq, void *dev_id, struct pt_regs *regs)
107 {
108         int down = (GPLR & GPIO_BITSY_ACTION_BUTTON) ? 0 : 1;
109         struct input_dev *dev = (struct input_dev *) dev_id;
110
111         input_regs(dev, regs);
112         input_report_key(dev, KEY_ENTER, down);
113         input_sync(dev);
114 }
115
116 static void npower_button_handler(int irq, void *dev_id, struct pt_regs *regs)
117 {
118         int down = (GPLR & GPIO_BITSY_NPOWER_BUTTON) ? 0 : 1;
119         struct input_dev *dev = (struct input_dev *) dev_id;
120
121         /* 
122          * This interrupt is only called when we release the key. So we have 
123          * to fake a key press.
124          */     
125         input_regs(dev, regs);
126         input_report_key(dev, KEY_SUSPEND, 1);
127         input_report_key(dev, KEY_SUSPEND, down);       
128         input_sync(dev);
129 }
130
131 #ifdef CONFIG_PM
132
133 static int flite_brightness = 25;
134
135 enum flite_pwr {
136         FLITE_PWR_OFF = 0,
137         FLITE_PWR_ON = 1
138 };
139
140 /*
141  * h3600_flite_power: enables or disables power to frontlight, using last bright */
142 unsigned int h3600_flite_power(struct input_dev *dev, enum flite_pwr pwr)
143 {
144         unsigned char brightness = ((pwr==FLITE_PWR_OFF) ? 0:flite_brightness);
145         struct h3600_dev *ts = dev->private;
146
147         /* Must be in this order */     
148         ts->serio->write(ts->serio, 1);
149         ts->serio->write(ts->serio, pwr);
150         ts->serio->write(ts->serio, brightness); 
151         return 0;
152 }
153
154 static int suspended = 0;
155 static int h3600ts_pm_callback(struct pm_dev *pm_dev, pm_request_t req, 
156                                 void *data)
157 {
158         struct input_dev *dev = (struct input_dev *) data;      
159
160         switch (req) {
161         case PM_SUSPEND: /* enter D1-D3 */
162                 suspended = 1;
163                 h3600_flite_power(dev, FLITE_PWR_OFF);
164                 break;
165         case PM_BLANK:
166                 if (!suspended)
167                         h3600_flite_power(dev, FLITE_PWR_OFF);
168                 break;
169         case PM_RESUME:  /* enter D0 */
170                 /* same as unblank */
171         case PM_UNBLANK:
172                 if (suspended) {
173                         //initSerial();
174                         suspended = 0;
175                 }
176                 h3600_flite_power(dev, FLITE_PWR_ON);
177                 break;
178         }
179         return 0;
180 }
181 #endif
182
183 /*
184  * This function translates the native event packets to linux input event
185  * packets. Some packets coming from serial are not touchscreen related. In
186  * this case we send them off to be processed elsewhere. 
187  */
188 static void h3600ts_process_packet(struct h3600_dev *ts, struct pt_regs *regs)
189 {
190         struct input_dev *dev = &ts->dev;
191         static int touched = 0;
192         int key, down = 0;
193
194         input_regs(dev, regs);
195
196         switch (ts->event) {
197                 /*
198                    Buttons - returned as a single byte
199                         7 6 5 4 3 2 1 0
200                         S x x x N N N N
201
202                    S       switch state ( 0=pressed 1=released)
203                    x       Unused.
204                    NNNN    switch number 0-15
205
206                 Note: This is true for non interrupt generated key events.
207                 */
208                 case KEYBD_ID:
209                         down = (ts->buf[0] & 0x80) ? 0 : 1; 
210
211                         switch (ts->buf[0] & 0x7f) {
212                                 case H3600_SCANCODE_RECORD:
213                                         key = KEY_RECORD;
214                                         break;
215                                 case H3600_SCANCODE_CALENDAR:
216                                         key = KEY_PROG1;
217                                         break;
218                                 case H3600_SCANCODE_CONTACTS:
219                                         key = KEY_PROG2;
220                                         break;
221                                 case H3600_SCANCODE_Q:        
222                                         key = KEY_Q;
223                                         break;
224                                 case H3600_SCANCODE_START:
225                                         key = KEY_PROG3;
226                                         break;
227                                 case H3600_SCANCODE_UP:
228                                         key = KEY_UP;
229                                         break;
230                                 case H3600_SCANCODE_RIGHT:
231                                         key = KEY_RIGHT;
232                                         break;
233                                 case H3600_SCANCODE_LEFT:
234                                         key = KEY_LEFT;
235                                         break;
236                                 case H3600_SCANCODE_DOWN:
237                                         key = KEY_DOWN;
238                                         break;
239                                 default:
240                                         key = 0;        
241                         }       
242                         if (key) 
243                                 input_report_key(dev, key, down);
244                         break;
245                 /*
246                  * Native touchscreen event data is formatted as shown below:-
247                  *
248                  *      +-------+-------+-------+-------+
249                  *      | Xmsb  | Xlsb  | Ymsb  | Ylsb  |
250                  *      +-------+-------+-------+-------+
251                  *       byte 0    1       2       3
252                  */
253                 case TOUCHS_ID:
254                         if (!touched) { 
255                                 input_report_key(dev, BTN_TOUCH, 1);
256                                 touched = 1;
257                         }                       
258
259                         if (ts->len) {
260                                 unsigned short x, y;                            
261
262                                 x = ts->buf[0]; x <<= 8; x += ts->buf[1];
263                                 y = ts->buf[2]; y <<= 8; y += ts->buf[3];
264
265                                 input_report_abs(dev, ABS_X, x);
266                                 input_report_abs(dev, ABS_Y, y);
267                         } else {
268                                 input_report_key(dev, BTN_TOUCH, 0);
269                                 touched = 0;
270                         }       
271                         break;
272                 default:
273                         /* Send a non input event elsewhere */
274                         break;
275         }
276
277         input_sync(dev);
278 }
279
280 /*
281  * h3600ts_event() handles events from the input module.
282  */
283 static int h3600ts_event(struct input_dev *dev, unsigned int type, 
284                          unsigned int code, int value)
285 {
286         struct h3600_dev *ts = dev->private;
287
288         switch (type) {
289                 case EV_LED: {
290                 //      ts->serio->write(ts->serio, SOME_CMD);
291                         return 0;
292                 }
293         }                                       
294         return -1;
295 }
296
297 /*
298         Frame format
299   byte    1       2               3              len + 4
300         +-------+---------------+---------------+--=------------+
301         |SOF    |id     |len    | len bytes     | Chksum        |
302         +-------+---------------+---------------+--=------------+
303   bit   0     7  8    11 12   15 16
304
305         +-------+---------------+-------+
306         |SOF    |id     |0      |Chksum | - Note Chksum does not include SOF
307         +-------+---------------+-------+
308   bit   0     7  8    11 12   15 16
309
310 */
311
312 static int state;
313
314 /* decode States  */
315 #define STATE_SOF       0       /* start of FRAME */
316 #define STATE_ID        1       /* state where we decode the ID & len */
317 #define STATE_DATA      2       /* state where we decode data */
318 #define STATE_EOF       3       /* state where we decode checksum or EOF */
319
320 static void h3600ts_interrupt(struct serio *serio, unsigned char data,
321                               unsigned int flags)
322 {
323         struct h3600_dev *ts = serio->private;
324
325         /*
326          * We have a new frame coming in. 
327          */
328         switch (state) {
329                 case STATE_SOF:
330                         if (data == CHAR_SOF)
331                                 state = STATE_ID;       
332                         return;
333                 case STATE_ID:
334                         ts->event = (data & 0xf0) >> 4;
335                         ts->len = (data & 0xf);
336                         ts->idx = 0;
337                         if (ts->event >= MAX_ID) {
338                                 state = STATE_SOF;
339                                 break;
340                         }
341                         ts->chksum = data;
342                         state=(ts->len > 0 ) ? STATE_DATA : STATE_EOF;
343                         break;
344                 case STATE_DATA:
345                         ts->chksum += data;
346                         ts->buf[ts->idx]= data;
347                         if(++ts->idx == ts->len) 
348                                 state = STATE_EOF;
349                         break;
350                 case STATE_EOF:
351                         state = STATE_SOF;
352                         if (data == CHAR_EOF || data == ts->chksum )
353                                 h3600ts_process_packet(ts);
354                         break;
355                 default:
356                         printk("Error3\n");
357                         break;
358         }
359 }
360
361 /*
362  * h3600ts_connect() is the routine that is called when someone adds a
363  * new serio device. It looks whether it was registered as a H3600 touchscreen
364  * and if yes, registers it as an input device.
365  */
366 static void h3600ts_connect(struct serio *serio, struct serio_dev *dev)
367 {
368         struct h3600_dev *ts;
369
370         if (serio->type != (SERIO_RS232 | SERIO_H3600))
371                 return;
372
373         if (!(ts = kmalloc(sizeof(struct h3600_dev), GFP_KERNEL)))
374                 return;
375
376         memset(ts, 0, sizeof(struct h3600_dev));
377
378         init_input_dev(&ts->dev);
379
380         /* Device specific stuff */
381         set_GPIO_IRQ_edge( GPIO_BITSY_ACTION_BUTTON, GPIO_BOTH_EDGES );
382         set_GPIO_IRQ_edge( GPIO_BITSY_NPOWER_BUTTON, GPIO_RISING_EDGE );
383
384         if (request_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, action_button_handler,
385                         SA_SHIRQ | SA_INTERRUPT | SA_SAMPLE_RANDOM,     
386                         "h3600_action", &ts->dev)) {
387                 printk(KERN_ERR "h3600ts.c: Could not allocate Action Button IRQ!\n");
388                 kfree(ts);
389                 return;
390         }
391
392         if (request_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, npower_button_handler,
393                         SA_SHIRQ | SA_INTERRUPT | SA_SAMPLE_RANDOM, 
394                         "h3600_suspend", &ts->dev)) {
395                 free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, &ts->dev);
396                 printk(KERN_ERR "h3600ts.c: Could not allocate Power Button IRQ!\n");
397                 kfree(ts);
398                 return;
399         }
400         /* Now we have things going we setup our input device */
401         ts->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_LED) | BIT(EV_PWR);
402         ts->dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y);
403         ts->dev.ledbit[0] = BIT(LED_SLEEP); 
404
405         ts->dev.absmin[ABS_X] = 60;   ts->dev.absmin[ABS_Y] = 35;
406         ts->dev.absmax[ABS_X] = 985; ts->dev.absmax[ABS_Y] = 1024;
407         ts->dev.absfuzz[ABS_X] = 0; ts->dev.absfuzz[ABS_Y] = 0;
408
409         ts->serio = serio;
410         serio->private = ts;
411
412         set_bit(KEY_RECORD, ts->dev.keybit);
413         set_bit(KEY_Q, ts->dev.keybit);
414         set_bit(KEY_PROG1, ts->dev.keybit);
415         set_bit(KEY_PROG2, ts->dev.keybit);
416         set_bit(KEY_PROG3, ts->dev.keybit);
417         set_bit(KEY_UP, ts->dev.keybit);
418         set_bit(KEY_RIGHT, ts->dev.keybit);
419         set_bit(KEY_LEFT, ts->dev.keybit);
420         set_bit(KEY_DOWN, ts->dev.keybit);
421         set_bit(KEY_ENTER, ts->dev.keybit);
422         ts->dev.keybit[LONG(BTN_TOUCH)] |= BIT(BTN_TOUCH);
423         ts->dev.keybit[LONG(KEY_SUSPEND)] |= BIT(KEY_SUSPEND);
424
425         sprintf(ts->phys, "%s/input0", serio->phys);
426
427         ts->dev.event = h3600ts_event;
428         ts->dev.private = ts;
429         ts->dev.name = h3600_name;
430         ts->dev.phys = ts->phys;
431         ts->dev.id.bustype = BUS_RS232;
432         ts->dev.id.vendor = SERIO_H3600;
433         ts->dev.id.product = 0x0666;  /* FIXME !!! We can ask the hardware */
434         ts->dev.id.version = 0x0100;
435
436         if (serio_open(serio, dev)) {
437                 free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, ts);
438                 free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, ts);
439                 kfree(ts);
440                 return;
441         }
442
443         //h3600_flite_control(1, 25);     /* default brightness */
444 #ifdef CONFIG_PM
445         ts->dev.pm_dev = pm_register(PM_ILLUMINATION_DEV, PM_SYS_LIGHT, 
446                                         h3600ts_pm_callback);
447         printk("registered pm callback\n");
448 #endif
449         input_register_device(&ts->dev);
450
451         printk(KERN_INFO "input: %s on %s\n", h3600_name, serio->phys);
452 }
453
454 /*
455  * h3600ts_disconnect() is the opposite of h3600ts_connect()
456  */
457
458 static void h3600ts_disconnect(struct serio *serio)
459 {
460         struct h3600_dev *ts = serio->private;
461         
462         free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, &ts->dev);
463         free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, &ts->dev);
464         input_unregister_device(&ts->dev);
465         serio_close(serio);
466         kfree(ts);
467 }
468
469 /*
470  * The serio device structure.
471  */
472
473 static struct serio_dev h3600ts_dev = {
474         .interrupt =    h3600ts_interrupt,
475         .connect =      h3600ts_connect,
476         .disconnect =   h3600ts_disconnect,
477 };
478
479 /*
480  * The functions for inserting/removing us as a module.
481  */
482
483 static int __init h3600ts_init(void)
484 {
485         serio_register_device(&h3600ts_dev);
486         return 0;
487 }
488
489 static void __exit h3600ts_exit(void)
490 {
491         serio_unregister_device(&h3600ts_dev);
492 }
493
494 module_init(h3600ts_init);
495 module_exit(h3600ts_exit);