2 * $Id: ir-kbd-i2c.c,v 1.11 2005/07/07 16:42:11 mchehab Exp $
4 * keyboard input driver for i2c IR remote controls
6 * Copyright (c) 2000-2003 Gerd Knorr <kraxel@bytesex.org>
7 * modified for PixelView (BT878P+W/FM) by
8 * Michal Kochanowicz <mkochano@pld.org.pl>
9 * Christoph Bartelmus <lirc@bartelmus.de>
10 * modified for KNC ONE TV Station/Anubis Typhoon TView Tuner by
11 * Ulrich Mueller <ulrich.mueller42@web.de>
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #include <linux/module.h>
30 #include <linux/moduleparam.h>
31 #include <linux/init.h>
32 #include <linux/kernel.h>
33 #include <linux/sched.h>
34 #include <linux/string.h>
35 #include <linux/timer.h>
36 #include <linux/delay.h>
37 #include <linux/errno.h>
38 #include <linux/slab.h>
39 #include <linux/i2c.h>
40 #include <linux/workqueue.h>
42 #include <asm/semaphore.h>
44 #include <media/ir-common.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 ? */
128 struct input_dev input;
129 struct ir_input_state ir;
131 struct work_struct work;
132 struct timer_list timer;
134 int (*get_key)(struct IR*, u32*, u32*);
137 /* ----------------------------------------------------------------------- */
138 /* insmod parameters */
141 module_param(debug, int, 0644); /* debug level (0,1,2) */
143 #define DEVNAME "ir-kbd-i2c"
144 #define dprintk(level, fmt, arg...) if (debug >= level) \
145 printk(KERN_DEBUG DEVNAME ": " fmt , ## arg)
147 /* ----------------------------------------------------------------------- */
149 static int get_key_haup(struct IR *ir, u32 *ir_key, u32 *ir_raw)
151 unsigned char buf[3];
152 int start, toggle, dev, code;
155 if (3 != i2c_master_recv(&ir->c,buf,3))
158 /* split rc5 data block ... */
159 start = (buf[0] >> 6) & 3;
160 toggle = (buf[0] >> 5) & 1;
162 code = (buf[1] >> 2) & 0x3f;
167 dprintk(1,"ir hauppauge (rc5): s%d t%d dev=%d code=%d\n",
168 start, toggle, dev, code);
172 *ir_raw = (start << 12) | (toggle << 11) | (dev << 6) | code;
176 static int get_key_pixelview(struct IR *ir, u32 *ir_key, u32 *ir_raw)
181 if (1 != i2c_master_recv(&ir->c,&b,1)) {
182 dprintk(1,"read error\n");
190 static int get_key_pv951(struct IR *ir, u32 *ir_key, u32 *ir_raw)
195 if (1 != i2c_master_recv(&ir->c,&b,1)) {
196 dprintk(1,"read error\n");
203 dprintk(2,"key %02x\n", b);
210 static int get_key_knc1(struct IR *ir, u32 *ir_key, u32 *ir_raw)
215 if (1 != i2c_master_recv(&ir->c,&b,1)) {
216 dprintk(1,"read error\n");
220 /* it seems that 0xFE indicates that a button is still hold
221 down, while 0xFF indicates that no button is hold
222 down. 0xFE sequences are sometimes interrupted by 0xFF */
224 dprintk(2,"key %02x\n", b);
238 static int get_key_purpletv(struct IR *ir, u32 *ir_key, u32 *ir_raw)
243 if (1 != i2c_master_recv(&ir->c,&b,1)) {
244 dprintk(1,"read error\n");
248 /* no button press */
260 /* ----------------------------------------------------------------------- */
262 static void ir_key_poll(struct IR *ir)
264 static u32 ir_key, ir_raw;
267 dprintk(2,"ir_poll_key\n");
268 rc = ir->get_key(ir, &ir_key, &ir_raw);
270 dprintk(2,"error\n");
275 ir_input_nokey(&ir->input,&ir->ir);
277 ir_input_keydown(&ir->input,&ir->ir, ir_key, ir_raw);
281 static void ir_timer(unsigned long data)
283 struct IR *ir = (struct IR*)data;
284 schedule_work(&ir->work);
287 static void ir_work(void *data)
289 struct IR *ir = data;
291 mod_timer(&ir->timer, jiffies+HZ/10);
294 /* ----------------------------------------------------------------------- */
296 static int ir_attach(struct i2c_adapter *adap, int addr,
297 unsigned short flags, int kind);
298 static int ir_detach(struct i2c_client *client);
299 static int ir_probe(struct i2c_adapter *adap);
301 static struct i2c_driver driver = {
302 .name = "ir remote kbd driver",
303 .id = I2C_DRIVERID_EXP3, /* FIXME */
304 .flags = I2C_DF_NOTIFY,
305 .attach_adapter = ir_probe,
306 .detach_client = ir_detach,
309 static struct i2c_client client_template =
315 static int ir_attach(struct i2c_adapter *adap, int addr,
316 unsigned short flags, int kind)
318 IR_KEYTAB_TYPE *ir_codes = NULL;
323 if (NULL == (ir = kmalloc(sizeof(struct IR),GFP_KERNEL)))
325 memset(ir,0,sizeof(*ir));
326 ir->c = client_template;
328 i2c_set_clientdata(&ir->c, ir);
329 ir->c.adapter = adap;
335 ir->get_key = get_key_pixelview;
336 ir_type = IR_TYPE_OTHER;
337 ir_codes = ir_codes_empty;
341 ir->get_key = get_key_pv951;
342 ir_type = IR_TYPE_OTHER;
343 ir_codes = ir_codes_pv951;
348 ir->get_key = get_key_haup;
349 ir_type = IR_TYPE_RC5;
350 ir_codes = ir_codes_rc5_tv;
354 ir->get_key = get_key_knc1;
355 ir_type = IR_TYPE_OTHER;
356 ir_codes = ir_codes_empty;
360 ir->get_key = get_key_purpletv;
361 ir_type = IR_TYPE_OTHER;
362 ir_codes = ir_codes_purpletv;
365 /* shouldn't happen */
366 printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n",addr);
371 /* register i2c device */
372 i2c_attach_client(&ir->c);
373 snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (%s)", name);
374 snprintf(ir->phys, sizeof(ir->phys), "%s/%s/ir0",
375 ir->c.adapter->dev.bus_id,
378 /* init + register input device */
379 ir_input_init(&ir->input,&ir->ir,ir_type,ir_codes);
380 ir->input.id.bustype = BUS_I2C;
381 ir->input.name = ir->c.name;
382 ir->input.phys = ir->phys;
383 input_register_device(&ir->input);
384 printk(DEVNAME ": %s detected at %s [%s]\n",
385 ir->input.name,ir->input.phys,adap->name);
387 /* start polling via eventd */
388 INIT_WORK(&ir->work, ir_work, ir);
389 init_timer(&ir->timer);
390 ir->timer.function = ir_timer;
391 ir->timer.data = (unsigned long)ir;
392 schedule_work(&ir->work);
397 static int ir_detach(struct i2c_client *client)
399 struct IR *ir = i2c_get_clientdata(client);
401 /* kill outstanding polls */
402 del_timer(&ir->timer);
403 flush_scheduled_work();
405 /* unregister devices */
406 input_unregister_device(&ir->input);
407 i2c_detach_client(&ir->c);
414 static int ir_probe(struct i2c_adapter *adap)
417 /* The external IR receiver is at i2c address 0x34 (0x35 for
418 reads). Future Hauppauge cards will have an internal
419 receiver at 0x30 (0x31 for reads). In theory, both can be
420 fitted, and Hauppauge suggest an external overrides an
423 That's why we probe 0x1a (~0x34) first. CB
426 static const int probe_bttv[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1};
427 static const int probe_saa7134[] = { 0x7a, -1 };
428 const int *probe = NULL;
429 struct i2c_client c; char buf; int i,rc;
436 probe = probe_saa7134;
442 memset(&c,0,sizeof(c));
444 for (i = 0; -1 != probe[i]; i++) {
446 rc = i2c_master_recv(&c,&buf,1);
447 dprintk(1,"probe 0x%02x @ %s: %s\n",
448 probe[i], adap->name,
449 (1 == rc) ? "yes" : "no");
451 ir_attach(adap,probe[i],0,0);
458 /* ----------------------------------------------------------------------- */
460 MODULE_AUTHOR("Gerd Knorr, Michal Kochanowicz, Christoph Bartelmus, Ulrich Mueller");
461 MODULE_DESCRIPTION("input driver for i2c IR remote controls");
462 MODULE_LICENSE("GPL");
464 static int __init ir_init(void)
466 return i2c_add_driver(&driver);
469 static void __exit ir_fini(void)
471 i2c_del_driver(&driver);
474 module_init(ir_init);
475 module_exit(ir_fini);
478 * Overrides for Emacs so that we follow Linus's tabbing style.
479 * ---------------------------------------------------------------------------