Commit 581f0d1a authored by Gerd Knorr's avatar Gerd Knorr Committed by Linus Torvalds

[PATCH] v4l: IR input driver update.

This patch updates the ir-kbd-gpio and ir-kbd-i2c drivers.  Nothing major,
just some keytable fixes and support for more hardware.
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 8bb4a936
/* /*
* Copyright (c) 2003 Gerd Knorr * Copyright (c) 2003 Gerd Knorr
* Copyright (c) 2003 Pavel Machek * Copyright (c) 2003 Pavel Machek
...@@ -32,47 +33,45 @@ ...@@ -32,47 +33,45 @@
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
static IR_KEYTAB_TYPE ir_codes_avermedia[IR_KEYTAB_SIZE] = { static IR_KEYTAB_TYPE ir_codes_avermedia[IR_KEYTAB_SIZE] = {
[ 17 ] = KEY_KP0, [ 34 ] = KEY_KP0,
[ 20 ] = KEY_KP1, [ 40 ] = KEY_KP1,
[ 12 ] = KEY_KP2, [ 24 ] = KEY_KP2,
[ 28 ] = KEY_KP3, [ 56 ] = KEY_KP3,
[ 18 ] = KEY_KP4, [ 36 ] = KEY_KP4,
[ 10 ] = KEY_KP5, [ 20 ] = KEY_KP5,
[ 26 ] = KEY_KP6, [ 52 ] = KEY_KP6,
[ 22 ] = KEY_KP7, [ 44 ] = KEY_KP7,
[ 14 ] = KEY_KP8, [ 28 ] = KEY_KP8,
[ 30 ] = KEY_KP9, [ 60 ] = KEY_KP9,
[ 24 ] = KEY_EJECTCD, // Unmarked on my controller [ 48 ] = KEY_EJECTCD, // Unmarked on my controller
[ 0 ] = KEY_POWER, [ 0 ] = KEY_POWER,
[ 9 ] = BTN_LEFT, // DISPLAY/L [ 18 ] = BTN_LEFT, // DISPLAY/L
[ 25 ] = BTN_RIGHT, // LOOP/R [ 50 ] = BTN_RIGHT, // LOOP/R
[ 5 ] = KEY_MUTE, [ 10 ] = KEY_MUTE,
[ 19 ] = KEY_RECORD, [ 38 ] = KEY_RECORD,
[ 11 ] = KEY_PAUSE, [ 22 ] = KEY_PAUSE,
[ 27 ] = KEY_STOP, [ 54 ] = KEY_STOP,
[ 15 ] = KEY_VOLUMEDOWN, [ 30 ] = KEY_VOLUMEDOWN,
[ 31 ] = KEY_VOLUMEUP, [ 62 ] = KEY_VOLUMEUP,
[ 16 ] = KEY_TUNER, // TV/FM [ 32 ] = KEY_TUNER, // TV/FM
[ 8 ] = KEY_CD, [ 16 ] = KEY_CD,
[ 4 ] = KEY_VIDEO, [ 8 ] = KEY_VIDEO,
[ 2 ] = KEY_AUDIO, [ 4 ] = KEY_AUDIO,
[ 6 ] = KEY_ZOOM, // full screen [ 12 ] = KEY_ZOOM, // full screen
[ 1 ] = KEY_INFO, // preview [ 2 ] = KEY_INFO, // preview
[ 21 ] = KEY_SEARCH, // autoscan [ 42 ] = KEY_SEARCH, // autoscan
[ 13 ] = KEY_STOP, // freeze [ 26 ] = KEY_STOP, // freeze
[ 29 ] = KEY_RECORD, // capture [ 58 ] = KEY_RECORD, // capture
[ 3 ] = KEY_PLAY, // unmarked [ 6 ] = KEY_PLAY, // unmarked
[ 23 ] = KEY_RED, // unmarked [ 46 ] = KEY_RED, // unmarked
[ 7 ] = KEY_GREEN, // unmarked [ 14 ] = KEY_GREEN, // unmarked
#if 0 [ 33 ] = KEY_YELLOW, // unmarked
[ 16 ] = KEY_YELLOW, // unmarked [ 17 ] = KEY_CHANNELDOWN,
[ 8 ] = KEY_CHANNELDOWN, [ 49 ] = KEY_CHANNELUP,
[ 24 ] = KEY_CHANNELUP, [ 1 ] = KEY_BLUE, // unmarked
[ 0 ] = KEY_BLUE, // unmarked
#endif
}; };
static IR_KEYTAB_TYPE winfast_codes[IR_KEYTAB_SIZE] = { static IR_KEYTAB_TYPE winfast_codes[IR_KEYTAB_SIZE] = {
...@@ -280,8 +279,9 @@ static int ir_probe(struct device *dev) ...@@ -280,8 +279,9 @@ static int ir_probe(struct device *dev)
case BTTV_AVPHONE98: case BTTV_AVPHONE98:
case BTTV_AVERMEDIA98: case BTTV_AVERMEDIA98:
ir_codes = ir_codes_avermedia; ir_codes = ir_codes_avermedia;
ir->mask_keycode = 0xf80000; ir->mask_keycode = 0xf88000;
ir->mask_keydown = 0x010000; ir->mask_keydown = 0x010000;
ir->polling = 50; // ms
break; break;
case BTTV_PXELVWPLTVPAK: case BTTV_PXELVWPLTVPAK:
...@@ -300,7 +300,7 @@ static int ir_probe(struct device *dev) ...@@ -300,7 +300,7 @@ static int ir_probe(struct device *dev)
case BTTV_WINFAST2000: case BTTV_WINFAST2000:
ir_codes = winfast_codes; ir_codes = winfast_codes;
ir->mask_keycode = 0x8f8; ir->mask_keycode = 0x1f8;
break; break;
case BTTV_MAGICTVIEW061: case BTTV_MAGICTVIEW061:
case BTTV_MAGICTVIEW063: case BTTV_MAGICTVIEW063:
......
...@@ -77,6 +77,56 @@ static IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE] = { ...@@ -77,6 +77,56 @@ static IR_KEYTAB_TYPE ir_codes_pv951[IR_KEYTAB_SIZE] = {
[ 15 ] = KEY_SELECT, // SOURCE [ 15 ] = KEY_SELECT, // SOURCE
[ 10 ] = KEY_KPPLUS, // +100 [ 10 ] = KEY_KPPLUS, // +100
[ 20 ] = KEY_KPEQUAL, // SYNC [ 20 ] = KEY_KPEQUAL, // SYNC
[ 28 ] = KEY_MEDIA, // PC/TV
};
static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
[ 0x3 ] = KEY_POWER,
[ 0x6f ] = KEY_MUTE,
[ 0x10 ] = KEY_BACKSPACE, // Recall
[ 0x11 ] = KEY_KP0,
[ 0x4 ] = KEY_KP1,
[ 0x5 ] = KEY_KP2,
[ 0x6 ] = KEY_KP3,
[ 0x8 ] = KEY_KP4,
[ 0x9 ] = KEY_KP5,
[ 0xa ] = KEY_KP6,
[ 0xc ] = KEY_KP7,
[ 0xd ] = KEY_KP8,
[ 0xe ] = KEY_KP9,
[ 0x12 ] = KEY_KPDOT, // 100+
[ 0x7 ] = KEY_VOLUMEUP,
[ 0xb ] = KEY_VOLUMEDOWN,
[ 0x1a ] = KEY_KPPLUS,
[ 0x18 ] = KEY_KPMINUS,
[ 0x15 ] = KEY_UP,
[ 0x1d ] = KEY_DOWN,
[ 0xf ] = KEY_CHANNELUP,
[ 0x13 ] = KEY_CHANNELDOWN,
[ 0x48 ] = KEY_ZOOM,
[ 0x1b ] = KEY_VIDEO, // Video source
#if 0
[ 0x1f ] = KEY_S, // Snapshot
#endif
[ 0x49 ] = KEY_LANGUAGE, // MTS Select
[ 0x19 ] = KEY_SEARCH, // Auto Scan
[ 0x4b ] = KEY_RECORD,
[ 0x46 ] = KEY_PLAY,
[ 0x45 ] = KEY_PAUSE, // Pause
[ 0x44 ] = KEY_STOP,
#if 0
[ 0x43 ] = KEY_T, // Time Shift
[ 0x47 ] = KEY_Y, // Time Shift OFF
[ 0x4a ] = KEY_O, // TOP
[ 0x17 ] = KEY_F, // SURF CH
#endif
[ 0x40 ] = KEY_FORWARD, // Forward ?
[ 0x42 ] = KEY_REWIND, // Backward ?
}; };
struct IR; struct IR;
...@@ -202,11 +252,33 @@ static int get_key_knc1(struct IR *ir, u32 *ir_key, u32 *ir_raw) ...@@ -202,11 +252,33 @@ static int get_key_knc1(struct IR *ir, u32 *ir_key, u32 *ir_raw)
return 1; return 1;
} }
static int get_key_purpletv(struct IR *ir, u32 *ir_key, u32 *ir_raw)
{
unsigned char b;
/* poll IR chip */
if (1 != i2c_master_recv(&ir->c,&b,1)) {
dprintk(1,"read error\n");
return -EIO;
}
/* no button press */
if (b==0)
return 0;
/* repeating */
if (b & 0x80)
return 1;
*ir_key = b;
*ir_raw = b;
return 1;
}
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
static void ir_key_poll(struct IR *ir) static void ir_key_poll(struct IR *ir)
{ {
u32 ir_key, ir_raw; static u32 ir_key, ir_raw;
int rc; int rc;
dprintk(2,"ir_poll_key\n"); dprintk(2,"ir_poll_key\n");
...@@ -300,6 +372,12 @@ static int ir_attach(struct i2c_adapter *adap, int addr, ...@@ -300,6 +372,12 @@ static int ir_attach(struct i2c_adapter *adap, int addr,
ir_type = IR_TYPE_OTHER; ir_type = IR_TYPE_OTHER;
ir_codes = ir_codes_empty; ir_codes = ir_codes_empty;
break; break;
case 0x7a:
name = "Purple TV";
ir->get_key = get_key_purpletv;
ir_type = IR_TYPE_OTHER;
ir_codes = ir_codes_purpletv;
break;
default: default:
/* shouldn't happen */ /* shouldn't happen */
printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n",addr); printk(DEVNAME ": Huh? unknown i2c address (0x%02x)?\n",addr);
...@@ -320,7 +398,8 @@ static int ir_attach(struct i2c_adapter *adap, int addr, ...@@ -320,7 +398,8 @@ static int ir_attach(struct i2c_adapter *adap, int addr,
ir->input.name = ir->c.name; ir->input.name = ir->c.name;
ir->input.phys = ir->phys; ir->input.phys = ir->phys;
input_register_device(&ir->input); input_register_device(&ir->input);
printk(DEVNAME ": %s detected at %s\n",ir->input.name,ir->input.phys); printk(DEVNAME ": %s detected at %s [%s]\n",
ir->input.name,ir->input.phys,adap->name);
/* start polling via eventd */ /* start polling via eventd */
INIT_WORK(&ir->work, ir_work, ir); INIT_WORK(&ir->work, ir_work, ir);
...@@ -361,22 +440,33 @@ static int ir_probe(struct i2c_adapter *adap) ...@@ -361,22 +440,33 @@ static int ir_probe(struct i2c_adapter *adap)
That's why we probe 0x1a (~0x34) first. CB That's why we probe 0x1a (~0x34) first. CB
*/ */
static const int probe[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1}; static const int probe_bttv[] = { 0x1a, 0x18, 0x4b, 0x64, 0x30, -1};
static const int probe_saa7134[] = { 0x7a, -1};
const int *probe = NULL;
struct i2c_client c; char buf; int i,rc; struct i2c_client c; char buf; int i,rc;
if (adap->id == (I2C_ALGO_BIT | I2C_HW_B_BT848)) { switch (adap->id) {
memset(&c,0,sizeof(c)); case I2C_ALGO_BIT | I2C_HW_B_BT848:
c.adapter = adap; probe = probe_bttv;
for (i = 0; -1 != probe[i]; i++) { break;
c.addr = probe[i]; case I2C_ALGO_SAA7134:
rc = i2c_master_recv(&c,&buf,1); probe = probe_saa7134;
dprintk(1,"probe 0x%02x @ %s: %s\n", break;
probe[i], adap->name, }
(1 == rc) ? "yes" : "no"); if (NULL == probe)
if (1 == rc) { return 0;
ir_attach(adap,probe[i],0,0);
break; memset(&c,0,sizeof(c));
} c.adapter = adap;
for (i = 0; -1 != probe[i]; i++) {
c.addr = probe[i];
rc = i2c_master_recv(&c,&buf,1);
dprintk(1,"probe 0x%02x @ %s: %s\n",
probe[i], adap->name,
(1 == rc) ? "yes" : "no");
if (1 == rc) {
ir_attach(adap,probe[i],0,0);
break;
} }
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment