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] = {
53 [ 7 ] = KEY_CHANNELUP,
58 [ 11 ] = KEY_CHANNELDOWN,
62 [ 15 ] = KEY_VOLUMEUP,
67 [ 19 ] = KEY_VOLUMEDOWN,
72 [ 27 ] = KEY_BACKSPACE,
77 /* Mark Phalan <phalanm@o2.ie> */
78 static IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE] = {
92 [ 31 ] = KEY_VOLUMEDOWN,
93 [ 27 ] = KEY_VOLUMEUP,
94 [ 26 ] = KEY_CHANNELUP,
95 [ 30 ] = KEY_CHANNELDOWN,
97 [ 29 ] = KEY_PAGEDOWN,
100 [ 24 ] = KEY_KPPLUSMINUS, /* CH +/- */
101 [ 22 ] = KEY_SUBTITLE, /* CC */
102 [ 13 ] = KEY_TEXT, /* TTX */
103 [ 11 ] = KEY_TV, /* AIR/CBL */
104 [ 17 ] = KEY_PC, /* PC/TV */
105 [ 23 ] = KEY_OK, /* CH RTN */
106 [ 25 ] = KEY_MODE, /* FUNC */
107 [ 12 ] = KEY_SEARCH, /* AUTOSCAN */
109 /* Not sure what to do with these ones! */
110 [ 15 ] = KEY_SELECT, /* SOURCE */
111 [ 10 ] = KEY_KPPLUS, /* +100 */
112 [ 20 ] = KEY_KPEQUAL, /* SYNC */
113 [ 28 ] = KEY_MEDIA, /* PC/TV */
116 static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
119 [ 0x10 ] = KEY_BACKSPACE, /* Recall */
131 [ 0x12 ] = KEY_KPDOT, /* 100+ */
133 [ 0x7 ] = KEY_VOLUMEUP,
134 [ 0xb ] = KEY_VOLUMEDOWN,
135 [ 0x1a ] = KEY_KPPLUS,
136 [ 0x18 ] = KEY_KPMINUS,
139 [ 0xf ] = 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 /* ----------------------------------------------------------------------- */
179 static int get_key_haup(struct IR *ir, u32 *ir_key, u32 *ir_raw)
181 unsigned char buf[3];
182 int start, toggle, dev, code;
185 if (3 != i2c_master_recv(&ir->c,buf,3))
188 /* split rc5 data block ... */
189 start = (buf[0] >> 6) & 3;
190 toggle = (buf[0] >> 5) & 1;
192 code = (buf[1] >> 2) & 0x3f;
197 dprintk(1,"ir hauppauge (rc5): s%d t%d dev=%d code=%d\n",
198 start, toggle, dev, code);
202 *ir_raw = (start << 12) | (toggle << 11) | (dev << 6) | code;
206 static int get_key_pixelview(struct IR *ir, u32 *ir_key, u32 *ir_raw)
211 if (1 != i2c_master_recv(&ir->c,&b,1)) {
212 dprintk(1,"read error\n");
220 static int get_key_pv951(struct IR *ir, u32 *ir_key, u32 *ir_raw)
225 if (1 != i2c_master_recv(&ir->c,&b,1)) {
226 dprintk(1,"read error\n");
233 dprintk(2,"key %02x\n", b);
240 static int get_key_knc1(struct IR *ir, u32 *ir_key, u32 *ir_raw)
245 if (1 != i2c_master_recv(&ir->c,&b,1)) {
246 dprintk(1,"read error\n");
250 /* it seems that 0xFE indicates that a button is still hold
251 down, while 0xFF indicates that no button is hold
252 down. 0xFE sequences are sometimes interrupted by 0xFF */
254 dprintk(2,"key %02x\n", b);
268 static int get_key_purpletv(struct IR *ir, u32 *ir_key, u32 *ir_raw)
273 if (1 != i2c_master_recv(&ir->c,&b,1)) {
274 dprintk(1,"read error\n");
278 /* no button press */
290 /* ----------------------------------------------------------------------- */
292 static void ir_key_poll(struct IR *ir)
294 static u32 ir_key, ir_raw;
297 dprintk(2,"ir_poll_key\n");
298 rc = ir->get_key(ir, &ir_key, &ir_raw);
300 dprintk(2,"error\n");
305 ir_input_nokey(ir->input, &ir->ir);
307 ir_input_keydown(ir->input, &ir->ir, ir_key, ir_raw);
311 static void ir_timer(unsigned long data)
313 struct IR *ir = (struct IR*)data;
314 schedule_work(&ir->work);
317 static void ir_work(void *data)
319 struct IR *ir = data;
321 mod_timer(&ir->timer, jiffies+HZ/10);
324 /* ----------------------------------------------------------------------- */
326 static int ir_attach(struct i2c_adapter *adap, int addr,
327 unsigned short flags, int kind);
328 static int ir_detach(struct i2c_client *client);
329 static int ir_probe(struct i2c_adapter *adap);
331 static struct i2c_driver driver = {
332 .name = "ir remote kbd driver",
333 .id = I2C_DRIVERID_EXP3, /* FIXME */
334 .flags = I2C_DF_NOTIFY,
335 .attach_adapter = ir_probe,
336 .detach_client = ir_detach,
339 static struct i2c_client client_template =
345 static int ir_attach(struct i2c_adapter *adap, int addr,
346 unsigned short flags, int kind)
348 IR_KEYTAB_TYPE *ir_codes = NULL;
352 struct input_dev *input_dev;
354 ir = kzalloc(sizeof(struct IR), GFP_KERNEL);
355 input_dev = input_allocate_device();
356 if (!ir || !input_dev) {
358 input_free_device(input_dev);
362 ir->c = client_template;
363 ir->input = input_dev;
365 i2c_set_clientdata(&ir->c, ir);
366 ir->c.adapter = adap;
372 ir->get_key = get_key_pixelview;
373 ir_type = IR_TYPE_OTHER;
374 ir_codes = ir_codes_empty;
378 ir->get_key = get_key_pv951;
379 ir_type = IR_TYPE_OTHER;
380 ir_codes = ir_codes_pv951;
385 ir->get_key = get_key_haup;
386 ir_type = IR_TYPE_RC5;
387 ir_codes = ir_codes_rc5_tv;
391 ir->get_key = get_key_knc1;
392 ir->c.addr = addr>>1;
393 ir_type = IR_TYPE_OTHER;
394 ir_codes = ir_codes_em2820;
398 ir->get_key = get_key_knc1;
399 ir_type = IR_TYPE_OTHER;
400 ir_codes = ir_codes_empty;
404 ir->get_key = get_key_purpletv;
405 ir_type = IR_TYPE_OTHER;
406 ir_codes = ir_codes_purpletv;
409 /* shouldn't happen */
410 printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n",addr);
415 /* register i2c device */
416 i2c_attach_client(&ir->c);
417 snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (%s)", name);
418 snprintf(ir->phys, sizeof(ir->phys), "%s/%s/ir0",
419 ir->c.adapter->dev.bus_id,
422 /* init + register input device */
423 ir_input_init(input_dev, &ir->ir, ir_type, ir_codes);
424 input_dev->id.bustype = BUS_I2C;
425 input_dev->name = ir->c.name;
426 input_dev->phys = ir->phys;
428 input_register_device(ir->input);
430 /* start polling via eventd */
431 INIT_WORK(&ir->work, ir_work, ir);
432 init_timer(&ir->timer);
433 ir->timer.function = ir_timer;
434 ir->timer.data = (unsigned long)ir;
435 schedule_work(&ir->work);
440 static int ir_detach(struct i2c_client *client)
442 struct IR *ir = i2c_get_clientdata(client);
444 /* kill outstanding polls */
445 del_timer(&ir->timer);
446 flush_scheduled_work();
448 /* unregister devices */
449 input_unregister_device(ir->input);
450 i2c_detach_client(&ir->c);
457 static int ir_probe(struct i2c_adapter *adap)
460 /* The external IR receiver is at i2c address 0x34 (0x35 for
461 reads). Future Hauppauge cards will have an internal
462 receiver at 0x30 (0x31 for reads). In theory, both can be
463 fitted, and Hauppauge suggest an external overrides an
466 That's why we probe 0x1a (~0x34) first. CB
469 static const int probe_bttv[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1};
470 static const int probe_saa7134[] = { 0x7a, -1 };
471 static const int probe_em2820[] = { 0x60, -1 };
472 const int *probe = NULL;
473 struct i2c_client c; char buf; int i,rc;
480 probe = probe_saa7134;
482 case I2C_HW_B_EM2820:
483 probe = probe_em2820;
489 memset(&c,0,sizeof(c));
491 for (i = 0; -1 != probe[i]; i++) {
493 rc = i2c_master_recv(&c,&buf,1);
494 dprintk(1,"probe 0x%02x @ %s: %s\n",
495 probe[i], adap->name,
496 (1 == rc) ? "yes" : "no");
498 ir_attach(adap,probe[i],0,0);
505 /* ----------------------------------------------------------------------- */
507 MODULE_AUTHOR("Gerd Knorr, Michal Kochanowicz, Christoph Bartelmus, Ulrich Mueller");
508 MODULE_DESCRIPTION("input driver for i2c IR remote controls");
509 MODULE_LICENSE("GPL");
511 static int __init ir_init(void)
513 return i2c_add_driver(&driver);
516 static void __exit ir_fini(void)
518 i2c_del_driver(&driver);
521 module_init(ir_init);
522 module_exit(ir_fini);
525 * Overrides for Emacs so that we follow Linus's tabbing style.
526 * ---------------------------------------------------------------------------