Commit 00bb8207 authored by Sean Young's avatar Sean Young Committed by Mauro Carvalho Chehab

[media] rc: Hauppauge z8f0811 can decode RC6

The hardware does not decode the 16, 20 or 24 bit variety.
Signed-off-by: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent e998c92d
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
* *
*/ */
#include <asm/unaligned.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -63,51 +64,80 @@ module_param(debug, int, 0644); /* debug level (0,1,2) */ ...@@ -63,51 +64,80 @@ module_param(debug, int, 0644); /* debug level (0,1,2) */
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
static int get_key_haup_common(struct IR_i2c *ir, enum rc_type *protocol, static int get_key_haup_common(struct IR_i2c *ir, enum rc_type *protocol,
u32 *scancode, u8 *ptoggle, int size, int offset) u32 *scancode, u8 *ptoggle, int size)
{ {
unsigned char buf[6]; unsigned char buf[6];
int start, range, toggle, dev, code, ircode; int start, range, toggle, dev, code, ircode, vendor;
/* poll IR chip */ /* poll IR chip */
if (size != i2c_master_recv(ir->c, buf, size)) if (size != i2c_master_recv(ir->c, buf, size))
return -EIO; return -EIO;
/* split rc5 data block ... */ if (buf[0] & 0x80) {
start = (buf[offset] >> 7) & 1; int offset = (size == 6) ? 3 : 0;
range = (buf[offset] >> 6) & 1;
toggle = (buf[offset] >> 5) & 1;
dev = buf[offset] & 0x1f;
code = (buf[offset+1] >> 2) & 0x3f;
/* rc5 has two start bits /* split rc5 data block ... */
* the first bit must be one start = (buf[offset] >> 7) & 1;
* the second bit defines the command range (1 = 0-63, 0 = 64 - 127) range = (buf[offset] >> 6) & 1;
*/ toggle = (buf[offset] >> 5) & 1;
if (!start) dev = buf[offset] & 0x1f;
/* no key pressed */ code = (buf[offset+1] >> 2) & 0x3f;
return 0;
/* filter out invalid key presses */ /* rc5 has two start bits
ircode = (start << 12) | (toggle << 11) | (dev << 6) | code; * the first bit must be one
if ((ircode & 0x1fff) == 0x1fff) * the second bit defines the command range:
return 0; * 1 = 0-63, 0 = 64 - 127
*/
if (!start)
/* no key pressed */
return 0;
if (!range) /* filter out invalid key presses */
code += 64; ircode = (start << 12) | (toggle << 11) | (dev << 6) | code;
if ((ircode & 0x1fff) == 0x1fff)
return 0;
dprintk(1,"ir hauppauge (rc5): s%d r%d t%d dev=%d code=%d\n", if (!range)
start, range, toggle, dev, code); code += 64;
*protocol = RC_TYPE_RC5; dprintk(1, "ir hauppauge (rc5): s%d r%d t%d dev=%d code=%d\n",
*scancode = RC_SCANCODE_RC5(dev, code); start, range, toggle, dev, code);
*ptoggle = toggle;
return 1; *protocol = RC_TYPE_RC5;
*scancode = RC_SCANCODE_RC5(dev, code);
*ptoggle = toggle;
return 1;
} else if (size == 6 && (buf[0] & 0x40)) {
code = buf[4];
dev = buf[3];
vendor = get_unaligned_be16(buf + 1);
if (vendor == 0x800f) {
*ptoggle = (dev & 0x80) != 0;
*protocol = RC_TYPE_RC6_MCE;
dev &= 0x7f;
dprintk(1, "ir hauppauge (rc6-mce): t%d vendor=%d dev=%d code=%d\n",
toggle, vendor, dev, code);
} else {
*ptoggle = 0;
*protocol = RC_TYPE_RC6_6A_32;
dprintk(1, "ir hauppauge (rc6-6a-32): vendor=%d dev=%d code=%d\n",
vendor, dev, code);
}
*scancode = RC_SCANCODE_RC6_6A(vendor, dev, code);
return 1;
}
return 0;
} }
static int get_key_haup(struct IR_i2c *ir, enum rc_type *protocol, static int get_key_haup(struct IR_i2c *ir, enum rc_type *protocol,
u32 *scancode, u8 *toggle) u32 *scancode, u8 *toggle)
{ {
return get_key_haup_common (ir, protocol, scancode, toggle, 3, 0); return get_key_haup_common(ir, protocol, scancode, toggle, 3);
} }
static int get_key_haup_xvr(struct IR_i2c *ir, enum rc_type *protocol, static int get_key_haup_xvr(struct IR_i2c *ir, enum rc_type *protocol,
...@@ -126,7 +156,7 @@ static int get_key_haup_xvr(struct IR_i2c *ir, enum rc_type *protocol, ...@@ -126,7 +156,7 @@ static int get_key_haup_xvr(struct IR_i2c *ir, enum rc_type *protocol,
if (ret != 1) if (ret != 1)
return (ret < 0) ? ret : -EINVAL; return (ret < 0) ? ret : -EINVAL;
return get_key_haup_common(ir, protocol, scancode, toggle, 6, 3); return get_key_haup_common(ir, protocol, scancode, toggle, 6);
} }
static int get_key_pixelview(struct IR_i2c *ir, enum rc_type *protocol, static int get_key_pixelview(struct IR_i2c *ir, enum rc_type *protocol,
...@@ -347,7 +377,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -347,7 +377,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
case 0x71: case 0x71:
name = "Hauppauge/Zilog Z8"; name = "Hauppauge/Zilog Z8";
ir->get_key = get_key_haup_xvr; ir->get_key = get_key_haup_xvr;
rc_type = RC_BIT_RC5; rc_type = RC_BIT_RC5 | RC_BIT_RC6_MCE | RC_BIT_RC6_6A_32;
ir_codes = RC_MAP_HAUPPAUGE; ir_codes = RC_MAP_HAUPPAUGE;
break; break;
} }
......
...@@ -98,7 +98,8 @@ static int cx18_i2c_new_ir(struct cx18 *cx, struct i2c_adapter *adap, u32 hw, ...@@ -98,7 +98,8 @@ static int cx18_i2c_new_ir(struct cx18 *cx, struct i2c_adapter *adap, u32 hw,
case CX18_HW_Z8F0811_IR_RX_HAUP: case CX18_HW_Z8F0811_IR_RX_HAUP:
init_data->ir_codes = RC_MAP_HAUPPAUGE; init_data->ir_codes = RC_MAP_HAUPPAUGE;
init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
init_data->type = RC_BIT_RC5; init_data->type = RC_BIT_RC5 | RC_BIT_RC6_MCE |
RC_BIT_RC6_6A_32;
init_data->name = cx->card_name; init_data->name = cx->card_name;
info.platform_data = init_data; info.platform_data = init_data;
break; break;
......
...@@ -631,7 +631,8 @@ void cx88_i2c_init_ir(struct cx88_core *core) ...@@ -631,7 +631,8 @@ void cx88_i2c_init_ir(struct cx88_core *core)
/* Hauppauge XVR */ /* Hauppauge XVR */
core->init_data.name = "cx88 Hauppauge XVR remote"; core->init_data.name = "cx88 Hauppauge XVR remote";
core->init_data.ir_codes = RC_MAP_HAUPPAUGE; core->init_data.ir_codes = RC_MAP_HAUPPAUGE;
core->init_data.type = RC_BIT_RC5; core->init_data.type = RC_BIT_RC5 | RC_BIT_RC6_MCE |
RC_BIT_RC6_6A_32;
core->init_data.internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; core->init_data.internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
info.platform_data = &core->init_data; info.platform_data = &core->init_data;
......
...@@ -215,7 +215,8 @@ static int ivtv_i2c_new_ir(struct ivtv *itv, u32 hw, const char *type, u8 addr) ...@@ -215,7 +215,8 @@ static int ivtv_i2c_new_ir(struct ivtv *itv, u32 hw, const char *type, u8 addr)
/* Default to grey remote */ /* Default to grey remote */
init_data->ir_codes = RC_MAP_HAUPPAUGE; init_data->ir_codes = RC_MAP_HAUPPAUGE;
init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
init_data->type = RC_BIT_RC5; init_data->type = RC_BIT_RC5 | RC_BIT_RC6_MCE |
RC_BIT_RC6_6A_32;
init_data->name = itv->card_name; init_data->name = itv->card_name;
break; break;
case IVTV_HW_I2C_IR_RX_ADAPTEC: case IVTV_HW_I2C_IR_RX_ADAPTEC:
......
...@@ -55,7 +55,7 @@ struct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev) ...@@ -55,7 +55,7 @@ struct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev)
/* Our default information for ir-kbd-i2c.c to use */ /* Our default information for ir-kbd-i2c.c to use */
init_data->ir_codes = RC_MAP_HAUPPAUGE; init_data->ir_codes = RC_MAP_HAUPPAUGE;
init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
init_data->type = RC_BIT_RC5; init_data->type = RC_BIT_RC5 | RC_BIT_RC6_MCE | RC_BIT_RC6_6A_32;
init_data->name = "HD-PVR"; init_data->name = "HD-PVR";
init_data->polling_interval = 405; /* ms, duplicated from Windows */ init_data->polling_interval = 405; /* ms, duplicated from Windows */
hdpvr_ir_rx_i2c_board_info.platform_data = init_data; hdpvr_ir_rx_i2c_board_info.platform_data = init_data;
......
...@@ -596,7 +596,8 @@ static void pvr2_i2c_register_ir(struct pvr2_hdw *hdw) ...@@ -596,7 +596,8 @@ static void pvr2_i2c_register_ir(struct pvr2_hdw *hdw)
case PVR2_IR_SCHEME_24XXX_MCE: /* 24xxx MCE device */ case PVR2_IR_SCHEME_24XXX_MCE: /* 24xxx MCE device */
init_data->ir_codes = RC_MAP_HAUPPAUGE; init_data->ir_codes = RC_MAP_HAUPPAUGE;
init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
init_data->type = RC_BIT_RC5; init_data->type = RC_BIT_RC5 | RC_BIT_RC6_MCE |
RC_BIT_RC6_6A_32;
init_data->name = hdw->hdw_desc->description; init_data->name = hdw->hdw_desc->description;
/* IR Receiver */ /* IR Receiver */
info.addr = 0x71; info.addr = 0x71;
......
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