2 * keyboard input driver for i2c IR remote controls
4 * Copyright (c) 2000-2003 Gerd Knorr <kraxel@bytesex.org>
5 * modified for PixelView (BT878P+W/FM) by
6 * Michal Kochanowicz <mkochano@pld.org.pl>
7 * Christoph Bartelmus <lirc@bartelmus.de>
8 * modified for KNC ONE TV Station/Anubis Typhoon TView Tuner by
9 * Ulrich Mueller <ulrich.mueller42@web.de>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include <linux/module.h>
28 #include <linux/moduleparam.h>
29 #include <linux/init.h>
30 #include <linux/kernel.h>
31 #include <linux/sched.h>
32 #include <linux/string.h>
33 #include <linux/timer.h>
34 #include <linux/delay.h>
35 #include <linux/errno.h>
36 #include <linux/slab.h>
37 #include <linux/i2c.h>
38 #include <linux/workqueue.h>
40 #include <asm/semaphore.h>
42 #include <media/ir-common.h>
44 /* Mark Phalan <phalanm@o2.ie> */
45 static IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE] = {
59 [ 31 ] = KEY_VOLUMEDOWN,
60 [ 27 ] = KEY_VOLUMEUP,
61 [ 26 ] = KEY_CHANNELUP,
62 [ 30 ] = KEY_CHANNELDOWN,
64 [ 29 ] = KEY_PAGEDOWN,
67 [ 24 ] = KEY_KPPLUSMINUS, // CH +/-
68 [ 22 ] = KEY_SUBTITLE, // CC
69 [ 13 ] = KEY_TEXT, // TTX
70 [ 11 ] = KEY_TV, // AIR/CBL
71 [ 17 ] = KEY_PC, // PC/TV
72 [ 23 ] = KEY_OK, // CH RTN
73 [ 25 ] = KEY_MODE, // FUNC
74 [ 12 ] = KEY_SEARCH, // AUTOSCAN
76 /* Not sure what to do with these ones! */
77 [ 15 ] = KEY_SELECT, // SOURCE
78 [ 10 ] = KEY_KPPLUS, // +100
79 [ 20 ] = KEY_KPEQUAL, // SYNC
80 [ 28 ] = KEY_MEDIA, // PC/TV
83 static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
86 [ 0x10 ] = KEY_BACKSPACE, // Recall
98 [ 0x12 ] = KEY_KPDOT, // 100+
100 [ 0x7 ] = KEY_VOLUMEUP,
101 [ 0xb ] = KEY_VOLUMEDOWN,
102 [ 0x1a ] = KEY_KPPLUS,
103 [ 0x18 ] = KEY_KPMINUS,
106 [ 0xf ] = KEY_CHANNELUP,
107 [ 0x13 ] = KEY_CHANNELDOWN,
110 [ 0x1b ] = KEY_VIDEO, // Video source
112 [ 0x1f ] = KEY_S, // Snapshot
114 [ 0x49 ] = KEY_LANGUAGE, // MTS Select
115 [ 0x19 ] = KEY_SEARCH, // Auto Scan
117 [ 0x4b ] = KEY_RECORD,
119 [ 0x45 ] = KEY_PAUSE, // Pause
122 [ 0x43 ] = KEY_T, // Time Shift
123 [ 0x47 ] = KEY_Y, // Time Shift OFF
124 [ 0x4a ] = KEY_O, // TOP
125 [ 0x17 ] = KEY_F, // SURF CH
127 [ 0x40 ] = KEY_FORWARD, // Forward ?
128 [ 0x42 ] = KEY_REWIND, // Backward ?
135 struct input_dev input;
136 struct ir_input_state ir;
138 struct work_struct work;
139 struct timer_list timer;
141 int (*get_key)(struct IR*, u32*, u32*);
144 /* ----------------------------------------------------------------------- */
145 /* insmod parameters */
148 module_param(debug, int, 0644); /* debug level (0,1,2) */
150 #define DEVNAME "ir-kbd-i2c"
151 #define dprintk(level, fmt, arg...) if (debug >= level) \
152 printk(KERN_DEBUG DEVNAME ": " fmt , ## arg)
154 /* ----------------------------------------------------------------------- */
156 static inline int reverse(int data, int bits)
160 for (c=0,i=0; i<bits; i++) {
161 c |= (((data & (1<<i)) ? 1:0)) << (bits-1-i);
166 static int get_key_haup(struct IR *ir, u32 *ir_key, u32 *ir_raw)
168 unsigned char buf[3];
169 int start, toggle, dev, code;
172 if (3 != i2c_master_recv(&ir->c,buf,3))
175 /* split rc5 data block ... */
176 start = (buf[0] >> 6) & 3;
177 toggle = (buf[0] >> 5) & 1;
179 code = (buf[1] >> 2) & 0x3f;
184 dprintk(1,"ir hauppauge (rc5): s%d t%d dev=%d code=%d\n",
185 start, toggle, dev, code);
189 *ir_raw = (start << 12) | (toggle << 11) | (dev << 6) | code;
193 static int get_key_pixelview(struct IR *ir, u32 *ir_key, u32 *ir_raw)
198 if (1 != i2c_master_recv(&ir->c,&b,1)) {
199 dprintk(1,"read error\n");
207 static int get_key_pv951(struct IR *ir, u32 *ir_key, u32 *ir_raw)
212 if (1 != i2c_master_recv(&ir->c,&b,1)) {
213 dprintk(1,"read error\n");
220 dprintk(2,"key %02x\n", b);
227 static int get_key_knc1(struct IR *ir, u32 *ir_key, u32 *ir_raw)
232 if (1 != i2c_master_recv(&ir->c,&b,1)) {
233 dprintk(1,"read error\n");
237 /* it seems that 0xFE indicates that a button is still hold
238 down, while 0xFF indicates that no button is hold
239 down. 0xFE sequences are sometimes interrupted by 0xFF */
241 dprintk(2,"key %02x\n", b);
255 static int get_key_purpletv(struct IR *ir, u32 *ir_key, u32 *ir_raw)
260 if (1 != i2c_master_recv(&ir->c,&b,1)) {
261 dprintk(1,"read error\n");
265 /* no button press */
277 /* ----------------------------------------------------------------------- */
279 static void ir_key_poll(struct IR *ir)
281 static u32 ir_key, ir_raw;
284 dprintk(2,"ir_poll_key\n");
285 rc = ir->get_key(ir, &ir_key, &ir_raw);
287 dprintk(2,"error\n");
292 ir_input_nokey(&ir->input,&ir->ir);
294 ir_input_keydown(&ir->input,&ir->ir, ir_key, ir_raw);
298 static void ir_timer(unsigned long data)
300 struct IR *ir = (struct IR*)data;
301 schedule_work(&ir->work);
304 static void ir_work(void *data)
306 struct IR *ir = data;
308 mod_timer(&ir->timer, jiffies+HZ/10);
311 /* ----------------------------------------------------------------------- */
313 static int ir_attach(struct i2c_adapter *adap, int addr,
314 unsigned short flags, int kind);
315 static int ir_detach(struct i2c_client *client);
316 static int ir_probe(struct i2c_adapter *adap);
318 static struct i2c_driver driver = {
319 .name = "ir remote kbd driver",
320 .id = I2C_DRIVERID_EXP3, /* FIXME */
321 .flags = I2C_DF_NOTIFY,
322 .attach_adapter = ir_probe,
323 .detach_client = ir_detach,
326 static struct i2c_client client_template =
328 I2C_DEVNAME("unset"),
332 static int ir_attach(struct i2c_adapter *adap, int addr,
333 unsigned short flags, int kind)
335 IR_KEYTAB_TYPE *ir_codes = NULL;
340 if (NULL == (ir = kmalloc(sizeof(struct IR),GFP_KERNEL)))
342 memset(ir,0,sizeof(*ir));
343 ir->c = client_template;
345 i2c_set_clientdata(&ir->c, ir);
346 ir->c.adapter = adap;
352 ir->get_key = get_key_pixelview;
353 ir_type = IR_TYPE_OTHER;
354 ir_codes = ir_codes_empty;
358 ir->get_key = get_key_pv951;
359 ir_type = IR_TYPE_OTHER;
360 ir_codes = ir_codes_pv951;
365 ir->get_key = get_key_haup;
366 ir_type = IR_TYPE_RC5;
367 ir_codes = ir_codes_rc5_tv;
371 ir->get_key = get_key_knc1;
372 ir_type = IR_TYPE_OTHER;
373 ir_codes = ir_codes_empty;
377 ir->get_key = get_key_purpletv;
378 ir_type = IR_TYPE_OTHER;
379 ir_codes = ir_codes_purpletv;
382 /* shouldn't happen */
383 printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n",addr);
388 /* register i2c device */
389 i2c_attach_client(&ir->c);
390 snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (%s)", name);
391 snprintf(ir->phys, sizeof(ir->phys), "%s/%s/ir0",
392 ir->c.adapter->dev.bus_id,
395 /* init + register input device */
396 ir_input_init(&ir->input,&ir->ir,ir_type,ir_codes);
397 ir->input.id.bustype = BUS_I2C;
398 ir->input.name = ir->c.name;
399 ir->input.phys = ir->phys;
400 input_register_device(&ir->input);
401 printk(DEVNAME ": %s detected at %s [%s]\n",
402 ir->input.name,ir->input.phys,adap->name);
404 /* start polling via eventd */
405 INIT_WORK(&ir->work, ir_work, ir);
406 init_timer(&ir->timer);
407 ir->timer.function = ir_timer;
408 ir->timer.data = (unsigned long)ir;
409 schedule_work(&ir->work);
414 static int ir_detach(struct i2c_client *client)
416 struct IR *ir = i2c_get_clientdata(client);
418 /* kill outstanding polls */
419 del_timer(&ir->timer);
420 flush_scheduled_work();
422 /* unregister devices */
423 input_unregister_device(&ir->input);
424 i2c_detach_client(&ir->c);
431 static int ir_probe(struct i2c_adapter *adap)
434 /* The external IR receiver is at i2c address 0x34 (0x35 for
435 reads). Future Hauppauge cards will have an internal
436 receiver at 0x30 (0x31 for reads). In theory, both can be
437 fitted, and Hauppauge suggest an external overrides an
440 That's why we probe 0x1a (~0x34) first. CB
443 static const int probe_bttv[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1};
444 static const int probe_saa7134[] = { 0x7a, -1};
445 const int *probe = NULL;
446 struct i2c_client c; char buf; int i,rc;
449 case I2C_ALGO_BIT | I2C_HW_B_BT848:
452 case I2C_ALGO_SAA7134:
453 probe = probe_saa7134;
459 memset(&c,0,sizeof(c));
461 for (i = 0; -1 != probe[i]; i++) {
463 rc = i2c_master_recv(&c,&buf,1);
464 dprintk(1,"probe 0x%02x @ %s: %s\n",
465 probe[i], adap->name,
466 (1 == rc) ? "yes" : "no");
468 ir_attach(adap,probe[i],0,0);
475 /* ----------------------------------------------------------------------- */
477 MODULE_AUTHOR("Gerd Knorr, Michal Kochanowicz, Christoph Bartelmus, Ulrich Mueller");
478 MODULE_DESCRIPTION("input driver for i2c IR remote controls");
479 MODULE_LICENSE("GPL");
481 static int ir_init(void)
483 i2c_add_driver(&driver);
487 static void ir_fini(void)
489 i2c_del_driver(&driver);
492 module_init(ir_init);
493 module_exit(ir_fini);
496 * Overrides for Emacs so that we follow Linus's tabbing style.
497 * ---------------------------------------------------------------------------