V4L/DVB (4038): New cx88 card #50: NPG Tech RealTV
Ricardo Cerqueira [Mon, 22 May 2006 10:44:02 +0000 (07:44 -0300)]
Added support for a new cx88 card, including it's remote

Signed-off-by: Ricardo Cerqueira <v4l@cerqueira.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>

Documentation/video4linux/CARDLIST.cx88
drivers/media/common/ir-keymaps.c
drivers/media/video/cx88/cx88-cards.c
drivers/media/video/cx88/cx88-input.c
drivers/media/video/cx88/cx88.h
include/media/ir-common.h

index 249885c..f6b0936 100644 (file)
@@ -48,3 +48,4 @@
  47 -> pcHDTV HD5500 HDTV                                  [7063:5500]
  48 -> Kworld MCE 200 Deluxe                               [17de:0841]
  49 -> PixelView PlayTV P7000                              [1554:4813]
+ 50 -> NPG Tech Real TV                                    [14f1:0842]
index 8f4a067..b655d87 100644 (file)
@@ -1412,3 +1412,47 @@ IR_KEYTAB_TYPE ir_codes_hauppauge_new[IR_KEYTAB_SIZE] = {
 };
 
 EXPORT_SYMBOL_GPL(ir_codes_hauppauge_new);
+
+IR_KEYTAB_TYPE ir_codes_npgtech[IR_KEYTAB_SIZE] = {
+       [ 0x1d ] = KEY_SWITCHVIDEOMODE, /* switch inputs */
+       [ 0x2a ] = KEY_FRONT,
+
+       [ 0x3e ] = KEY_1,
+       [ 0x02 ] = KEY_2,
+       [ 0x06 ] = KEY_3,
+       [ 0x0a ] = KEY_4,
+       [ 0x0e ] = KEY_5,
+       [ 0x12 ] = KEY_6,
+       [ 0x16 ] = KEY_7,
+       [ 0x1a ] = KEY_8,
+       [ 0x1e ] = KEY_9,
+       [ 0x3a ] = KEY_0,
+       [ 0x22 ] = KEY_NUMLOCK,         /* -/-- */
+       [ 0x20 ] = KEY_REFRESH,
+
+       [ 0x03 ] = KEY_BRIGHTNESSDOWN,
+       [ 0x28 ] = KEY_AUDIO,
+       [ 0x3c ] = KEY_UP,
+       [ 0x3f ] = KEY_LEFT,
+       [ 0x2e ] = KEY_MUTE,
+       [ 0x3b ] = KEY_RIGHT,
+       [ 0x00 ] = KEY_DOWN,
+       [ 0x07 ] = KEY_BRIGHTNESSUP,
+       [ 0x2c ] = KEY_TEXT,
+
+       [ 0x37 ] = KEY_RECORD,
+       [ 0x17 ] = KEY_PLAY,
+       [ 0x13 ] = KEY_PAUSE,
+       [ 0x26 ] = KEY_STOP,
+       [ 0x18 ] = KEY_FASTFORWARD,
+       [ 0x14 ] = KEY_REWIND,
+       [ 0x33 ] = KEY_ZOOM,
+       [ 0x32 ] = KEY_KEYBOARD,
+       [ 0x30 ] = KEY_GOTO,            /* Pointing arrow */
+       [ 0x36 ] = KEY_MACRO,           /* Maximize/Minimize (yellow) */
+       [ 0x0b ] = KEY_RADIO,
+       [ 0x10 ] = KEY_POWER,
+
+};
+
+EXPORT_SYMBOL_GPL(ir_codes_npgtech);
index 16cd643..04ef1cc 100644 (file)
@@ -1148,6 +1148,29 @@ struct cx88_board cx88_boards[] = {
                }},
                .blackbird = 1,
        },
