Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+60 −30
Original line number Original line Diff line number Diff line
@@ -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,15 +64,18 @@ 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;


	if (buf[0] & 0x80) {
		int offset = (size == 6) ? 3 : 0;

		/* split rc5 data block ... */
		/* split rc5 data block ... */
		start  = (buf[offset] >> 7) &    1;
		start  = (buf[offset] >> 7) &    1;
		range  = (buf[offset] >> 6) &    1;
		range  = (buf[offset] >> 6) &    1;
@@ -81,7 +85,8 @@ static int get_key_haup_common(struct IR_i2c *ir, enum rc_type *protocol,


		/* rc5 has two start bits
		/* rc5 has two start bits
		 * the first bit must be one
		 * the first bit must be one
	 * the second bit defines the command range (1 = 0-63, 0 = 64 - 127)
		 * the second bit defines the command range:
		 * 1 = 0-63, 0 = 64 - 127
		 */
		 */
		if (!start)
		if (!start)
			/* no key pressed */
			/* no key pressed */
@@ -101,13 +106,38 @@ static int get_key_haup_common(struct IR_i2c *ir, enum rc_type *protocol,
		*protocol = RC_TYPE_RC5;
		*protocol = RC_TYPE_RC5;
		*scancode = RC_SCANCODE_RC5(dev, code);
		*scancode = RC_SCANCODE_RC5(dev, code);
		*ptoggle = toggle;
		*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 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,
	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)
	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;
	}
	}
+2 −1
Original line number Original line Diff line number Diff line
@@ -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;
+2 −1
Original line number Original line Diff line number Diff line
@@ -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;
+2 −1
Original line number Original line Diff line number Diff line
@@ -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:
+1 −1
Original line number Original line Diff line number Diff line
@@ -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;
Loading