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>
45 static IR_KEYTAB_TYPE ir_codes_em2820[IR_KEYTAB_SIZE] = {
46 [ 0x00 ] = KEY_CHANNEL,
47 [ 0x01 ] = KEY_SELECT,
53 [ 0x07 ] = KEY_CHANNELUP,
58 [ 0x0b ] = KEY_CHANNELDOWN,
62 [ 0x0f ] = KEY_VOLUMEUP,
67 [ 0x13 ] = KEY_VOLUMEDOWN,
69 [ 0x17 ] = KEY_RECORD,
70 [ 0x18 ] = KEY_REWIND,
72 [ 0x1b ] = KEY_BACKSPACE,
77 /* Mark Phalan <phalanm@o2.ie> */
78 static IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE] = {
92 [ 0x1f ] = KEY_VOLUMEDOWN,
93 [ 0x1b ] = KEY_VOLUMEUP,
94 [ 0x1a ] = KEY_CHANNELUP,
95 [ 0x1e ] = KEY_CHANNELDOWN,
96 [ 0x0e ] = KEY_PAGEUP,
97 [ 0x1d ] = KEY_PAGEDOWN,
100 [ 0x18 ] = KEY_KPPLUSMINUS, /* CH +/- */
101 [ 0x16 ] = KEY_SUBTITLE, /* CC */
102 [ 0x0d ] = KEY_TEXT, /* TTX */
103 [ 0x0b ] = KEY_TV, /* AIR/CBL */
104 [ 0x11 ] = KEY_PC, /* PC/TV */
105 [ 0x17 ] = KEY_OK, /* CH RTN */
106 [ 0x19 ] = KEY_MODE, /* FUNC */
107 [ 0x0c ] = KEY_SEARCH, /* AUTOSCAN */
109 /* Not sure what to do with these ones! */
110 [ 0x0f ] = KEY_SELECT, /* SOURCE */
111 [ 0x0a ] = KEY_KPPLUS, /* +100 */
112 [ 0x14 ] = KEY_KPEQUAL, /* SYNC */
113 [ 0x1c ] = KEY_MEDIA, /* PC/TV */
116 static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
117 [ 0x03 ] = KEY_POWER,
119 [ 0x10 ] = KEY_BACKSPACE, /* Recall */
131 [ 0x12 ] = KEY_KPDOT, /* 100+ */
133 [ 0x07 ] = KEY_VOLUMEUP,
134 [ 0x0b ] = KEY_VOLUMEDOWN,
135 [ 0x1a ] = KEY_KPPLUS,
136 [ 0x18 ] = KEY_KPMINUS,
139 [ 0x0f ] = KEY_CHANNELUP,
140 [ 0x13 ] = KEY_CHANNELDOWN,
143 [ 0x1b ] = KEY_VIDEO, /* Video source */
144 [ 0x49 ] = KEY_LANGUAGE, /* MTS Select */
145 [ 0x19 ] = KEY_SEARCH, /* Auto Scan */
147 [ 0x4b ] = KEY_RECORD,
149 [ 0x45 ] = KEY_PAUSE, /* Pause */
151 [ 0x40 ] = KEY_FORWARD, /* Forward ? */
152 [ 0x42 ] = KEY_REWIND, /* Backward ? */
158 struct input_dev *input;
159 struct ir_input_state ir;
161 struct work_struct work;
162 struct timer_list timer;
164 int (*get_key)(struct IR*, u32*, u32*);
167 /* ----------------------------------------------------------------------- */
168 /* insmod parameters */
171 module_param(debug, int, 0644); /* debug level (0,1,2) */
173 #define DEVNAME "ir-kbd-i2c"
174 #define dprintk(level, fmt, arg...) if (debug >= level) \
175 printk(KERN_DEBUG DEVNAME ": " fmt , ## arg)
177 #define IR_PINNACLE_REMOTE 0x01
178 #define IR_TERRATEC_REMOTE 0x02
180 /* ----------------------------------------------------------------------- */
182 static int get_key_haup(struct IR *ir, u32 *ir_key, u32 *ir_raw)
184 unsigned char buf[3];
185 int start, toggle, dev, code;
188 if (3 != i2c_master_recv(&ir->c,buf,3))
191 /* split rc5 data block ... */
192 start = (buf[0] >> 6) & 3;
193 toggle = (buf[0] >> 5) & 1;
195 code = (buf[1] >> 2) & 0x3f;
200 dprintk(1,"ir hauppauge (rc5): s%d t%d dev=%d code=%d\n",
201 start, toggle, dev, code);
205 *ir_raw = (start << 12) | (toggle << 11) | (dev << 6) | code;
209 static int get_key_pixelview(struct IR *ir, u32 *ir_key, u32 *ir_raw)
214 if (1 != i2c_master_recv(&ir->c,&b,1)) {
215 dprintk(1,"read error\n");
223 static int get_key_pv951(struct IR *ir, u32 *ir_key, u32 *ir_raw)
228 if (1 != i2c_master_recv(&ir->c,&b,1)) {
229 dprintk(1,"read error\n");
236 dprintk(2,"key %02x\n", b);
243 static int get_key_knc1(struct IR *ir, u32 *ir_key, u32 *ir_raw)
248 if (1 != i2c_master_recv(&ir->c,&b,1)) {
249 dprintk(1,"read error\n");
253 /* it seems that 0xFE indicates that a button is still hold
254 down, while 0xFF indicates that no button is hold
255 down. 0xFE sequences are sometimes interrupted by 0xFF */
257 dprintk(2,"key %02x\n", b);
271 static int get_key_purpletv(struct IR *ir, u32 *ir_key, u32 *ir_raw)
276 if (1 != i2c_master_recv(&ir->c,&b,1)) {
277 dprintk(1,"read error\n");
281 /* no button press */
294 /* ----------------------------------------------------------------------- */
296 static void ir_key_poll(struct IR *ir)
298 static u32 ir_key, ir_raw;
301 dprintk(2,"ir_poll_key\n");
302 rc = ir->get_key(ir, &ir_key, &ir_raw);
304 dprintk(2,"error\n");
309 ir_input_nokey(ir->input, &ir->ir);
311 ir_input_keydown(ir->input, &ir->ir, ir_key, ir_raw);
315 static void ir_timer(unsigned long data)
317 struct IR *ir = (struct IR*)data;
318 schedule_work(&ir->work);
321 static void ir_work(void *data)
323 struct IR *ir = data;
325 mod_timer(&ir->timer, jiffies+HZ/10);
328 /* ----------------------------------------------------------------------- */
330 static int ir_attach(struct i2c_adapter *adap, int addr,
331 unsigned short flags, int kind);
332 static int ir_detach(struct i2c_client *client);
333 static int ir_probe(struct i2c_adapter *adap);
335 static struct i2c_driver driver = {
336 .name = "ir remote kbd driver",
337 .id = I2C_DRIVERID_EXP3, /* FIXME */
338 .flags = I2C_DF_NOTIFY,
339 .attach_adapter = ir_probe,
340 .detach_client = ir_detach,
343 static struct i2c_client client_template =
349 static int ir_attach(struct i2c_adapter *adap, int addr,
350 unsigned short flags, int kind)
352 IR_KEYTAB_TYPE *ir_codes = NULL;
356 struct input_dev *input_dev;
358 ir = kzalloc(sizeof(struct IR), GFP_KERNEL);
359 input_dev = input_allocate_device();
360 if (!ir || !input_dev) {
362 input_free_device(input_dev);
366 ir->c = client_template;
367 ir->input = input_dev;
369 i2c_set_clientdata(&ir->c, ir);
370 ir->c.adapter = adap;
376 ir->get_key = get_key_pixelview;
377 ir_type = IR_TYPE_OTHER;
378 ir_codes = ir_codes_empty;
382 ir->get_key = get_key_pv951;
383 ir_type = IR_TYPE_OTHER;
384 ir_codes = ir_codes_pv951;
389 ir->get_key = get_key_haup;
390 ir_type = IR_TYPE_RC5;
391 ir_codes = ir_codes_rc5_tv;
395 case IR_TERRATEC_REMOTE:
396 name = "Terratec IR";
397 ir->get_key = get_key_knc1;
398 ir_type = IR_TYPE_OTHER;
399 ir_codes = ir_codes_em2820;
403 ir->get_key = get_key_knc1;
404 ir_type = IR_TYPE_OTHER;
405 ir_codes = ir_codes_em2820;
411 case IR_PINNACLE_REMOTE:
412 name = "Pinnacle IR Remote";
413 ir->get_key = get_key_purpletv;
414 ir_type = IR_TYPE_OTHER;
415 ir_codes = ir_codes_em2820;
419 ir->get_key = get_key_purpletv;
420 ir_type = IR_TYPE_OTHER;
421 ir_codes = ir_codes_empty;
425 /* shouldn't happen */
426 printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n",addr);
431 /* register i2c device */
432 i2c_attach_client(&ir->c);
433 snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (%s)", name);
434 snprintf(ir->phys, sizeof(ir->phys), "%s/%s/ir0",
435 ir->c.adapter->dev.bus_id,
438 /* init + register input device */
439 ir_input_init(input_dev, &ir->ir, ir_type, ir_codes);
440 input_dev->id.bustype = BUS_I2C;
441 input_dev->name = ir->c.name;
442 input_dev->phys = ir->phys;
444 input_register_device(ir->input);
446 /* start polling via eventd */
447 INIT_WORK(&ir->work, ir_work, ir);
448 init_timer(&ir->timer);
449 ir->timer.function = ir_timer;
450 ir->timer.data = (unsigned long)ir;
451 schedule_work(&ir->work);
456 static int ir_detach(struct i2c_client *client)
458 struct IR *ir = i2c_get_clientdata(client);
460 /* kill outstanding polls */
461 del_timer(&ir->timer);
462 flush_scheduled_work();
464 /* unregister devices */
465 input_unregister_device(ir->input);
466 i2c_detach_client(&ir->c);
473 static int ir_probe(struct i2c_adapter *adap)
476 /* The external IR receiver is at i2c address 0x34 (0x35 for
477 reads). Future Hauppauge cards will have an internal
478 receiver at 0x30 (0x31 for reads). In theory, both can be
479 fitted, and Hauppauge suggest an external overrides an
482 That's why we probe 0x1a (~0x34) first. CB
485 static const int probe_bttv[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1};
486 static const int probe_saa7134[] = { 0x7a, -1 };
487 static const int probe_em2820[] = { 0x47, 0x30, -1 };
488 const int *probe = NULL;
491 struct i2c_client c; unsigned char buf; int i,rc;
498 probe = probe_saa7134;
500 case I2C_HW_B_EM2820:
501 probe = probe_em2820;
507 memset(&c,0,sizeof(c));
509 for (i = 0; -1 != probe[i] && attached != 1; i++) {
511 rc = i2c_master_recv(&c,&buf,1);
512 dprintk(1,"probe 0x%02x @ %s: %s\n",
513 probe[i], adap->name,
514 (1 == rc) ? "yes" : "no");
519 ir_attach(adap,probe[i],0,0);
523 case I2C_HW_B_EM2820:
524 /* windows logs are needed for fixing the pinnacle device */
525 if (1 == rc && 0xff == buf){
526 ir_attach(adap,probe[i],0,IR_TERRATEC_REMOTE);
535 /* ----------------------------------------------------------------------- */
537 MODULE_AUTHOR("Gerd Knorr, Michal Kochanowicz, Christoph Bartelmus, Ulrich Mueller");
538 MODULE_DESCRIPTION("input driver for i2c IR remote controls");
539 MODULE_LICENSE("GPL");
541 static int __init ir_init(void)
543 return i2c_add_driver(&driver);
546 static void __exit ir_fini(void)
548 i2c_del_driver(&driver);
551 module_init(ir_init);
552 module_exit(ir_fini);
555 * Overrides for Emacs so that we follow Linus's tabbing style.
556 * ---------------------------------------------------------------------------