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>
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #include <linux/module.h>
29 #include <linux/moduleparam.h>
30 #include <linux/init.h>
31 #include <linux/kernel.h>
32 #include <linux/sched.h>
33 #include <linux/string.h>
34 #include <linux/timer.h>
35 #include <linux/delay.h>
36 #include <linux/errno.h>
37 #include <linux/slab.h>
38 #include <linux/i2c.h>
39 #include <linux/workqueue.h>
40 #include <asm/semaphore.h>
41 #include <media/ir-common.h>
43 /* Mark Phalan <phalanm@o2.ie> */
44 static IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE] = {
58 [ 31 ] = KEY_VOLUMEDOWN,
59 [ 27 ] = KEY_VOLUMEUP,
60 [ 26 ] = KEY_CHANNELUP,
61 [ 30 ] = KEY_CHANNELDOWN,
63 [ 29 ] = KEY_PAGEDOWN,
66 [ 24 ] = KEY_KPPLUSMINUS, /* CH +/- */
67 [ 22 ] = KEY_SUBTITLE, /* CC */
68 [ 13 ] = KEY_TEXT, /* TTX */
69 [ 11 ] = KEY_TV, /* AIR/CBL */
70 [ 17 ] = KEY_PC, /* PC/TV */
71 [ 23 ] = KEY_OK, /* CH RTN */
72 [ 25 ] = KEY_MODE, /* FUNC */
73 [ 12 ] = KEY_SEARCH, /* AUTOSCAN */
75 /* Not sure what to do with these ones! */
76 [ 15 ] = KEY_SELECT, /* SOURCE */
77 [ 10 ] = KEY_KPPLUS, /* +100 */
78 [ 20 ] = KEY_KPEQUAL, /* SYNC */
79 [ 28 ] = KEY_MEDIA, /* PC/TV */
82 static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
85 [ 0x10 ] = KEY_BACKSPACE, /* Recall */
97 [ 0x12 ] = KEY_KPDOT, /* 100+ */
99 [ 0x7 ] = KEY_VOLUMEUP,
100 [ 0xb ] = KEY_VOLUMEDOWN,
101 [ 0x1a ] = KEY_KPPLUS,
102 [ 0x18 ] = KEY_KPMINUS,
105 [ 0xf ] = KEY_CHANNELUP,
106 [ 0x13 ] = KEY_CHANNELDOWN,
109 [ 0x1b ] = KEY_VIDEO, /* Video source */
110 [ 0x49 ] = KEY_LANGUAGE, /* MTS Select */
111 [ 0x19 ] = KEY_SEARCH, /* Auto Scan */
113 [ 0x4b ] = KEY_RECORD,
115 [ 0x45 ] = KEY_PAUSE, /* Pause */
117 [ 0x40 ] = KEY_FORWARD, /* Forward ? */
118 [ 0x42 ] = KEY_REWIND, /* Backward ? */
124 struct input_dev *input;
125 struct ir_input_state ir;
127 struct work_struct work;
128 struct timer_list timer;
130 int (*get_key)(struct IR*, u32*, u32*);
133 /* ----------------------------------------------------------------------- */
134 /* insmod parameters */
137 module_param(debug, int, 0644); /* debug level (0,1,2) */
139 #define DEVNAME "ir-kbd-i2c"
140 #define dprintk(level, fmt, arg...) if (debug >= level) \
141 printk(KERN_DEBUG DEVNAME ": " fmt , ## arg)
143 /* ----------------------------------------------------------------------- */
145 static int get_key_haup(struct IR *ir, u32 *ir_key, u32 *ir_raw)
147 unsigned char buf[3];
148 int start, toggle, dev, code;
151 if (3 != i2c_master_recv(&ir->c,buf,3))
154 /* split rc5 data block ... */
155 start = (buf[0] >> 6) & 3;
156 toggle = (buf[0] >> 5) & 1;
158 code = (buf[1] >> 2) & 0x3f;
163 dprintk(1,"ir hauppauge (rc5): s%d t%d dev=%d code=%d\n",
164 start, toggle, dev, code);
168 *ir_raw = (start << 12) | (toggle << 11) | (dev << 6) | code;
172 static int get_key_pixelview(struct IR *ir, u32 *ir_key, u32 *ir_raw)
177 if (1 != i2c_master_recv(&ir->c,&b,1)) {
178 dprintk(1,"read error\n");
186 static int get_key_pv951(struct IR *ir, u32 *ir_key, u32 *ir_raw)
191 if (1 != i2c_master_recv(&ir->c,&b,1)) {
192 dprintk(1,"read error\n");
199 dprintk(2,"key %02x\n", b);
206 static int get_key_knc1(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");
216 /* it seems that 0xFE indicates that a button is still hold
217 down, while 0xFF indicates that no button is hold
218 down. 0xFE sequences are sometimes interrupted by 0xFF */
220 dprintk(2,"key %02x\n", b);
234 static int get_key_purpletv(struct IR *ir, u32 *ir_key, u32 *ir_raw)
239 if (1 != i2c_master_recv(&ir->c,&b,1)) {
240 dprintk(1,"read error\n");
244 /* no button press */
256 /* ----------------------------------------------------------------------- */
258 static void ir_key_poll(struct IR *ir)
260 static u32 ir_key, ir_raw;
263 dprintk(2,"ir_poll_key\n");
264 rc = ir->get_key(ir, &ir_key, &ir_raw);
266 dprintk(2,"error\n");
271 ir_input_nokey(ir->input, &ir->ir);
273 ir_input_keydown(ir->input, &ir->ir, ir_key, ir_raw);
277 static void ir_timer(unsigned long data)
279 struct IR *ir = (struct IR*)data;
280 schedule_work(&ir->work);
283 static void ir_work(void *data)
285 struct IR *ir = data;
287 mod_timer(&ir->timer, jiffies+HZ/10);
290 /* ----------------------------------------------------------------------- */
292 static int ir_attach(struct i2c_adapter *adap, int addr,
293 unsigned short flags, int kind);
294 static int ir_detach(struct i2c_client *client);
295 static int ir_probe(struct i2c_adapter *adap);
297 static struct i2c_driver driver = {
298 .name = "ir remote kbd driver",
299 .id = I2C_DRIVERID_EXP3, /* FIXME */
300 .flags = I2C_DF_NOTIFY,
301 .attach_adapter = ir_probe,
302 .detach_client = ir_detach,
305 static struct i2c_client client_template =
311 static int ir_attach(struct i2c_adapter *adap, int addr,
312 unsigned short flags, int kind)
314 IR_KEYTAB_TYPE *ir_codes = NULL;
318 struct input_dev *input_dev;
320 ir = kzalloc(sizeof(struct IR), GFP_KERNEL);
321 input_dev = input_allocate_device();
322 if (!ir || !input_dev) {
324 input_free_device(input_dev);
328 ir->c = client_template;
329 ir->input = input_dev;
331 i2c_set_clientdata(&ir->c, ir);
332 ir->c.adapter = adap;
338 ir->get_key = get_key_pixelview;
339 ir_type = IR_TYPE_OTHER;
340 ir_codes = ir_codes_empty;
344 ir->get_key = get_key_pv951;
345 ir_type = IR_TYPE_OTHER;
346 ir_codes = ir_codes_pv951;
351 ir->get_key = get_key_haup;
352 ir_type = IR_TYPE_RC5;
353 ir_codes = ir_codes_rc5_tv;
357 ir->get_key = get_key_knc1;
358 ir_type = IR_TYPE_OTHER;
359 ir_codes = ir_codes_empty;
363 ir->get_key = get_key_purpletv;
364 ir_type = IR_TYPE_OTHER;
365 ir_codes = ir_codes_purpletv;
368 /* shouldn't happen */
369 printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n",addr);
374 /* register i2c device */
375 i2c_attach_client(&ir->c);
376 snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (%s)", name);
377 snprintf(ir->phys, sizeof(ir->phys), "%s/%s/ir0",
378 ir->c.adapter->dev.bus_id,
381 /* init + register input device */
382 ir_input_init(input_dev, &ir->ir, ir_type, ir_codes);
383 input_dev->id.bustype = BUS_I2C;
384 input_dev->name = ir->c.name;
385 input_dev->phys = ir->phys;
387 input_register_device(ir->input);
389 /* start polling via eventd */
390 INIT_WORK(&ir->work, ir_work, ir);
391 init_timer(&ir->timer);
392 ir->timer.function = ir_timer;
393 ir->timer.data = (unsigned long)ir;
394 schedule_work(&ir->work);
399 static int ir_detach(struct i2c_client *client)
401 struct IR *ir = i2c_get_clientdata(client);
403 /* kill outstanding polls */
404 del_timer(&ir->timer);
405 flush_scheduled_work();
407 /* unregister devices */
408 input_unregister_device(ir->input);
409 i2c_detach_client(&ir->c);
416 static int ir_probe(struct i2c_adapter *adap)
419 /* The external IR receiver is at i2c address 0x34 (0x35 for
420 reads). Future Hauppauge cards will have an internal
421 receiver at 0x30 (0x31 for reads). In theory, both can be
422 fitted, and Hauppauge suggest an external overrides an
425 That's why we probe 0x1a (~0x34) first. CB
428 static const int probe_bttv[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1};
429 static const int probe_saa7134[] = { 0x7a, -1 };
430 const int *probe = NULL;
431 struct i2c_client c; char buf; int i,rc;
438 probe = probe_saa7134;
444 memset(&c,0,sizeof(c));
446 for (i = 0; -1 != probe[i]; i++) {
448 rc = i2c_master_recv(&c,&buf,1);
449 dprintk(1,"probe 0x%02x @ %s: %s\n",
450 probe[i], adap->name,
451 (1 == rc) ? "yes" : "no");
453 ir_attach(adap,probe[i],0,0);
460 /* ----------------------------------------------------------------------- */
462 MODULE_AUTHOR("Gerd Knorr, Michal Kochanowicz, Christoph Bartelmus, Ulrich Mueller");
463 MODULE_DESCRIPTION("input driver for i2c IR remote controls");
464 MODULE_LICENSE("GPL");
466 static int __init ir_init(void)
468 return i2c_add_driver(&driver);
471 static void __exit ir_fini(void)
473 i2c_del_driver(&driver);
476 module_init(ir_init);
477 module_exit(ir_fini);
480 * Overrides for Emacs so that we follow Linus's tabbing style.
481 * ---------------------------------------------------------------------------