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
85 struct input_dev input;
86 struct ir_input_state ir;
88 struct work_struct work;
89 struct timer_list timer;
91 int (*get_key)(struct IR*, u32*, u32*);
94 /* ----------------------------------------------------------------------- */
95 /* insmod parameters */
98 module_param(debug, int, 0644); /* debug level (0,1,2) */
100 #define DEVNAME "ir-kbd-i2c"
101 #define dprintk(level, fmt, arg...) if (debug >= level) \
102 printk(KERN_DEBUG DEVNAME ": " fmt , ## arg)
104 /* ----------------------------------------------------------------------- */
106 static inline int reverse(int data, int bits)
110 for (c=0,i=0; i<bits; i++) {
111 c |= (((data & (1<<i)) ? 1:0)) << (bits-1-i);
116 static int get_key_haup(struct IR *ir, u32 *ir_key, u32 *ir_raw)
118 unsigned char buf[3];
119 int start, toggle, dev, code;
122 if (3 != i2c_master_recv(&ir->c,buf,3))
125 /* split rc5 data block ... */
126 start = (buf[0] >> 6) & 3;
127 toggle = (buf[0] >> 5) & 1;
129 code = (buf[1] >> 2) & 0x3f;
134 dprintk(1,"ir hauppauge (rc5): s%d t%d dev=%d code=%d\n",
135 start, toggle, dev, code);
139 *ir_raw = (start << 12) | (toggle << 11) | (dev << 6) | code;
143 static int get_key_pixelview(struct IR *ir, u32 *ir_key, u32 *ir_raw)
148 if (1 != i2c_master_recv(&ir->c,&b,1)) {
149 dprintk(1,"read error\n");
157 static int get_key_pv951(struct IR *ir, u32 *ir_key, u32 *ir_raw)
162 if (1 != i2c_master_recv(&ir->c,&b,1)) {
163 dprintk(1,"read error\n");
170 dprintk(2,"key %02x\n", b);
177 static int get_key_knc1(struct IR *ir, u32 *ir_key, u32 *ir_raw)
182 if (1 != i2c_master_recv(&ir->c,&b,1)) {
183 dprintk(1,"read error\n");
187 /* it seems that 0xFE indicates that a button is still hold
188 down, while 0xFF indicates that no button is hold
189 down. 0xFE sequences are sometimes interrupted by 0xFF */
191 dprintk(2,"key %02x\n", b);
205 /* ----------------------------------------------------------------------- */
207 static void ir_key_poll(struct IR *ir)
212 dprintk(2,"ir_poll_key\n");
213 rc = ir->get_key(ir, &ir_key, &ir_raw);
215 dprintk(2,"error\n");
220 ir_input_nokey(&ir->input,&ir->ir);
222 ir_input_keydown(&ir->input,&ir->ir, ir_key, ir_raw);
226 static void ir_timer(unsigned long data)
228 struct IR *ir = (struct IR*)data;
229 schedule_work(&ir->work);
232 static void ir_work(void *data)
234 struct IR *ir = data;
236 mod_timer(&ir->timer, jiffies+HZ/10);
239 /* ----------------------------------------------------------------------- */
241 static int ir_attach(struct i2c_adapter *adap, int addr,
242 unsigned short flags, int kind);
243 static int ir_detach(struct i2c_client *client);
244 static int ir_probe(struct i2c_adapter *adap);
246 static struct i2c_driver driver = {
247 .name = "ir remote kbd driver",
248 .id = I2C_DRIVERID_EXP3, /* FIXME */
249 .flags = I2C_DF_NOTIFY,
250 .attach_adapter = ir_probe,
251 .detach_client = ir_detach,
254 static struct i2c_client client_template =
256 I2C_DEVNAME("unset"),
260 static int ir_attach(struct i2c_adapter *adap, int addr,
261 unsigned short flags, int kind)
263 IR_KEYTAB_TYPE *ir_codes = NULL;
268 if (NULL == (ir = kmalloc(sizeof(struct IR),GFP_KERNEL)))
270 memset(ir,0,sizeof(*ir));
271 ir->c = client_template;
273 i2c_set_clientdata(&ir->c, ir);
274 ir->c.adapter = adap;
280 ir->get_key = get_key_pixelview;
281 ir_type = IR_TYPE_OTHER;
282 ir_codes = ir_codes_empty;
286 ir->get_key = get_key_pv951;
287 ir_type = IR_TYPE_OTHER;
288 ir_codes = ir_codes_pv951;
293 ir->get_key = get_key_haup;
294 ir_type = IR_TYPE_RC5;
295 ir_codes = ir_codes_rc5_tv;
299 ir->get_key = get_key_knc1;
300 ir_type = IR_TYPE_OTHER;
301 ir_codes = ir_codes_empty;
304 /* shouldn't happen */
305 printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n",addr);
310 /* register i2c device */
311 i2c_attach_client(&ir->c);
312 snprintf(ir->c.name, sizeof(ir->c.name), "i2c IR (%s)", name);
313 snprintf(ir->phys, sizeof(ir->phys), "%s/%s/ir0",
314 ir->c.adapter->dev.bus_id,
317 /* init + register input device */
318 ir_input_init(&ir->input,&ir->ir,ir_type,ir_codes);
319 ir->input.id.bustype = BUS_I2C;
320 ir->input.name = ir->c.name;
321 ir->input.phys = ir->phys;
322 input_register_device(&ir->input);
323 printk(DEVNAME ": %s detected at %s\n",ir->input.name,ir->input.phys);
325 /* start polling via eventd */
326 INIT_WORK(&ir->work, ir_work, ir);
327 init_timer(&ir->timer);
328 ir->timer.function = ir_timer;
329 ir->timer.data = (unsigned long)ir;
330 schedule_work(&ir->work);
335 static int ir_detach(struct i2c_client *client)
337 struct IR *ir = i2c_get_clientdata(client);
339 /* kill outstanding polls */
340 del_timer(&ir->timer);
341 flush_scheduled_work();
343 /* unregister devices */
344 input_unregister_device(&ir->input);
345 i2c_detach_client(&ir->c);
352 static int ir_probe(struct i2c_adapter *adap)
355 /* The external IR receiver is at i2c address 0x34 (0x35 for
356 reads). Future Hauppauge cards will have an internal
357 receiver at 0x30 (0x31 for reads). In theory, both can be
358 fitted, and Hauppauge suggest an external overrides an
361 That's why we probe 0x1a (~0x34) first. CB
364 static const int probe[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1};
365 struct i2c_client c; char buf; int i,rc;
367 if (adap->id == (I2C_ALGO_BIT | I2C_HW_B_BT848)) {
368 memset(&c,0,sizeof(c));
370 for (i = 0; -1 != probe[i]; i++) {
372 rc = i2c_master_recv(&c,&buf,1);
373 dprintk(1,"probe 0x%02x @ %s: %s\n",
374 probe[i], adap->name,
375 (1 == rc) ? "yes" : "no");
377 ir_attach(adap,probe[i],0,0);
385 /* ----------------------------------------------------------------------- */
387 MODULE_AUTHOR("Gerd Knorr, Michal Kochanowicz, Christoph Bartelmus, Ulrich Mueller");
388 MODULE_DESCRIPTION("input driver for i2c IR remote controls");
389 MODULE_LICENSE("GPL");
391 static int ir_init(void)
393 i2c_add_driver(&driver);
397 static void ir_fini(void)
399 i2c_del_driver(&driver);
402 module_init(ir_init);
403 module_exit(ir_fini);
406 * Overrides for Emacs so that we follow Linus's tabbing style.
407 * ---------------------------------------------------------------------------