V4L/DVB: m920x: Add support for Pinnacle PCTV310e card
Adds support to Pinnacle PCTV310e hybrid tuner card, for DVB-T and remote control, still no analog video. [mchehab@redhat.com: fix CodingStyle issues] Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
0faf6f6b89
commit
3d36f5c652
|
@ -209,6 +209,7 @@
|
||||||
#define USB_PID_PINNACLE_PCTV71E 0x022b
|
#define USB_PID_PINNACLE_PCTV71E 0x022b
|
||||||
#define USB_PID_PINNACLE_PCTV72E 0x0236
|
#define USB_PID_PINNACLE_PCTV72E 0x0236
|
||||||
#define USB_PID_PINNACLE_PCTV73E 0x0237
|
#define USB_PID_PINNACLE_PCTV73E 0x0237
|
||||||
|
#define USB_PID_PINNACLE_PCTV310E 0x3211
|
||||||
#define USB_PID_PINNACLE_PCTV801E 0x023a
|
#define USB_PID_PINNACLE_PCTV801E 0x023a
|
||||||
#define USB_PID_PINNACLE_PCTV801E_SE 0x023b
|
#define USB_PID_PINNACLE_PCTV801E_SE 0x023b
|
||||||
#define USB_PID_PINNACLE_PCTV73A 0x0243
|
#define USB_PID_PINNACLE_PCTV73A 0x0243
|
||||||
|
|
|
@ -16,6 +16,9 @@
|
||||||
#include "qt1010.h"
|
#include "qt1010.h"
|
||||||
#include "tda1004x.h"
|
#include "tda1004x.h"
|
||||||
#include "tda827x.h"
|
#include "tda827x.h"
|
||||||
|
|
||||||
|
#include <media/tuner.h>
|
||||||
|
#include "tuner-simple.h"
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
|
||||||
/* debug */
|
/* debug */
|
||||||
|
@ -158,11 +161,14 @@ static int m920x_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
|
||||||
|
|
||||||
case 0x93:
|
case 0x93:
|
||||||
case 0x92:
|
case 0x92:
|
||||||
|
case 0x83: /* pinnacle PCTV310e */
|
||||||
|
case 0x82:
|
||||||
m->rep_count = 0;
|
m->rep_count = 0;
|
||||||
*state = REMOTE_KEY_PRESSED;
|
*state = REMOTE_KEY_PRESSED;
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
case 0x91:
|
case 0x91:
|
||||||
|
case 0x81: /* pinnacle PCTV310e */
|
||||||
/* prevent immediate auto-repeat */
|
/* prevent immediate auto-repeat */
|
||||||
if (++m->rep_count > 2)
|
if (++m->rep_count > 2)
|
||||||
*state = REMOTE_KEY_REPEAT;
|
*state = REMOTE_KEY_REPEAT;
|
||||||
|
@ -546,6 +552,14 @@ static int m920x_tda8275_61_tuner_attach(struct dvb_usb_adapter *adap)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int m920x_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
|
||||||
|
{
|
||||||
|
dvb_attach(simple_tuner_attach, adap->fe,
|
||||||
|
&adap->dev->i2c_adap, 0x61,
|
||||||
|
TUNER_PHILIPS_FMD1216ME_MK3);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* device-specific initialization */
|
/* device-specific initialization */
|
||||||
static struct m920x_inits megasky_rc_init [] = {
|
static struct m920x_inits megasky_rc_init [] = {
|
||||||
{ M9206_RC_INIT2, 0xa8 },
|
{ M9206_RC_INIT2, 0xa8 },
|
||||||
|
@ -562,6 +576,18 @@ static struct m920x_inits tvwalkertwin_rc_init [] = {
|
||||||
{ } /* terminating entry */
|
{ } /* terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct m920x_inits pinnacle310e_init[] = {
|
||||||
|
/* without these the tuner don't work */
|
||||||
|
{ 0xff20, 0x9b },
|
||||||
|
{ 0xff22, 0x70 },
|
||||||
|
|
||||||
|
/* rc settings */
|
||||||
|
{ 0xff50, 0x80 },
|
||||||
|
{ M9206_RC_INIT1, 0x00 },
|
||||||
|
{ M9206_RC_INIT2, 0xff },
|
||||||
|
{ } /* terminating entry */
|
||||||
|
};
|
||||||
|
|
||||||
/* ir keymaps */
|
/* ir keymaps */
|
||||||
static struct dvb_usb_rc_key megasky_rc_keys [] = {
|
static struct dvb_usb_rc_key megasky_rc_keys [] = {
|
||||||
{ 0x0012, KEY_POWER },
|
{ 0x0012, KEY_POWER },
|
||||||
|
@ -602,11 +628,68 @@ static struct dvb_usb_rc_key tvwalkertwin_rc_keys [] = {
|
||||||
{ 0x001e, KEY_VOLUMEUP },
|
{ 0x001e, KEY_VOLUMEUP },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct dvb_usb_rc_key pinnacle310e_rc_keys[] = {
|
||||||
|
{ 0x16, KEY_POWER },
|
||||||
|
{ 0x17, KEY_FAVORITES },
|
||||||
|
{ 0x0f, KEY_TEXT },
|
||||||
|
{ 0x48, KEY_MEDIA }, /* preview */
|
||||||
|
{ 0x1c, KEY_EPG },
|
||||||
|
{ 0x04, KEY_LIST }, /* record list */
|
||||||
|
{ 0x03, KEY_1 },
|
||||||
|
{ 0x01, KEY_2 },
|
||||||
|
{ 0x06, KEY_3 },
|
||||||
|
{ 0x09, KEY_4 },
|
||||||
|
{ 0x1d, KEY_5 },
|
||||||
|
{ 0x1f, KEY_6 },
|
||||||
|
{ 0x0d, KEY_7 },
|
||||||
|
{ 0x19, KEY_8 },
|
||||||
|
{ 0x1b, KEY_9 },
|
||||||
|
{ 0x15, KEY_0 },
|
||||||
|
{ 0x0c, KEY_CANCEL },
|
||||||
|
{ 0x4a, KEY_CLEAR },
|
||||||
|
{ 0x13, KEY_BACK },
|
||||||
|
{ 0x00, KEY_TAB },
|
||||||
|
{ 0x4b, KEY_UP },
|
||||||
|
{ 0x4e, KEY_LEFT },
|
||||||
|
{ 0x52, KEY_RIGHT },
|
||||||
|
{ 0x51, KEY_DOWN },
|
||||||
|
{ 0x4f, KEY_ENTER }, /* could also be KEY_OK */
|
||||||
|
{ 0x1e, KEY_VOLUMEUP },
|
||||||
|
{ 0x0a, KEY_VOLUMEDOWN },
|
||||||
|
{ 0x05, KEY_CHANNELUP },
|
||||||
|
{ 0x02, KEY_CHANNELDOWN },
|
||||||
|
{ 0x11, KEY_RECORD },
|
||||||
|
{ 0x14, KEY_PLAY },
|
||||||
|
{ 0x4c, KEY_PAUSE },
|
||||||
|
{ 0x1a, KEY_STOP },
|
||||||
|
{ 0x40, KEY_REWIND },
|
||||||
|
{ 0x12, KEY_FASTFORWARD },
|
||||||
|
{ 0x41, KEY_PREVIOUSSONG }, /* Replay */
|
||||||
|
{ 0x42, KEY_NEXTSONG }, /* Skip */
|
||||||
|
{ 0x54, KEY_CAMERA }, /* Capture */
|
||||||
|
/* { 0x50, KEY_SAP }, */ /* Sap */
|
||||||
|
{ 0x47, KEY_CYCLEWINDOWS }, /* Pip */
|
||||||
|
{ 0x4d, KEY_SCREEN }, /* FullScreen */
|
||||||
|
{ 0x08, KEY_SUBTITLE },
|
||||||
|
{ 0x0e, KEY_MUTE },
|
||||||
|
/* { 0x49, KEY_LR }, */ /* L/R */
|
||||||
|
{ 0x07, KEY_SLEEP }, /* Hibernate */
|
||||||
|
{ 0x08, KEY_MEDIA }, /* A/V */
|
||||||
|
{ 0x0e, KEY_MENU }, /* Recall */
|
||||||
|
{ 0x45, KEY_ZOOMIN },
|
||||||
|
{ 0x46, KEY_ZOOMOUT },
|
||||||
|
{ 0x18, KEY_TV }, /* Red */
|
||||||
|
{ 0x53, KEY_VCR }, /* Green */
|
||||||
|
{ 0x5e, KEY_SAT }, /* Yellow */
|
||||||
|
{ 0x5f, KEY_PLAYER }, /* Blue */
|
||||||
|
};
|
||||||
|
|
||||||
/* DVB USB Driver stuff */
|
/* DVB USB Driver stuff */
|
||||||
static struct dvb_usb_device_properties megasky_properties;
|
static struct dvb_usb_device_properties megasky_properties;
|
||||||
static struct dvb_usb_device_properties digivox_mini_ii_properties;
|
static struct dvb_usb_device_properties digivox_mini_ii_properties;
|
||||||
static struct dvb_usb_device_properties tvwalkertwin_properties;
|
static struct dvb_usb_device_properties tvwalkertwin_properties;
|
||||||
static struct dvb_usb_device_properties dposh_properties;
|
static struct dvb_usb_device_properties dposh_properties;
|
||||||
|
static struct dvb_usb_device_properties pinnacle_pctv310e_properties;
|
||||||
|
|
||||||
static int m920x_probe(struct usb_interface *intf,
|
static int m920x_probe(struct usb_interface *intf,
|
||||||
const struct usb_device_id *id)
|
const struct usb_device_id *id)
|
||||||
|
@ -652,6 +735,13 @@ static int m920x_probe(struct usb_interface *intf,
|
||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = dvb_usb_device_init(intf, &pinnacle_pctv310e_properties,
|
||||||
|
THIS_MODULE, &d, adapter_nr);
|
||||||
|
if (ret == 0) {
|
||||||
|
rc_init_seq = pinnacle310e_init;
|
||||||
|
goto found;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
/* Another interface on a multi-tuner device */
|
/* Another interface on a multi-tuner device */
|
||||||
|
@ -682,6 +772,7 @@ static struct usb_device_id m920x_table [] = {
|
||||||
USB_PID_LIFEVIEW_TV_WALKER_TWIN_WARM) },
|
USB_PID_LIFEVIEW_TV_WALKER_TWIN_WARM) },
|
||||||
{ USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_COLD) },
|
{ USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_COLD) },
|
||||||
{ USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_WARM) },
|
{ USB_DEVICE(USB_VID_DPOSH, USB_PID_DPOSH_M9206_WARM) },
|
||||||
|
{ USB_DEVICE(USB_VID_VISIONPLUS, USB_PID_PINNACLE_PCTV310E) },
|
||||||
{ } /* Terminating entry */
|
{ } /* Terminating entry */
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE (usb, m920x_table);
|
MODULE_DEVICE_TABLE (usb, m920x_table);
|
||||||
|
@ -895,6 +986,56 @@ static struct dvb_usb_device_properties dposh_properties = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct dvb_usb_device_properties pinnacle_pctv310e_properties = {
|
||||||
|
.caps = DVB_USB_IS_AN_I2C_ADAPTER,
|
||||||
|
|
||||||
|
.usb_ctrl = DEVICE_SPECIFIC,
|
||||||
|
.download_firmware = NULL,
|
||||||
|
|
||||||
|
.rc_interval = 100,
|
||||||
|
.rc_key_map = pinnacle310e_rc_keys,
|
||||||
|
.rc_key_map_size = ARRAY_SIZE(pinnacle310e_rc_keys),
|
||||||
|
.rc_query = m920x_rc_query,
|
||||||
|
|
||||||
|
.size_of_priv = sizeof(struct m920x_state),
|
||||||
|
|
||||||
|
.identify_state = m920x_identify_state,
|
||||||
|
.num_adapters = 1,
|
||||||
|
.adapter = {{
|
||||||
|
.caps = DVB_USB_ADAP_HAS_PID_FILTER |
|
||||||
|
DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF,
|
||||||
|
|
||||||
|
.pid_filter_count = 8,
|
||||||
|
.pid_filter = m920x_pid_filter,
|
||||||
|
.pid_filter_ctrl = m920x_pid_filter_ctrl,
|
||||||
|
|
||||||
|
.frontend_attach = m920x_mt352_frontend_attach,
|
||||||
|
.tuner_attach = m920x_fmd1216me_tuner_attach,
|
||||||
|
|
||||||
|
.stream = {
|
||||||
|
.type = USB_ISOC,
|
||||||
|
.count = 5,
|
||||||
|
.endpoint = 0x84,
|
||||||
|
.u = {
|
||||||
|
.isoc = {
|
||||||
|
.framesperurb = 128,
|
||||||
|
.framesize = 564,
|
||||||
|
.interval = 1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
} },
|
||||||
|
.i2c_algo = &m920x_i2c_algo,
|
||||||
|
|
||||||
|
.num_device_descs = 1,
|
||||||
|
.devices = {
|
||||||
|
{ "Pinnacle PCTV 310e",
|
||||||
|
{ &m920x_table[6], NULL },
|
||||||
|
{ NULL },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static struct usb_driver m920x_driver = {
|
static struct usb_driver m920x_driver = {
|
||||||
.name = "dvb_usb_m920x",
|
.name = "dvb_usb_m920x",
|
||||||
.probe = m920x_probe,
|
.probe = m920x_probe,
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#define M9206_FW 0x30
|
#define M9206_FW 0x30
|
||||||
|
|
||||||
#define M9206_MAX_FILTERS 8
|
#define M9206_MAX_FILTERS 8
|
||||||
#define M9206_MAX_ADAPTERS 2
|
#define M9206_MAX_ADAPTERS 4
|
||||||
|
|
||||||
/*
|
/*
|
||||||
sequences found in logs:
|
sequences found in logs:
|
||||||
|
|
Loading…
Reference in New Issue