V4L/DVB (8628): bttv: Add support for Encore ENLTV2-FM
Thanks to Sistema Fenix (http://www.sistemafenix.com.br/) and CDI Brasil (www.cdibrasil.com.br/) for sponsoring this development. Signed-off-by: Gilberto <gilberto@sistemafenix.com.br> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
08b1438cc2
commit
7d341a6a52
6 changed files with 140 additions and 8 deletions
|
@ -150,3 +150,4 @@
|
|||
149 -> Typhoon TV-Tuner PCI (50684)
|
||||
150 -> Geovision GV-600 [008a:763c]
|
||||
151 -> Kozumi KTV-01C
|
||||
152 -> Encore ENL TV-FM-2 [1000:1801]
|
||||
|
|
|
@ -1792,12 +1792,61 @@ IR_KEYTAB_TYPE ir_codes_encore_enltv[IR_KEYTAB_SIZE] = {
|
|||
[ 0x41 ] = KEY_GREEN, /* AP2 */
|
||||
[ 0x47 ] = KEY_YELLOW, /* AP3 */
|
||||
[ 0x57 ] = KEY_BLUE, /* AP4 */
|
||||
|
||||
|
||||
};
|
||||
|
||||
EXPORT_SYMBOL_GPL(ir_codes_encore_enltv);
|
||||
|
||||
/* Encore ENLTV2-FM - silver plastic - "Wand Media" written at the botton
|
||||
Mauro Carvalho Chehab <mchehab@infradead.org> */
|
||||
IR_KEYTAB_TYPE ir_codes_encore_enltv2[IR_KEYTAB_SIZE] = {
|
||||
[0x4c] = KEY_POWER2,
|
||||
[0x4a] = KEY_TUNER,
|
||||
[0x40] = KEY_1,
|
||||
[0x60] = KEY_2,
|
||||
[0x50] = KEY_3,
|
||||
[0x70] = KEY_4,
|
||||
[0x48] = KEY_5,
|
||||
[0x68] = KEY_6,
|
||||
[0x58] = KEY_7,
|
||||
[0x78] = KEY_8,
|
||||
[0x44] = KEY_9,
|
||||
[0x54] = KEY_0,
|
||||
|
||||
[0x64] = KEY_LAST, /* +100 */
|
||||
[0x4e] = KEY_AGAIN, /* Recall */
|
||||
|
||||
[0x6c] = KEY_SWITCHVIDEOMODE, /* Video Source */
|
||||
[0x5e] = KEY_MENU,
|
||||
[0x56] = KEY_SCREEN,
|
||||
[0x7a] = KEY_SETUP,
|
||||
|
||||
[0x46] = KEY_MUTE,
|
||||
[0x5c] = KEY_MODE, /* Stereo */
|
||||
[0x74] = KEY_INFO,
|
||||
[0x7c] = KEY_CLEAR,
|
||||
|
||||
[0x55] = KEY_UP,
|
||||
[0x49] = KEY_DOWN,
|
||||
[0x7e] = KEY_LEFT,
|
||||
[0x59] = KEY_RIGHT,
|
||||
[0x6a] = KEY_ENTER,
|
||||
|
||||
[0x42] = KEY_VOLUMEUP,
|
||||
[0x62] = KEY_VOLUMEDOWN,
|
||||
[0x52] = KEY_CHANNELUP,
|
||||
[0x72] = KEY_CHANNELDOWN,
|
||||
|
||||
[0x41] = KEY_RECORD,
|
||||
[0x51] = KEY_SHUFFLE, /* Snapshot */
|
||||
[0x75] = KEY_TIME, /* Timeshift */
|
||||
[0x71] = KEY_TV2, /* PIP */
|
||||
|
||||
[0x45] = KEY_REWIND,
|
||||
[0x6f] = KEY_PAUSE,
|
||||
[0x7d] = KEY_FORWARD,
|
||||
[0x79] = KEY_STOP,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(ir_codes_encore_enltv2);
|
||||
|
||||
/* for the Technotrend 1500 bundled remotes (grey and black): */
|
||||
IR_KEYTAB_TYPE ir_codes_tt_1500[IR_KEYTAB_SIZE] = {
|
||||
[ 0x01 ] = KEY_POWER,
|
||||
|
|
|
@ -305,7 +305,7 @@ static struct CARD {
|
|||
{ 0x00261822, BTTV_BOARD_TWINHAN_DST, "DNTV Live! Mini "},
|
||||
{ 0xd200dbc0, BTTV_BOARD_DVICO_FUSIONHDTV_2, "DViCO FusionHDTV 2" },
|
||||
{ 0x763c008a, BTTV_BOARD_GEOVISION_GV600, "GeoVision GV-600" },
|
||||
|
||||
{ 0x18011000, BTTV_BOARD_ENLTV_FM_2, "Encore ENL TV-FM-2" },
|
||||
{ 0, -1, NULL }
|
||||
};
|
||||
|
||||
|
@ -3037,6 +3037,31 @@ struct tvcard bttv_tvcards[] = {
|
|||
.has_radio = 1,
|
||||
.has_remote = 1,
|
||||
},
|
||||
[BTTV_BOARD_ENLTV_FM_2] = {
|
||||
/* Encore TV Tuner Pro ENL TV-FM-2
|
||||
Mauro Carvalho Chehab <mchehab@infradead.org */
|
||||
.name = "Encore ENL TV-FM-2",
|
||||
.video_inputs = 3,
|
||||
.audio_inputs = 1,
|
||||
.tuner = 0,
|
||||
.svhs = 2,
|
||||
/* bit 6 -> IR disabled
|
||||
bit 18/17 = 00 -> mute
|
||||
01 -> enable external audio input
|
||||
10 -> internal audio input (mono?)
|
||||
11 -> internal audio input
|
||||
*/
|
||||
.gpiomask = 0x060040,
|
||||
.muxsel = { 2, 3, 3 },
|
||||
.gpiomux = { 0x60000, 0x60000, 0x20000, 0x20000 },
|
||||
.gpiomute = 0,
|
||||
.tuner_type = TUNER_TCL_MF02GIP_5N,
|
||||
.tuner_addr = ADDR_UNSET,
|
||||
.radio_addr = ADDR_UNSET,
|
||||
.pll = PLL_28,
|
||||
.has_radio = 1,
|
||||
.has_remote = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
|
||||
|
|
|
@ -28,8 +28,8 @@
|
|||
#include "bttvp.h"
|
||||
|
||||
|
||||
static int debug;
|
||||
module_param(debug, int, 0644); /* debug level (0,1,2) */
|
||||
static int ir_debug;
|
||||
module_param(ir_debug, int, 0644);
|
||||
static int repeat_delay = 500;
|
||||
module_param(repeat_delay, int, 0644);
|
||||
static int repeat_period = 33;
|
||||
|
@ -40,6 +40,12 @@ module_param(ir_rc5_remote_gap, int, 0644);
|
|||
static int ir_rc5_key_timeout = 200;
|
||||
module_param(ir_rc5_key_timeout, int, 0644);
|
||||
|
||||
#undef dprintk
|
||||
#define dprintk(arg...) do { \
|
||||
if (ir_debug >= 1) \
|
||||
printk(arg); \
|
||||
} while (0)
|
||||
|
||||
#define DEVNAME "bttv-input"
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
@ -79,6 +85,45 @@ static void ir_handle_key(struct bttv *btv)
|
|||
|
||||
}
|
||||
|
||||
static void ir_enltv_handle_key(struct bttv *btv)
|
||||
{
|
||||
struct card_ir *ir = btv->remote;
|
||||
u32 gpio, data, keyup;
|
||||
|
||||
/* read gpio value */
|
||||
gpio = bttv_gpio_read(&btv->c);
|
||||
|
||||
/* extract data */
|
||||
data = ir_extract_bits(gpio, ir->mask_keycode);
|
||||
|
||||
/* Check if it is keyup */
|
||||
keyup = (gpio & ir->mask_keyup) ? 1 << 31 : 0;
|
||||
|
||||
if ((ir->last_gpio & 0x7f) != data) {
|
||||
dprintk(KERN_INFO DEVNAME ": gpio=0x%x code=%d | %s\n",
|
||||
gpio, data,
|
||||
(gpio & ir->mask_keyup) ? " up" : "up/down");
|
||||
|
||||
ir_input_keydown(ir->dev, &ir->ir, data, data);
|
||||
if (keyup)
|
||||
ir_input_nokey(ir->dev, &ir->ir);
|
||||
} else {
|
||||
if ((ir->last_gpio & 1 << 31) == keyup)
|
||||
return;
|
||||
|
||||
dprintk(KERN_INFO DEVNAME ":(cnt) gpio=0x%x code=%d | %s\n",
|
||||
gpio, data,
|
||||
(gpio & ir->mask_keyup) ? " up" : "down");
|
||||
|
||||
if (keyup)
|
||||
ir_input_nokey(ir->dev, &ir->ir);
|
||||
else
|
||||
ir_input_keydown(ir->dev, &ir->ir, data, data);
|
||||
}
|
||||
|
||||
ir->last_gpio = data | keyup;
|
||||
}
|
||||
|
||||
void bttv_input_irq(struct bttv *btv)
|
||||
{
|
||||
struct card_ir *ir = btv->remote;
|
||||
|
@ -92,7 +137,10 @@ static void bttv_input_timer(unsigned long data)
|
|||
struct bttv *btv = (struct bttv*)data;
|
||||
struct card_ir *ir = btv->remote;
|
||||
|
||||
ir_handle_key(btv);
|
||||
if (btv->c.type == BTTV_BOARD_ENLTV_FM_2)
|
||||
ir_enltv_handle_key(btv);
|
||||
else
|
||||
ir_handle_key(btv);
|
||||
mod_timer(&ir->timer, jiffies + msecs_to_jiffies(ir->polling));
|
||||
}
|
||||
|
||||
|
@ -284,6 +332,14 @@ int bttv_input_init(struct bttv *btv)
|
|||
ir->mask_keyup = 0x006000;
|
||||
ir->polling = 50; /* ms */
|
||||
break;
|
||||
case BTTV_BOARD_ENLTV_FM_2:
|
||||
ir_codes = ir_codes_encore_enltv2;
|
||||
ir->mask_keycode = 0x00fd00;
|
||||
ir->mask_keyup = 0x000080;
|
||||
ir->polling = 1; /* ms */
|
||||
ir->last_gpio = ir_extract_bits(bttv_gpio_read(&btv->c),
|
||||
ir->mask_keycode);
|
||||
break;
|
||||
}
|
||||
if (NULL == ir_codes) {
|
||||
dprintk(KERN_INFO "Ooops: IR config error [card=%d]\n", btv->c.type);
|
||||
|
|
|
@ -176,7 +176,7 @@
|
|||
#define BTTV_BOARD_TYPHOON_TVTUNERPCI 0x95
|
||||
#define BTTV_BOARD_GEOVISION_GV600 0x96
|
||||
#define BTTV_BOARD_KOZUMI_KTV_01C 0x97
|
||||
|
||||
#define BTTV_BOARD_ENLTV_FM_2 0x98
|
||||
|
||||
/* more card-specific defines */
|
||||
#define PT2254_L_CHANNEL 0x10
|
||||
|
|
|
@ -144,6 +144,7 @@ extern IR_KEYTAB_TYPE ir_codes_proteus_2309[IR_KEYTAB_SIZE];
|
|||
extern IR_KEYTAB_TYPE ir_codes_budget_ci_old[IR_KEYTAB_SIZE];
|
||||
extern IR_KEYTAB_TYPE ir_codes_asus_pc39[IR_KEYTAB_SIZE];
|
||||
extern IR_KEYTAB_TYPE ir_codes_encore_enltv[IR_KEYTAB_SIZE];
|
||||
extern IR_KEYTAB_TYPE ir_codes_encore_enltv2[IR_KEYTAB_SIZE];
|
||||
extern IR_KEYTAB_TYPE ir_codes_tt_1500[IR_KEYTAB_SIZE];
|
||||
extern IR_KEYTAB_TYPE ir_codes_fusionhdtv_mce[IR_KEYTAB_SIZE];
|
||||
extern IR_KEYTAB_TYPE ir_codes_behold[IR_KEYTAB_SIZE];
|
||||
|
|
Loading…
Reference in a new issue