+       [CX88_BOARD_NPGTECH_REALTV] = {
+               .name           = "NPG Tech Real TV",
+               .tuner_type     = TUNER_LG_PAL_NEW_TAPC,
+               .radio_type     = UNSET,
+               .tuner_addr     = ADDR_UNSET,
+               .radio_addr     = ADDR_UNSET,
+               .input          = {{
+                       .type   = CX88_VMUX_TELEVISION,
+                       .vmux   = 0,
+                       .gpio0  = 0x0788,
+               },{
+                       .type   = CX88_VMUX_COMPOSITE1,
+                       .vmux   = 1,
+                       .gpio0  = 0x078b,
+               },{
+                       .type   = CX88_VMUX_SVIDEO,
+                       .vmux   = 2,
+               }},
+               .radio = {
+                        .type  = CX88_RADIO,
+                        .gpio0 = 0x074a,
+               },
+       },
 };
 const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards);
 
@@ -1381,6 +1404,10 @@ struct cx88_subid cx88_subids[] = {
                .subvendor = 0x1554,
                .subdevice = 0x4813,
                .card      = CX88_BOARD_PIXELVIEW_PLAYTV_P7000,
+       },{
+               .subvendor = 0x14f1,
+               .subdevice = 0x0842,
+               .card      = CX88_BOARD_NPGTECH_REALTV,
        },
 };
 const unsigned int cx88_idcount = ARRAY_SIZE(cx88_subids);
index 78a63b7..4bd86c4 100644 (file)
@@ -70,14 +70,33 @@ MODULE_PARM_DESC(ir_debug, "enable debug messages [IR]");
 static void cx88_ir_handle_key(struct cx88_IR *ir)
 {
        struct cx88_core *core = ir->core;
-       u32 gpio, data;
+       u32 gpio, data, auxgpio;
 
        /* read gpio value */
        gpio = cx_read(ir->gpio_addr);
+       if (core->board == CX88_BOARD_NPGTECH_REALTV) {
+               /* This board apparently uses a combination of 2 GPIO
+                  to represent the keys. Additionally, the second GPIO
+                  can be used for parity.
+
+                  Example:
+
+                  for key "5"
+                       gpio = 0x758, auxgpio = 0xe5 or 0xf5
+                  for key "Power"
+                       gpio = 0x758, auxgpio = 0xed or 0xfd
+                */
+
+               auxgpio = cx_read(MO_GP1_IO);
+               /* Take out the parity part */
+               gpio+=(auxgpio & 0xef);
+       } else
+               auxgpio = gpio;
+
        if (ir->polling) {
-               if (ir->last_gpio == gpio)
+               if (ir->last_gpio == auxgpio)
                        return;
-               ir->last_gpio = gpio;
+               ir->last_gpio = auxgpio;
        }
 
        /* extract data */
@@ -228,6 +247,12 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
                ir_type = IR_TYPE_PD;
                ir->sampling = 0xff00; /* address */
                break;
+       case CX88_BOARD_NPGTECH_REALTV:
+               ir_codes = ir_codes_npgtech;
+               ir->gpio_addr = MO_GP0_IO;
+               ir->mask_keycode = 0xfa;
+               ir->polling = 50; /* ms */
+               break;
        }
 
        if (NULL == ir_codes) {
index 663def4..5df6e41 100644 (file)
@@ -192,6 +192,7 @@ extern struct sram_channel cx88_sram_channels[];
 #define CX88_BOARD_PCHDTV_HD5500           47
 #define CX88_BOARD_KWORLD_MCE200_DELUXE    48
 #define CX88_BOARD_PIXELVIEW_PLAYTV_P7000  49
+#define CX88_BOARD_NPGTECH_REALTV  50
 
 enum cx88_itype {
        CX88_VMUX_COMPOSITE1 = 1,
index f0beace..7bab09b 100644 (file)
@@ -89,6 +89,7 @@ extern IR_KEYTAB_TYPE ir_codes_rc5_tv[IR_KEYTAB_SIZE];
 extern IR_KEYTAB_TYPE ir_codes_winfast[IR_KEYTAB_SIZE];
 extern IR_KEYTAB_TYPE ir_codes_pinnacle_color[IR_KEYTAB_SIZE];
 extern IR_KEYTAB_TYPE ir_codes_hauppauge_new[IR_KEYTAB_SIZE];
+extern IR_KEYTAB_TYPE ir_codes_npgtech[IR_KEYTAB_SIZE];
 
 #endif