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>
41 #include <asm/semaphore.h>
43 #include <media/ir-common.h>
45 /* Mark Phalan <phalanm@o2.ie> */
46 static IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE] = {
60 [ 31 ] = KEY_VOLUMEDOWN,
61 [ 27 ] = KEY_VOLUMEUP,
62 [ 26 ] = KEY_CHANNELUP,
63 [ 30 ] = KEY_CHANNELDOWN,
65 [ 29 ] = KEY_PAGEDOWN,
68 [ 24 ] = KEY_KPPLUSMINUS, /* CH +/- */
69 [ 22 ] = KEY_SUBTITLE, /* CC */
70 [ 13 ] = KEY_TEXT, /* TTX */
71 [ 11 ] = KEY_TV, /* AIR/CBL */
72 [ 17 ] = KEY_PC, /* PC/TV */
73 [ 23 ] = KEY_OK, /* CH RTN */
74 [ 25 ] = KEY_MODE, /* FUNC */
75 [ 12 ] = KEY_SEARCH, /* AUTOSCAN */
77 /* Not sure what to do with these ones! */
78 [ 15 ] = KEY_SELECT, /* SOURCE */
79 [ 10 ] = KEY_KPPLUS, /* +100 */
80 [ 20 ] = KEY_KPEQUAL, /* SYNC */
81 [ 28 ] = KEY_MEDIA, /* PC/TV */
84 static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
87 [ 0x10 ] = KEY_BACKSPACE, /* Recall */
99 [ 0x12 ] = KEY_KPDOT, /* 100+ */
101 [ 0x7 ] = KEY_VOLUMEUP,
102 [ 0xb ] = KEY_VOLUMEDOWN,
103 [ 0x1a ] = KEY_KPPLUS,
104 [ 0x18 ] = KEY_KPMINUS,
107 [ 0xf ] = KEY_CHANNELUP,
108 [ 0x13 ] = KEY_CHANNELDOWN,
111 [ 0x1b ] = KEY_VIDEO, /* Video source */
112 [ 0x49 ] = KEY_LANGUAGE, /* MTS Select */
113 [ 0x19 ] = KEY_SEARCH, /* Auto Scan */
115 [ 0x4b ] = KEY_RECORD,
117 [ 0x45 ] = KEY_PAUSE, /* Pause */
119 [ 0x40 ] = KEY_FORWARD, /* Forward ? */
120 [ 0x42 ] = KEY_REWIND, /* Backward ? */
127 struct input_dev input;
128 struct ir_input_state ir;
130 struct work_struct work;
131 struct timer_list timer;
133 int (*get_key)(struct IR*, u32*, u32*);
136 /* ----------------------------------------------------------------------- */
137 /* insmod parameters */
140 module_param(debug, int, 0644); /* debug level (0,1,2) */
142 #define DEVNAME "ir-kbd-i2c"
143 #define dprintk(level, fmt, arg...) if (debug >= level) \
144 printk(KERN_DEBUG DEVNAME ": " fmt , ## arg)
146 /* ----------------------------------------------------------------------- */
148 static int get_key_haup(struct IR *ir, u32 *ir_key, u32 *ir_raw)
150 unsigned char buf[3];
151 int start, toggle, dev, code;
154 if (3 != i2c_master_recv(&ir->c,buf,3))
157 /* split rc5 data block ... */
158 start = (buf[0] >> 6) & 3;
159 toggle = (buf[0] >> 5) & 1;
161 code = (buf[1] >> 2) & 0x3f;
166 dprintk(1,"ir hauppauge (rc5): s%d t%d dev=%d code=%d\n",
167 start, toggle, dev, code);
171 *ir_raw = (start << 12) | (toggle << 11) | (dev << 6) | code;
175 static int get_key_pixelview(struct IR *ir, u32 *ir_key, u32 *ir_raw)
180 if (1 != i2c_master_recv(&ir->c,&b,1)) {
181 dprintk(1,"read error\n");
189 static int get_key_pv951(struct IR *ir, u32 *ir_key, u32 *ir_raw)
194 if (1 != i2c_master_recv(&ir->c,&b,1)) {
195 dprintk(1,"read error\n");
202 dprintk(2,"key %02x\n", b);
209 static int get_key_knc1(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");
219 /* it seems that 0xFE indicates that a button is still hold
220 down, while 0xFF indicates that no button is hold
221 down. 0xFE sequences are sometimes interrupted by 0xFF */
223 dprintk(2,"key %02x\n", b);
237 static int get_key_purpletv(struct IR *ir, u32 *ir_key, u32 *ir_raw)
242 if (1 != i2c_master_recv(&ir->c,&b,1)) {
243 dprintk(1,"read error\n");
247 /* no button press */
259 /* ----------------------------------------------------------------------- */
261 static void ir_key_poll(struct IR *ir)
263 static u32 ir_key, ir_raw;
266 dprintk(2,"ir_poll_key\n");
267 rc = ir->get_key(ir, &ir_key, &ir_raw);
269 dprintk(2,"error\n");
274 ir_input_nokey(&ir->input,&ir->ir);
276 ir_input_keydown(&ir->input,&ir->ir, ir_key, ir_raw);
280 static void ir_timer(unsigned long data)
282 struct IR *ir = (struct IR*)data;
283 schedule_work(&ir->work);
286 static void ir_work(void *data)
288 struct IR *ir = data;
290 mod_timer(&ir->timer, jiffies+HZ/10);
293 /* ----------------------------------------------------------------------- */
295 static int ir_attach(struct i2c_adapter *adap, int addr,
296 unsigned short flags, int kind);
297 static int ir_detach(struct i2c_client *client);
298 static int ir_probe(struct i2c_adapter *adap);
300 static struct i2c_driver driver = {
301 .name = "ir remote kbd driver",
302 .id = I2C_DRIVERID_EXP3, /* FIXME */
303 .flags = I2C_DF_NOTIFY,
304 .attach_adapter = ir_probe,
305 .detach_client = ir_detach,
308 static struct i2c_client client_template =
314 static int ir_attach(struct i2c_adapter *adap, int addr,
315 unsigned short flags, int kind)
317 IR_KEYTAB_TYPE *ir_codes = NULL;
322 if (NULL == (ir = kmalloc(sizeof(struct IR),GFP_KERNEL)))
324 memset(ir,0,sizeof(*ir));
325 ir->c = client_template;
327 i2c_set_clientdata(&ir->c, ir);
328 ir->c.adapter = adap;
334 ir->get_key = get_key_pixelview;
335 ir_type = IR_TYPE_OTHER;
336 ir_codes = ir_codes_empty;
340 ir->get_key = get_key_pv951;
341 ir_type = IR_TYPE_OTHER;
342 ir_codes = ir_codes_pv951;
347 ir->get_key = get_key_haup;
348 ir_type = IR_TYPE_RC5;
349 ir_codes = ir_codes_rc5_tv;
353 ir->get_key = get_key_knc1;
354 ir_type = IR_TYPE_OTHER;
355 ir_codes = ir_codes_empty;
359 ir->get_key = get_key_purpletv;
360 ir_type = IR_TYPE_OTHER;
361 ir_codes = ir_codes_purpletv;
364 /* shouldn't happen */
365 printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n",addr);
370 /* register i2c device */
371 i2c_attach_client(&ir->c);
372 snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (%s)", name);
373 snprintf(ir->phys, sizeof(ir->phys), "%s/%s/ir0",
374 ir->c.adapter->dev.bus_id,
377 /* init + register input device */
378 ir_input_init(&ir->input,&ir->ir,ir_type,ir_codes);
379 ir->input.id.bustype = BUS_I2C;
380 ir->input.name = ir->c.name;
381 ir->input.phys = ir->phys;
382 input_register_device(&ir->input);
383 printk(DEVNAME ": %s detected at %s [%s]\n",
384 ir->input.name,ir->input.phys,adap->name);
386 /* start polling via eventd */
387 INIT_WORK(&ir->work, ir_work, ir);
388 init_timer(&ir->timer);
389 ir->timer.function = ir_timer;
390 ir->timer.data = (unsigned long)ir;
391 schedule_work(&ir->work);
396 static int ir_detach(struct i2c_client *client)
398 struct IR *ir = i2c_get_clientdata(client);
400 /* kill outstanding polls */
401 del_timer(&ir->timer);
402 flush_scheduled_work();
404 /* unregister devices */
405 input_unregister_device(&ir->input);
406 i2c_detach_client(&ir->c);
413 static int ir_probe(struct i2c_adapter *adap)
416 /* The external IR receiver is at i2c address 0x34 (0x35 for
417 reads). Future Hauppauge cards will have an internal
418 receiver at 0x30 (0x31 for reads). In theory, both can be
419 fitted, and Hauppauge suggest an external overrides an
422 That's why we probe 0x1a (~0x34) first. CB
425 static const int probe_bttv[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1};
426 static const int probe_saa7134[] = { 0x7a, -1 };
427 const int *probe = NULL;
428 struct i2c_client c; char buf; int i,rc;
435 probe = probe_saa7134;
441 memset(&c,0,sizeof(c));
443 for (i = 0; -1 != probe[i]; i++) {
445 rc = i2c_master_recv(&c,&buf,1);
446 dprintk(1,"probe 0x%02x @ %s: %s\n",
447 probe[i], adap->name,
448 (1 == rc) ? "yes" : "no");
450 ir_attach(adap,probe[i],0,0);
457 /* ----------------------------------------------------------------------- */
459 MODULE_AUTHOR("Gerd Knorr, Michal Kochanowicz, Christoph Bartelmus, Ulrich Mueller");
460 MODULE_DESCRIPTION("input driver for i2c IR remote controls");
461 MODULE_LICENSE("GPL");
463 static int __init ir_init(void)
465 return i2c_add_driver(&driver);
468 static void __exit ir_fini(void)
470 i2c_del_driver(&driver);
473 module_init(ir_init);
474 module_exit(ir_fini);
477 * Overrides for Emacs so that we follow Linus's tabbing style.
478 * ---------------------------------------------------------------------------