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

Commit 680543c5 authored by Ricardo Cerqueira's avatar Ricardo Cerqueira Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (4038): New cx88 card #50: NPG Tech RealTV



Added support for a new cx88 card, including it's remote

Signed-off-by: default avatarRicardo Cerqueira <v4l@cerqueira.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent d6144028
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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]
+44 −0
Original line number Diff line number Diff line
@@ -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);
+27 −0
Original line number Diff line number Diff line
@@ -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);
+28 −3
Original line number Diff line number Diff line
@@ -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) {
+1 −0
Original line number Diff line number Diff line
@@ -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,
Loading