diff options
| author | Patrick Boettcher <pb@linuxtv.org> | 2006-03-25 09:19:18 +0100 |
|---|---|---|
| committer | Patrick Boettcher <pb@linuxtv.org> | 2006-03-25 09:19:18 +0100 |
| commit | 43950da130503eeb6f9a9304aa7b7d482d535ad6 (patch) | |
| tree | 6a893e6b28270f34ce882164bd3cac10f18cc4ba /linux/drivers/media/dvb/dvb-usb | |
| parent | 9ca6c476f94c3fd38296dae63120868b534386f1 (diff) | |
| download | mediapointer-dvb-s2-43950da130503eeb6f9a9304aa7b7d482d535ad6.tar.gz mediapointer-dvb-s2-43950da130503eeb6f9a9304aa7b7d482d535ad6.tar.bz2 | |
Adding support for MT2060 and thus for some DVB-USB-devices based on it
From: Olivier DANET <odanet@caramail.com>
- MT2060 tuner driver
- Added support for some USB DVB-T devices based on Dib3000P
Signed-off-by: Olivier DANET <odanet@caramail.com>
Signed-off-by: Patrick Boettcher <pb@linuxtv.org>
Diffstat (limited to 'linux/drivers/media/dvb/dvb-usb')
| -rw-r--r-- | linux/drivers/media/dvb/dvb-usb/dibusb-common.c | 63 | ||||
| -rw-r--r-- | linux/drivers/media/dvb/dvb-usb/dibusb-mc.c | 27 | ||||
| -rw-r--r-- | linux/drivers/media/dvb/dvb-usb/dibusb.h | 9 | ||||
| -rw-r--r-- | linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 7 |
4 files changed, 100 insertions, 6 deletions
diff --git a/linux/drivers/media/dvb/dvb-usb/dibusb-common.c b/linux/drivers/media/dvb/dvb-usb/dibusb-common.c index 2d52b7667..4d3d0d3da 100644 --- a/linux/drivers/media/dvb/dvb-usb/dibusb-common.c +++ b/linux/drivers/media/dvb/dvb-usb/dibusb-common.c @@ -168,16 +168,63 @@ int dibusb_read_eeprom_byte(struct dvb_usb_device *d, u8 offs, u8 *val) } EXPORT_SYMBOL(dibusb_read_eeprom_byte); +static struct mt2060_config default_mt2060_config = { + .i2c_address = 0x60, +}; + +static int dibusb_tuner_init(struct dvb_frontend *fe) +{ + int ret; + struct dvb_usb_device *d = fe->dvb->priv; + struct dibusb_state *st = d->priv; + + if (d->tuner_pass_ctrl) { + if ((int)d->fe->misc_priv==DIBUSB_TUNER_MT2060) { // Microtune MT2060 + d->tuner_pass_ctrl(d->fe,1,default_mt2060_config.i2c_address); + ret=mt2060_init(&st->mt2060); + } + else { // Panasonic whatever + d->tuner_pass_ctrl(d->fe,1,d->pll_addr); + ret=dvb_usb_pll_init_i2c(fe); + } + d->tuner_pass_ctrl(d->fe,0,0); + return ret; + } + return -ENODEV; +} + +static int dibusb_tuner_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *fep) +{ + int ret; + struct dvb_usb_device *d = fe->dvb->priv; + struct dibusb_state *st = d->priv; + + if (d->tuner_pass_ctrl) { + if ((int)d->fe->misc_priv==DIBUSB_TUNER_MT2060) { + d->tuner_pass_ctrl(d->fe,1,default_mt2060_config.i2c_address); + ret=mt2060_set(&st->mt2060,fep); + } + else { + d->tuner_pass_ctrl(d->fe,1,d->pll_addr); + ret=dvb_usb_pll_set_i2c(fe,fep); + } + d->tuner_pass_ctrl(d->fe,0,0); + return ret; + } + return -ENODEV; +} + int dibusb_dib3000mc_frontend_attach(struct dvb_usb_device *d) { struct dib3000_config demod_cfg; struct dibusb_state *st = d->priv; - demod_cfg.pll_set = dvb_usb_pll_set_i2c; - demod_cfg.pll_init = dvb_usb_pll_init_i2c; + demod_cfg.pll_set = dibusb_tuner_set; + demod_cfg.pll_init = dibusb_tuner_init; for (demod_cfg.demod_address = 0x8; demod_cfg.demod_address < 0xd; demod_cfg.demod_address++) if ((d->fe = dib3000mc_attach(&demod_cfg,&d->i2c_adap,&st->ops)) != NULL) { + d->fe->misc_priv=(void *)DIBUSB_TUNER_DEFAULT; d->tuner_pass_ctrl = st->ops.tuner_pass_ctrl; return 0; } @@ -188,9 +235,19 @@ EXPORT_SYMBOL(dibusb_dib3000mc_frontend_attach); int dibusb_dib3000mc_tuner_attach (struct dvb_usb_device *d) { + int ret; d->pll_addr = 0x60; d->pll_desc = &dvb_pll_env57h1xd5; - return 0; + if (d->tuner_pass_ctrl) { + struct dibusb_state *st = d->priv; + d->tuner_pass_ctrl(d->fe,1,default_mt2060_config.i2c_address); + if ((ret = mt2060_attach(&st->mt2060,&default_mt2060_config, &d->i2c_adap)) == 0) { + d->fe->misc_priv=(void *)DIBUSB_TUNER_MT2060; + } + d->tuner_pass_ctrl(d->fe,0,0); + return 0; + } + return -ENODEV; } EXPORT_SYMBOL(dibusb_dib3000mc_tuner_attach); diff --git a/linux/drivers/media/dvb/dvb-usb/dibusb-mc.c b/linux/drivers/media/dvb/dvb-usb/dibusb-mc.c index 87fc1de1f..b205f8d73 100644 --- a/linux/drivers/media/dvb/dvb-usb/dibusb-mc.c +++ b/linux/drivers/media/dvb/dvb-usb/dibusb-mc.c @@ -28,6 +28,13 @@ static struct usb_device_id dibusb_dib3000mc_table [] = { /* 00 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_MOD3001_COLD) }, /* 01 */ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_MOD3001_WARM) }, /* 02 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_USB2_COLD) }, +/* 03 */ { USB_DEVICE(USB_VID_ULTIMA_ELECTRONIC, USB_PID_ULTIMA_TVBOX_USB2_WARM) }, // ( ? ) +/* 04 */ { USB_DEVICE(USB_VID_LITEON, USB_PID_LITEON_DVB_T_COLD) }, +/* 05 */ { USB_DEVICE(USB_VID_LITEON, USB_PID_LITEON_DVB_T_WARM) }, +/* 06 */ { USB_DEVICE(USB_VID_EMPIA, USB_PID_DIGIVOX_MINI_SL_COLD) }, +/* 07 */ { USB_DEVICE(USB_VID_EMPIA, USB_PID_DIGIVOX_MINI_SL_WARM) }, +/* 08 */ { USB_DEVICE(USB_VID_GRANDTEC, USB_PID_GRANDTEC_DVBT_USB2_COLD) }, +/* 09 */ { USB_DEVICE(USB_VID_GRANDTEC, USB_PID_GRANDTEC_DVBT_USB2_WARM) }, { } /* Terminating entry */ }; MODULE_DEVICE_TABLE (usb, dibusb_dib3000mc_table); @@ -68,16 +75,30 @@ static struct dvb_usb_properties dibusb_mc_properties = { } }, - .num_device_descs = 2, + .num_device_descs = 5, .devices = { { "DiBcom USB2.0 DVB-T reference design (MOD3000P)", { &dibusb_dib3000mc_table[0], NULL }, { &dibusb_dib3000mc_table[1], NULL }, }, - { "Artec T1 USB2.0 TVBOX (please report the warm ID)", + { "Artec T1 USB2.0 TVBOX (please check the warm ID)", { &dibusb_dib3000mc_table[2], NULL }, - { NULL }, + { &dibusb_dib3000mc_table[3], NULL }, }, + { "LITE-ON USB2.0 DVB-T Tuner", + /* Also rebranded as Intuix S800, Toshiba */ + { &dibusb_dib3000mc_table[4], NULL }, + { &dibusb_dib3000mc_table[5], NULL }, + }, + { "MSI Digivox Mini SL", + { &dibusb_dib3000mc_table[6], NULL }, + { &dibusb_dib3000mc_table[7], NULL }, + }, + { "GRAND - USB2.0 DVB-T adapter", + { &dibusb_dib3000mc_table[8], NULL }, + { &dibusb_dib3000mc_table[9], NULL }, + }, + { NULL }, } }; diff --git a/linux/drivers/media/dvb/dvb-usb/dibusb.h b/linux/drivers/media/dvb/dvb-usb/dibusb.h index 2d99d05c7..f3e3ea8c8 100644 --- a/linux/drivers/media/dvb/dvb-usb/dibusb.h +++ b/linux/drivers/media/dvb/dvb-usb/dibusb.h @@ -17,6 +17,7 @@ #include "dvb-usb.h" #include "dib3000.h" +#include "mt2060.h" /* * protocol of all dibusb related devices @@ -94,8 +95,16 @@ #define DIBUSB_IOCTL_CMD_ENABLE_STREAM 0x01 #define DIBUSB_IOCTL_CMD_DISABLE_STREAM 0x02 +/* Tuner types. + These constants shall correspond to the proper AGC values in the array + dib3000mc_agc_tuner[][12] in dib3000mc_priv.h */ +#define DIBUSB_TUNER_DEFAULT 1 // a.k.a Panasonic +#define DIBUSB_TUNER_MT2060 4 + + struct dibusb_state { struct dib_fe_xfer_ops ops; + struct mt2060_state mt2060; /* for RC5 remote control */ int old_toggle; diff --git a/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h index 4a1b9e77e..6039e6742 100644 --- a/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h +++ b/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h @@ -31,6 +31,7 @@ #define USB_VID_VISIONPLUS 0x13d3 #define USB_VID_TWINHAN 0x1822 #define USB_VID_ULTIMA_ELECTRONIC 0x05d8 +#define USB_VID_LITEON 0x04ca /* Product IDs */ #define USB_PID_ADSTECH_USB2_COLD 0xa333 @@ -102,5 +103,11 @@ #define USB_PID_KYE_DVB_T_WARM 0x701f #define USB_PID_PCTV_200E 0x020e #define USB_PID_PCTV_400E 0x020f +#define USB_PID_LITEON_DVB_T_COLD 0xf000 +#define USB_PID_LITEON_DVB_T_WARM 0xf001 +#define USB_PID_DIGIVOX_MINI_SL_COLD 0xe360 +#define USB_PID_DIGIVOX_MINI_SL_WARM 0xe361 +#define USB_PID_GRANDTEC_DVBT_USB2_COLD 0x0bc6 +#define USB_PID_GRANDTEC_DVBT_USB2_WARM 0x0bc7 #endif |
