V4L/DVB: dvb: add support for kworld 340u and ub435-q to em28xx-dvb
This adds support for the KWorld PlusTV 340U and KWorld UB345-Q ATSC sticks, which are really the same device. The sticks have an eMPIA em2870 usb bridge chipset, an LG Electronics LGDT3304 ATSC/QAM demodulator and an NXP TDA18271HD tuner -- early versions of the 340U have a a TDA18271HD/C1, later models and the UB435-Q have a C2. The stick has been tested succesfully with both VSB_8 and QAM_256 signals. Its using lgdt3304 support added to the lgdt3305 driver by a prior patch, rather than the current lgdt3304 driver, as its severely lacking in functionality by comparison (see said patch for details). Signed-off-by: Jarod Wilson <jarod@redhat.com> Signed-off-by: Michael Krufky <mkrufky@kernellabs.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
1c488ea9d5
commit
7e48b30af0
|
@ -72,3 +72,4 @@
|
||||||
73 -> Reddo DVB-C USB TV Box (em2870)
|
73 -> Reddo DVB-C USB TV Box (em2870)
|
||||||
74 -> Actionmaster/LinXcel/Digitus VC211A (em2800)
|
74 -> Actionmaster/LinXcel/Digitus VC211A (em2800)
|
||||||
75 -> Dikom DK300 (em2882)
|
75 -> Dikom DK300 (em2882)
|
||||||
|
76 -> KWorld PlusTV 340U or UB435-Q (ATSC) (em2870) [1b80:a340]
|
||||||
|
|
|
@ -158,6 +158,22 @@ static struct em28xx_reg_seq evga_indtube_digital[] = {
|
||||||
{ -1, -1, -1, -1},
|
{ -1, -1, -1, -1},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* KWorld PlusTV 340U and UB435-Q (ATSC) GPIOs map:
|
||||||
|
* EM_GPIO_0 - currently unknown
|
||||||
|
* EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)
|
||||||
|
* EM_GPIO_2 - currently unknown
|
||||||
|
* EM_GPIO_3 - currently unknown
|
||||||
|
* EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)
|
||||||
|
* EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)
|
||||||
|
* EM_GPIO_6 - currently unknown
|
||||||
|
* EM_GPIO_7 - currently unknown
|
||||||
|
*/
|
||||||
|
static struct em28xx_reg_seq kworld_a340_digital[] = {
|
||||||
|
{EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10},
|
||||||
|
{ -1, -1, -1, -1},
|
||||||
|
};
|
||||||
|
|
||||||
/* Pinnacle Hybrid Pro eb1a:2881 */
|
/* Pinnacle Hybrid Pro eb1a:2881 */
|
||||||
static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
|
static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
|
||||||
{EM28XX_R08_GPIO, 0xfd, ~EM_GPIO_4, 10},
|
{EM28XX_R08_GPIO, 0xfd, ~EM_GPIO_4, 10},
|
||||||
|
@ -1667,6 +1683,16 @@ struct em28xx_board em28xx_boards[] = {
|
||||||
.tuner_gpio = reddo_dvb_c_usb_box,
|
.tuner_gpio = reddo_dvb_c_usb_box,
|
||||||
.has_dvb = 1,
|
.has_dvb = 1,
|
||||||
},
|
},
|
||||||
|
/* 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold
|
||||||
|
* initially as the KWorld PlusTV 340U, then as the UB435-Q.
|
||||||
|
* Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2 */
|
||||||
|
[EM2870_BOARD_KWORLD_A340] = {
|
||||||
|
.name = "KWorld PlusTV 340U or UB435-Q (ATSC)",
|
||||||
|
.tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */
|
||||||
|
.has_dvb = 1,
|
||||||
|
.dvb_gpio = kworld_a340_digital,
|
||||||
|
.tuner_gpio = default_tuner_gpio,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
|
const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
|
||||||
|
|
||||||
|
@ -1788,6 +1814,8 @@ struct usb_device_id em28xx_id_table[] = {
|
||||||
.driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
|
.driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
|
||||||
{ USB_DEVICE(0xeb1a, 0x50a6),
|
{ USB_DEVICE(0xeb1a, 0x50a6),
|
||||||
.driver_info = EM2860_BOARD_GADMEI_UTV330 },
|
.driver_info = EM2860_BOARD_GADMEI_UTV330 },
|
||||||
|
{ USB_DEVICE(0x1b80, 0xa340),
|
||||||
|
.driver_info = EM2870_BOARD_KWORLD_A340 },
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(usb, em28xx_id_table);
|
MODULE_DEVICE_TABLE(usb, em28xx_id_table);
|
||||||
|
|
|
@ -30,11 +30,13 @@
|
||||||
#include "tuner-simple.h"
|
#include "tuner-simple.h"
|
||||||
|
|
||||||
#include "lgdt330x.h"
|
#include "lgdt330x.h"
|
||||||
|
#include "lgdt3305.h"
|
||||||
#include "zl10353.h"
|
#include "zl10353.h"
|
||||||
#include "s5h1409.h"
|
#include "s5h1409.h"
|
||||||
#include "mt352.h"
|
#include "mt352.h"
|
||||||
#include "mt352_priv.h" /* FIXME */
|
#include "mt352_priv.h" /* FIXME */
|
||||||
#include "tda1002x.h"
|
#include "tda1002x.h"
|
||||||
|
#include "tda18271.h"
|
||||||
|
|
||||||
MODULE_DESCRIPTION("driver for em28xx based DVB cards");
|
MODULE_DESCRIPTION("driver for em28xx based DVB cards");
|
||||||
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
|
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
|
||||||
|
@ -231,6 +233,18 @@ static struct lgdt330x_config em2880_lgdt3303_dev = {
|
||||||
.demod_chip = LGDT3303,
|
.demod_chip = LGDT3303,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct lgdt3305_config em2870_lgdt3304_dev = {
|
||||||
|
.i2c_addr = 0x0e,
|
||||||
|
.demod_chip = LGDT3304,
|
||||||
|
.spectral_inversion = 1,
|
||||||
|
.deny_i2c_rptr = 1,
|
||||||
|
.mpeg_mode = LGDT3305_MPEG_PARALLEL,
|
||||||
|
.tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE,
|
||||||
|
.tpvalid_polarity = LGDT3305_TP_VALID_HIGH,
|
||||||
|
.vsb_if_khz = 3250,
|
||||||
|
.qam_if_khz = 4000,
|
||||||
|
};
|
||||||
|
|
||||||
static struct zl10353_config em28xx_zl10353_with_xc3028 = {
|
static struct zl10353_config em28xx_zl10353_with_xc3028 = {
|
||||||
.demod_address = (0x1e >> 1),
|
.demod_address = (0x1e >> 1),
|
||||||
.no_tuner = 1,
|
.no_tuner = 1,
|
||||||
|
@ -247,6 +261,17 @@ static struct s5h1409_config em28xx_s5h1409_with_xc3028 = {
|
||||||
.mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK
|
.mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct tda18271_std_map kworld_a340_std_map = {
|
||||||
|
.atsc_6 = { .if_freq = 3250, .agc_mode = 3, .std = 0,
|
||||||
|
.if_lvl = 1, .rfagc_top = 0x37, },
|
||||||
|
.qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 1,
|
||||||
|
.if_lvl = 1, .rfagc_top = 0x37, },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct tda18271_config kworld_a340_config = {
|
||||||
|
.std_map = &kworld_a340_std_map,
|
||||||
|
};
|
||||||
|
|
||||||
static struct zl10353_config em28xx_zl10353_xc3028_no_i2c_gate = {
|
static struct zl10353_config em28xx_zl10353_xc3028_no_i2c_gate = {
|
||||||
.demod_address = (0x1e >> 1),
|
.demod_address = (0x1e >> 1),
|
||||||
.no_tuner = 1,
|
.no_tuner = 1,
|
||||||
|
@ -572,6 +597,14 @@ static int dvb_init(struct em28xx *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case EM2870_BOARD_KWORLD_A340:
|
||||||
|
dvb->frontend = dvb_attach(lgdt3305_attach,
|
||||||
|
&em2870_lgdt3304_dev,
|
||||||
|
&dev->i2c_adap);
|
||||||
|
if (dvb->frontend != NULL)
|
||||||
|
dvb_attach(tda18271_attach, dvb->frontend, 0x60,
|
||||||
|
&dev->i2c_adap, &kworld_a340_config);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
em28xx_errdev("/2: The frontend of your DVB/ATSC card"
|
em28xx_errdev("/2: The frontend of your DVB/ATSC card"
|
||||||
" isn't supported yet\n");
|
" isn't supported yet\n");
|
||||||
|
|
|
@ -114,6 +114,7 @@
|
||||||
#define EM2870_BOARD_REDDO_DVB_C_USB_BOX 73
|
#define EM2870_BOARD_REDDO_DVB_C_USB_BOX 73
|
||||||
#define EM2800_BOARD_VC211A 74
|
#define EM2800_BOARD_VC211A 74
|
||||||
#define EM2882_BOARD_DIKOM_DK300 75
|
#define EM2882_BOARD_DIKOM_DK300 75
|
||||||
|
#define EM2870_BOARD_KWORLD_A340 76
|
||||||
|
|
||||||
/* Limits minimum and default number of buffers */
|
/* Limits minimum and default number of buffers */
|
||||||
#define EM28XX_MIN_BUF 4
|
#define EM28XX_MIN_BUF 4
|
||||||
|
|
Loading…
Reference in New Issue