3 * keyboard input driver for i2c IR remote controls
5 * Copyright (c) 2000-2003 Gerd Knorr <kraxel@bytesex.org>
6 * modified for PixelView (BT878P+W/FM) by
7 * Michal Kochanowicz <mkochano@pld.org.pl>
8 * Christoph Bartelmus <lirc@bartelmus.de>
9 * modified for KNC ONE TV Station/Anubis Typhoon TView Tuner by
10 * Ulrich Mueller <ulrich.mueller42@web.de>
11 * modified for em2820 based USB TV tuners by
12 * Markus Rechberger <mrechberger@gmail.com>
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #include <linux/module.h>
31 #include <linux/moduleparam.h>
32 #include <linux/init.h>
33 #include <linux/kernel.h>
34 #include <linux/sched.h>
35 #include <linux/string.h>
36 #include <linux/timer.h>
37 #include <linux/delay.h>
38 #include <linux/errno.h>
39 #include <linux/slab.h>
40 #include <linux/i2c.h>
41 #include <linux/workqueue.h>
42 #include <asm/semaphore.h>
43 #include <media/ir-common.h>
44 #include <media/ir-kbd-i2c.h>
46 /* Mark Phalan <phalanm@o2.ie> */
47 static IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE] = {
61 [ 31 ] = KEY_VOLUMEDOWN,
62 [ 27 ] = KEY_VOLUMEUP,
63 [ 26 ] = KEY_CHANNELUP,
64 [ 30 ] = KEY_CHANNELDOWN,
66 [ 29 ] = KEY_PAGEDOWN,
69 [ 24 ] = KEY_KPPLUSMINUS, /* CH +/- */
70 [ 22 ] = KEY_SUBTITLE, /* CC */
71 [ 13 ] = KEY_TEXT, /* TTX */
72 [ 11 ] = KEY_TV, /* AIR/CBL */
73 [ 17 ] = KEY_PC, /* PC/TV */
74 [ 23 ] = KEY_OK, /* CH RTN */
75 [ 25 ] = KEY_MODE, /* FUNC */
76 [ 12 ] = KEY_SEARCH, /* AUTOSCAN */
78 /* Not sure what to do with these ones! */
79 [ 15 ] = KEY_SELECT, /* SOURCE */
80 [ 10 ] = KEY_KPPLUS, /* +100 */
81 [ 20 ] = KEY_KPEQUAL, /* SYNC */
82 [ 28 ] = KEY_MEDIA, /* PC/TV */
85 static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
88 [ 0x10 ] = KEY_BACKSPACE, /* Recall */
100 [ 0x12 ] = KEY_KPDOT, /* 100+ */
102 [ 0x7 ] = KEY_VOLUMEUP,
103 [ 0xb ] = KEY_VOLUMEDOWN,
104 [ 0x1a ] = KEY_KPPLUS,
105 [ 0x18 ] = KEY_KPMINUS,
108 [ 0xf ] = KEY_CHANNELUP,
109 [ 0x13 ] = KEY_CHANNELDOWN,
112 [ 0x1b ] = KEY_VIDEO, /* Video source */
113 [ 0x49 ] = KEY_LANGUAGE, /* MTS Select */
114 [ 0x19 ] = KEY_SEARCH, /* Auto Scan */
116 [ 0x4b ] = KEY_RECORD,
118 [ 0x45 ] = KEY_PAUSE, /* Pause */
120 [ 0x40 ] = KEY_FORWARD, /* Forward ? */
121 [ 0x42 ] = KEY_REWIND, /* Backward ? */
125 static IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE] = {
127 [ 0x4a ] = KEY_POWER,
131 [ 0x3d ] = KEY_PRINT,
134 [ 0x04 ] = KEY_GREEN,
135 [ 0x11 ] = KEY_YELLOW,
138 [ 0x2d ] = KEY_VOLUMEUP,
139 [ 0x1e ] = KEY_VOLUMEDOWN,
143 [ 0x16 ] = KEY_CHANNELUP,
144 [ 0x17 ] = KEY_CHANNELDOWN,
149 [ 0x23 ] = KEY_RIGHT,
150 [ 0x0d ] = KEY_SELECT,
155 [ 0x07 ] = KEY_REFRESH,
158 [ 0x29 ] = KEY_RECORD,
160 [ 0x4b ] = KEY_PAUSE,
161 [ 0x4d ] = KEY_REWIND,
163 [ 0x4e ] = KEY_FORWARD,
164 [ 0x53 ] = KEY_PREVIOUS,
179 [ 0x74 ] = KEY_CHANNEL,
180 [ 0x0a ] = KEY_BACKSPACE,
183 /* ----------------------------------------------------------------------- */
184 /* insmod parameters */
187 module_param(debug, int, 0644); /* debug level (0,1,2) */
189 #define DEVNAME "ir-kbd-i2c"
190 #define dprintk(level, fmt, arg...) if (debug >= level) \
191 printk(KERN_DEBUG DEVNAME ": " fmt , ## arg)
193 /* ----------------------------------------------------------------------- */
195 static int get_key_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
197 unsigned char buf[3];
198 int start, toggle, dev, code;
201 if (3 != i2c_master_recv(&ir->c,buf,3))
204 /* split rc5 data block ... */
205 start = (buf[0] >> 6) & 3;
206 toggle = (buf[0] >> 5) & 1;
208 code = (buf[1] >> 2) & 0x3f;
213 dprintk(1,"ir hauppauge (rc5): s%d t%d dev=%d code=%d\n",
214 start, toggle, dev, code);
218 *ir_raw = (start << 12) | (toggle << 11) | (dev << 6) | code;
222 static int get_key_pixelview(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
227 if (1 != i2c_master_recv(&ir->c,&b,1)) {
228 dprintk(1,"read error\n");
236 static int get_key_pv951(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
241 if (1 != i2c_master_recv(&ir->c,&b,1)) {
242 dprintk(1,"read error\n");
249 dprintk(2,"key %02x\n", b);
256 static int get_key_knc1(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
261 if (1 != i2c_master_recv(&ir->c,&b,1)) {
262 dprintk(1,"read error\n");
266 /* it seems that 0xFE indicates that a button is still hold
267 down, while 0xff indicates that no button is hold
268 down. 0xfe sequences are sometimes interrupted by 0xFF */
270 dprintk(2,"key %02x\n", b);
284 static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
289 if (1 != i2c_master_recv(&ir->c,&b,1)) {
290 dprintk(1,"read error\n");
294 /* no button press */
307 /* The new pinnacle PCTV remote (with the colored buttons)
309 * Ricardo Cerqueira <v4l@cerqueira.org>
312 static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
315 unsigned int start = 0,parity = 0,code = 0;
318 if (4 != i2c_master_recv(&ir->c,b,4)) {
319 dprintk(1,"read error\n");
323 for (start = 0; start<4; start++) {
324 if (b[start] == 0x80) {
326 parity=b[(start+2)%4];
335 if (ir->old == parity)
341 /* Reduce code value to fit inside IR_KEYTAB_SIZE
343 * this is the only value that results in 42 unique
352 dprintk(1,"Pinnacle PCTV key %02x\n", code);
358 /* ----------------------------------------------------------------------- */
360 static void ir_key_poll(struct IR_i2c *ir)
362 static u32 ir_key, ir_raw;
365 dprintk(2,"ir_poll_key\n");
366 rc = ir->get_key(ir, &ir_key, &ir_raw);
368 dprintk(2,"error\n");
373 ir_input_nokey(ir->input, &ir->ir);
375 ir_input_keydown(ir->input, &ir->ir, ir_key, ir_raw);
379 static void ir_timer(unsigned long data)
381 struct IR_i2c *ir = (struct IR_i2c*)data;
382 schedule_work(&ir->work);
385 static void ir_work(void *data)
387 struct IR_i2c *ir = data;
389 mod_timer(&ir->timer, jiffies+HZ/10);
392 /* ----------------------------------------------------------------------- */
394 static int ir_attach(struct i2c_adapter *adap, int addr,
395 unsigned short flags, int kind);
396 static int ir_detach(struct i2c_client *client);
397 static int ir_probe(struct i2c_adapter *adap);
399 static struct i2c_driver driver = {
400 .name = "ir remote kbd driver",
401 .id = I2C_DRIVERID_EXP3, /* FIXME */
402 .flags = I2C_DF_NOTIFY,
403 .attach_adapter = ir_probe,
404 .detach_client = ir_detach,
407 static struct i2c_client client_template =
413 static int ir_attach(struct i2c_adapter *adap, int addr,
414 unsigned short flags, int kind)
416 IR_KEYTAB_TYPE *ir_codes = NULL;
420 struct input_dev *input_dev;
422 ir = kzalloc(sizeof(struct IR_i2c), GFP_KERNEL);
423 input_dev = input_allocate_device();
424 if (!ir || !input_dev) {
426 input_free_device(input_dev);
430 ir->c = client_template;
431 ir->input = input_dev;
433 i2c_set_clientdata(&ir->c, ir);
434 ir->c.adapter = adap;
440 ir->get_key = get_key_pixelview;
441 ir_type = IR_TYPE_OTHER;
442 ir_codes = ir_codes_empty;
446 ir->get_key = get_key_pv951;
447 ir_type = IR_TYPE_OTHER;
448 ir_codes = ir_codes_pv951;
453 ir->get_key = get_key_haup;
454 ir_type = IR_TYPE_RC5;
455 ir_codes = ir_codes_rc5_tv;
459 ir->get_key = get_key_knc1;
460 ir_type = IR_TYPE_OTHER;
461 ir_codes = ir_codes_empty;
464 name = "Pinnacle PCTV";
465 ir->get_key = get_key_pinnacle;
466 ir_type = IR_TYPE_OTHER;
467 ir_codes = ir_codes_pinnacle;
471 ir->get_key = get_key_purpletv;
472 ir_type = IR_TYPE_OTHER;
473 ir_codes = ir_codes_purpletv;
477 /* shouldn't happen */
478 printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n",addr);
483 /* Sets name and its physical addr */
484 snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (%s)", name);
485 snprintf(ir->phys, sizeof(ir->phys), "%s/%s/ir0",
486 ir->c.adapter->dev.bus_id,
488 ir->ir_codes=ir_codes;
490 /* register i2c device
491 * At device register, IR codes may be changed to be
494 i2c_attach_client(&ir->c);
496 /* init + register input device */
497 ir_input_init(input_dev, &ir->ir, ir_type, ir_codes);
498 input_dev->id.bustype = BUS_I2C;
499 input_dev->name = ir->c.name;
500 input_dev->phys = ir->phys;
502 /* register event device */
503 input_register_device(ir->input);
505 /* start polling via eventd */
506 INIT_WORK(&ir->work, ir_work, ir);
507 init_timer(&ir->timer);
508 ir->timer.function = ir_timer;
509 ir->timer.data = (unsigned long)ir;
510 schedule_work(&ir->work);
515 static int ir_detach(struct i2c_client *client)
517 struct IR_i2c *ir = i2c_get_clientdata(client);
519 /* kill outstanding polls */
520 del_timer(&ir->timer);
521 flush_scheduled_work();
523 /* unregister devices */
524 input_unregister_device(ir->input);
525 i2c_detach_client(&ir->c);
532 static int ir_probe(struct i2c_adapter *adap)
535 /* The external IR receiver is at i2c address 0x34 (0x35 for
536 reads). Future Hauppauge cards will have an internal
537 receiver at 0x30 (0x31 for reads). In theory, both can be
538 fitted, and Hauppauge suggest an external overrides an
541 That's why we probe 0x1a (~0x34) first. CB
544 static const int probe_bttv[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1};
545 static const int probe_saa7134[] = { 0x7a, 0x47, -1 };
546 static const int probe_em2820[] = { 0x30, 0x47, -1 };
547 const int *probe = NULL;
557 probe = probe_saa7134;
559 case I2C_HW_B_EM2820:
560 probe = probe_em2820;
566 memset(&c,0,sizeof(c));
568 for (i = 0; -1 != probe[i]; i++) {
570 rc = i2c_master_recv(&c,&buf,0);
571 dprintk(1,"probe 0x%02x @ %s: %s\n",
572 probe[i], adap->name,
573 (0 == rc) ? "yes" : "no");
575 ir_attach(adap,probe[i],0,0);
582 /* ----------------------------------------------------------------------- */
584 MODULE_AUTHOR("Gerd Knorr, Michal Kochanowicz, Christoph Bartelmus, Ulrich Mueller");
585 MODULE_DESCRIPTION("input driver for i2c IR remote controls");
586 MODULE_LICENSE("GPL");
588 static int __init ir_init(void)
590 return i2c_add_driver(&driver);
593 static void __exit ir_fini(void)
595 i2c_del_driver(&driver);
598 module_init(ir_init);
599 module_exit(ir_fini);
602 * Overrides for Emacs so that we follow Linus's tabbing style.
603 * ---------------------------------------------------------------------------