Commit b779974b authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

V4L/DVB (13575): em28xx: Use the complete address/command RC5 code for WinTV USB2

This device uses an i2c chip to retrieve the keycode from a RC5 remote.
Instead of just getting 6 bits, improve the routine to get 11 bits.

This means that the complete RC5 table for Hauppauge Grey IR can be used
with this device.

Unfortunately, it seems that this IR receiver is not capable of getting
the full 14 (or 13 bits) from the RC5 protocol.

At lest now, with the new code, it is possible to replace this IR table
by another RC5 table.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent b33f5f8a
...@@ -2285,7 +2285,7 @@ void em28xx_register_i2c_ir(struct em28xx *dev) ...@@ -2285,7 +2285,7 @@ void em28xx_register_i2c_ir(struct em28xx *dev)
dev->init_data.name = "i2c IR (EM28XX Pinnacle PCTV)"; dev->init_data.name = "i2c IR (EM28XX Pinnacle PCTV)";
break; break;
case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2: case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
dev->init_data.ir_codes = &ir_codes_hauppauge_new_table; dev->init_data.ir_codes = &ir_codes_rc5_hauppauge_new_table;
dev->init_data.get_key = em28xx_get_key_em_haup; dev->init_data.get_key = em28xx_get_key_em_haup;
dev->init_data.name = "i2c IR (EM2840 Hauppauge)"; dev->init_data.name = "i2c IR (EM2840 Hauppauge)";
break; break;
......
...@@ -112,10 +112,13 @@ int em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) ...@@ -112,10 +112,13 @@ int em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
int em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) int em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
{ {
unsigned char buf[2]; unsigned char buf[2];
unsigned char code; u16 code;
int size;
/* poll IR chip */ /* poll IR chip */
if (2 != i2c_master_recv(ir->c, buf, 2)) size = i2c_master_recv(ir->c, buf, sizeof(buf));
if (size != 2)
return -EIO; return -EIO;
/* Does eliminate repeated parity code */ /* Does eliminate repeated parity code */
...@@ -124,16 +127,30 @@ int em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) ...@@ -124,16 +127,30 @@ int em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
ir->old = buf[1]; ir->old = buf[1];
/* Rearranges bits to the right order */ /*
code = ((buf[0]&0x01)<<5) | /* 0010 0000 */ * Rearranges bits to the right order.
((buf[0]&0x02)<<3) | /* 0001 0000 */ * The bit order were determined experimentally by using
((buf[0]&0x04)<<1) | /* 0000 1000 */ * The original Hauppauge Grey IR and another RC5 that uses addr=0x08
((buf[0]&0x08)>>1) | /* 0000 0100 */ * The RC5 code has 14 bits, but we've experimentally determined
((buf[0]&0x10)>>3) | /* 0000 0010 */ * the meaning for only 11 bits.
((buf[0]&0x20)>>5); /* 0000 0001 */ * So, the code translation is not complete. Yet, it is enough to
* work with the provided RC5 IR.
i2cdprintk("ir hauppauge (em2840): code=0x%02x (rcv=0x%02x)\n", */
code, buf[0]); code =
((buf[0] & 0x01) ? 0x0020 : 0) | /* 0010 0000 */
((buf[0] & 0x02) ? 0x0010 : 0) | /* 0001 0000 */
((buf[0] & 0x04) ? 0x0008 : 0) | /* 0000 1000 */
((buf[0] & 0x08) ? 0x0004 : 0) | /* 0000 0100 */
((buf[0] & 0x10) ? 0x0002 : 0) | /* 0000 0010 */
((buf[0] & 0x20) ? 0x0001 : 0) | /* 0000 0001 */
((buf[1] & 0x08) ? 0x1000 : 0) | /* 0001 0000 */
((buf[1] & 0x10) ? 0x0800 : 0) | /* 0000 1000 */
((buf[1] & 0x20) ? 0x0400 : 0) | /* 0000 0100 */
((buf[1] & 0x40) ? 0x0200 : 0) | /* 0000 0010 */
((buf[1] & 0x80) ? 0x0100 : 0); /* 0000 0001 */
i2cdprintk("ir hauppauge (em2840): code=0x%02x (rcv=0x%02x%02x)\n",
code, buf[1], buf[0]);
/* return key */ /* return key */
*ir_key = code; *ir_key = code;
......
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