V4L/DVB (13575): em28xx: Use the complete address/command RC5 code for WinTV USB2
authorMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 6 Dec 2009 02:24:50 +0000 (23:24 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 16 Dec 2009 02:18:07 +0000 (00:18 -0200)
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: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/em28xx/em28xx-cards.c
drivers/media/video/em28xx/em28xx-input.c

index e7a68e2507de07ad9b2707f2b1933ec7e5805494..25100001ffff838b090794b59cc9df22eb04d7ec 100644 (file)
@@ -2285,7 +2285,7 @@ void em28xx_register_i2c_ir(struct em28xx *dev)
                dev->init_data.name = "i2c IR (EM28XX Pinnacle PCTV)";
                break;
        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.name = "i2c IR (EM2840 Hauppauge)";
                break;
index 3f5cf02f31476d49fbf232f9e7496e4719de3e79..5ddeb421ed586270216817401ea2e31d740606e1 100644 (file)
@@ -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)
 {
        unsigned char buf[2];
-       unsigned char code;
+       u16 code;
+       int size;
 
        /* 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;
 
        /* 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)
 
        ir->old = buf[1];
 
-       /* Rearranges bits to the right order */
-       code =   ((buf[0]&0x01)<<5) | /* 0010 0000 */
-                ((buf[0]&0x02)<<3) | /* 0001 0000 */
-                ((buf[0]&0x04)<<1) | /* 0000 1000 */
-                ((buf[0]&0x08)>>1) | /* 0000 0100 */
-                ((buf[0]&0x10)>>3) | /* 0000 0010 */
-                ((buf[0]&0x20)>>5);  /* 0000 0001 */
-
-       i2cdprintk("ir hauppauge (em2840): code=0x%02x (rcv=0x%02x)\n",
-                       code, buf[0]);
+       /*
+        * Rearranges bits to the right order.
+        * The bit order were determined experimentally by using
+        * The original Hauppauge Grey IR and another RC5 that uses addr=0x08
+        * The RC5 code has 14 bits, but we've experimentally determined
+        * the meaning for only 11 bits.
+        * So, the code translation is not complete. Yet, it is enough to
+        * work with the provided RC5 IR.
+        */
+       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 */
        *ir_key = code;