On Fri, 02 Mar 2007 23:06:15 +0100 Pierre Willenbrock <pierre@xxxxxxxxxxxxxxxxxxxx> wrote: > Michael Krufky schrieb: > > Pierre Willenbrock wrote: > >> Hi list, > >> > >> I am owner of a "MSI DIGIVOX mini-II". I got it to work using the > >> attached patch and firmware. The patch and firmware are the result > >> of analyzing some usb logs from windows. > >> > >> The patch breaks all users of tda10046, as i don't understand how > >> that chip is supposed to work. The same goes for my driver > >> implementation of the Philips 8275a. > >> > >> So this mess needs to be fixed before it can go into the > >> repository. > >> > >> The patch is against a fresh hg checkout from > >> http://linuxtv.org/hg/v4l-dvb at 2007-02-22 21:00 UTC. > >> > >> Regards, > >> Pierre > > > > Pierre- > > > > I am very happy to hear that you got this device working... > > Interestingly enough, we have already created a new tda827x dvb fe > > module, which might be better for your device... This new tda827x > > module has not yet been merged into the master v4l-dvb repository, > > but it will be soon. Could you try to use the code located in: > > > > http://linuxtv.org/hg/~hhackmann/v4l-dvb > > > > The tda827x module will be able to detect the difference between > > the tda8275 and the tda8275a ... You do not have to fill the > > callback functions in the config struct -- that is really meant as > > a hack for some required GPIO handling in the saa7134-dvb driver > > for input switching. > > > > If you can generate a new patch against the repository above, it > > would make it _much_ easier to integrate your patch into the > > sources. After you get that done, we can work out the tda1004x > > differences. > > > > You might also want to speak to aett and friedrich, regulars of the > > #linuxtv irc chat room on irc.freenode.net ... aet is the author of > > the m920x driver, and friedrich has the same device that you have. > > They have been working on it, but haven't yet gotten successful > > results. > > > > Good work! Hopefully we can clean this up after you generate a new > > patch using the tda827x module from hhackmann's repository. > > > > Regards, > > > > Mike Krufky > > > > Hi Mike and Hartmut, > > this time, the patch does not change tda827x.c at all. I fiddled with > the PHY2 value in tda1004x.c and found it to be related to the > IF(there seems to be some factor between the IF and PHY2 introduced > somewhere else). This leaves some differences in tda1004x.c. I don't > know what to do with these, so i would be glad to get any hints. Updated patch. I'm fine with these m920x changes. -- Aapo Tahkola
diff -r 2541388e71f4 linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h --- a/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h Sat Mar 03 02:56:04 2007 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/dvb-usb-ids.h Sat Mar 03 03:01:00 2007 +0200 @@ -37,6 +37,7 @@ #define USB_VID_ULTIMA_ELECTRONIC 0x05d8 #define USB_VID_UNIWILL 0x1584 #define USB_VID_WIDEVIEW 0x14aa +#define USB_VID_ANUBIS_ELECTRONIC 0x10fd /* Product IDs */ #define USB_PID_ADSTECH_USB2_COLD 0xa333 @@ -140,6 +141,7 @@ #define USB_PID_GENPIX_8PSK_COLD 0x0200 #define USB_PID_GENPIX_8PSK_WARM 0x0201 #define USB_PID_SIGMATEK_DVB_110 0x6610 +#define USB_PID_ANUBIS_ELECTRONIC_MSI_DIGI_VOX_MINI_II 0x1513 #endif diff -r 2541388e71f4 linux/drivers/media/dvb/dvb-usb/m920x.c --- a/linux/drivers/media/dvb/dvb-usb/m920x.c Sat Mar 03 02:56:04 2007 +0200 +++ b/linux/drivers/media/dvb/dvb-usb/m920x.c Sat Mar 03 03:06:23 2007 +0200 @@ -14,6 +14,8 @@ #include "mt352.h" #include "mt352_priv.h" #include "qt1010.h" +#include "tda1004x.h" +#include "tda827x.h" /* debug */ static int dvb_usb_m920x_debug; @@ -47,12 +49,16 @@ static inline int m920x_read(struct usb_ ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), request, USB_TYPE_VENDOR | USB_DIR_IN, value, index, data, size, 2000); - if (ret < 0) - return ret; - - if (ret != size) + if (ret < 0) { + printk(KERN_INFO "m920x_read = error: %d\n", ret); + return ret; + } + + if (ret != size) { + deb("m920x_read = no data\n"); return -EIO; - + } + return 0; } @@ -64,6 +70,7 @@ static inline int m920x_write(struct usb ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), request, USB_TYPE_VENDOR | USB_DIR_OUT, value, index, NULL, 0, 2000); + return ret; } @@ -317,6 +324,7 @@ static int m920x_firmware_download(struc i += size; } if (i != fw->size) { + deb("bad firmware file!\n"); ret = -EINVAL; goto done; } @@ -402,8 +410,65 @@ static int megasky_qt1010_tuner_attach(s return 0; } +static struct tda1004x_config digivox_tda10046_config = { + /* the demodulator's i2c address */ + .demod_address = 0x08, + + /* does the "inversion" need inverted? */ + .invert = 0, + + /* Does the OCLK signal need inverted? */ + .invert_oclk = 0, + + /* Xtal frequency, 4 or 16MHz*/ + .xtal_freq = TDA10046_XTAL_16M, + + /* IF frequency */ + .if_freq = TDA10046_FREQ_045,/*currently doing our own*/ + + /* AGC configuration */ +/* .agc_config = TDA10046_AGC_DIGIVOX,*/ + + /* setting of GPIO1 and 3 */ +/* .gpio_config;*/ + + /* slave address and configuration of the tuner */ +/* .tuner_address;*/ +/* .tuner_config;*/ +/* .antenna_switch;*/ + + /* if the board uses another I2c Bridge (tda8290), its address */ +/* .i2c_gate;*/ + + /* request firmware for device */ + /* set this to NULL if the card has a firmware EEPROM */ + .request_firmware = NULL,/*uses firmware EEPROM - TODO: invalid revision*/ +}; + +static int digivox_tda10046_frontend_attach(struct dvb_usb_adapter *adap) +{ + deb("digivox_tda10046_frontend_attach!\n"); + + if ((adap->fe = dvb_attach(tda10046_attach, &digivox_tda10046_config, &adap->dev->i2c_adap)) == NULL) + return -EIO; + + return 0; +} + +static struct tda827x_config digivox_tda8275_config = { +}; + +static int digivox_tda8275_tuner_attach(struct dvb_usb_adapter *adap) +{ + if (dvb_attach(tda827x_attach, adap->fe, 0x60, &adap->dev->i2c_adap, + &digivox_tda8275_config) == NULL) + return -ENODEV; + return 0; +} + /* DVB USB Driver stuff */ static struct dvb_usb_device_properties megasky_properties; +static struct dvb_usb_device_properties digivox_properties; static int m920x_probe(struct usb_interface *intf, const struct usb_device_id *id) @@ -413,12 +478,15 @@ static int m920x_probe(struct usb_interf int ret; deb("Probed!\n"); - + if ((ret = dvb_usb_device_init(intf, &megasky_properties, THIS_MODULE, &d)) == 0) goto found; - - return ret; - + + if ((ret = dvb_usb_device_init(intf, &digivox_properties, THIS_MODULE, &d)) == 0) + goto found; + + return ret; + found: alt = usb_altnum_to_altsetting(intf, 1); @@ -489,6 +557,55 @@ static struct dvb_usb_device_properties { "MSI Mega Sky 580 DVB-T USB2.0", { &m920x_table[0], NULL }, { NULL }, + } + } +}; + +static struct dvb_usb_device_properties digivox_properties = { + .caps = DVB_USB_IS_AN_I2C_ADAPTER, + + .usb_ctrl = DEVICE_SPECIFIC, + .firmware = "dvb-usb-digivox-02.fw", + .download_firmware = m920x_firmware_download, + +/* .rc_interval = 100, + .rc_key_map = digivox_rc_keys, + .rc_key_map_size = ARRAY_SIZE(digivox_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 = digivox_tda10046_frontend_attach, + .tuner_attach = digivox_tda8275_tuner_attach, + + .stream = { + .type = USB_BULK, + .count = 8, + .endpoint = 0x81, + .u = { + .bulk = { + .buffersize = 0x4000, + } + } + }, + }}, + .i2c_algo = &m920x_i2c_algo, + + .num_device_descs = 1, + .devices = { + { "MSI DIGI VOX mini II DVB-T USB2.0", + { &m920x_table[1], NULL }, + { NULL }, }, } }; diff -r 2541388e71f4 linux/drivers/media/dvb/frontends/tda1004x.c --- a/linux/drivers/media/dvb/frontends/tda1004x.c Sat Mar 03 02:56:04 2007 +0200 +++ b/linux/drivers/media/dvb/frontends/tda1004x.c Sat Mar 03 03:01:17 2007 +0200 @@ -256,6 +256,17 @@ static int tda10046h_set_bandwidth(struc static int tda10046h_set_bandwidth(struct tda1004x_state *state, fe_bandwidth_t bandwidth) { +#if 1 + static u8 digivox_vhf[] = { 0x79, 0x16, 0x1c, 0x21, 0xc2 }; + static u8 digivox_uhf[] = { 0x5b, 0x02, 0xd0, 0x2d, 0x03 }; + + tda1004x_write_buf(state, TDA10046H_TIME_WREF1, digivox_uhf, + sizeof(digivox_uhf)); +/*for vhf: 0x09, 0xd9 with if=4.5MHz, uhf: 0x0b, 0xb2 with if=4.75MHz*/ +/*0x0c,0x4f with if=5.0MHz(retrieved by trial and error)*/ + tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_MSB, 0x0c); + tda1004x_write_byteI(state, TDA10046H_FREQ_PHY2_LSB, 0x4f); +#else static u8 bandwidth_6mhz_53M[] = { 0x7b, 0x2e, 0x11, 0xf0, 0xd2 }; static u8 bandwidth_7mhz_53M[] = { 0x6a, 0x02, 0x6a, 0x43, 0x9f }; static u8 bandwidth_8mhz_53M[] = { 0x5c, 0x32, 0xc2, 0x96, 0x6d }; @@ -313,6 +324,7 @@ static int tda10046h_set_bandwidth(struc default: return -EINVAL; } +#endif return 0; } @@ -359,8 +371,10 @@ static int tda1004x_check_upload_ok(stru u8 data1, data2; unsigned long timeout; + dprintk("%s\n", __FUNCTION__); + if (state->demod_type == TDA1004X_DEMOD_TDA10046) { - timeout = jiffies + 2 * HZ; + timeout = jiffies + 4 * HZ; while(!(tda1004x_read_byte(state, TDA1004X_STATUS_CD) & 0x20)) { if (time_after(jiffies, timeout)) { printk(KERN_ERR "tda1004x: timeout waiting for DSP ready\n"); @@ -437,6 +451,11 @@ static void tda10046_init_plls(struct dv tda10046_clk53m = 1; tda1004x_write_byteI(state, TDA10046H_CONFPLL1, 0xf0); +#if 1 + printk(KERN_INFO "tda1004x: setting up plls for 52MHz sampling clock\n"); + tda1004x_write_byteI(state, TDA10046H_CONFPLL2, 0x07); // PLL M = 7 +#endif +#if 0 if(tda10046_clk53m) { printk(KERN_INFO "tda1004x: setting up plls for 53MHz sampling clock\n"); tda1004x_write_byteI(state, TDA10046H_CONFPLL2, 0x08); // PLL M = 8 @@ -444,6 +463,7 @@ static void tda10046_init_plls(struct dv printk(KERN_INFO "tda1004x: setting up plls for 48MHz sampling clock\n"); tda1004x_write_byteI(state, TDA10046H_CONFPLL2, 0x03); // PLL M = 3 } +#endif if (state->config->xtal_freq == TDA10046_XTAL_4M ) { dprintk("%s: setting up PLLs for a 4 MHz Xtal\n", __FUNCTION__); tda1004x_write_byteI(state, TDA10046H_CONFPLL3, 0); // PLL P = N = 0 @@ -632,6 +652,12 @@ static int tda10046_init(struct dvb_fron return -EIO; } +/*from windows driver*/ + tda1004x_write_byteI(state, TDA1004X_CONFC4, 0x00); + tda1004x_write_byteI(state, TDA10046H_CONF_TRISTATE2, 0x2f); + tda1004x_write_byteI(state, TDA10046H_GPIO_OUT_SEL, 0xcf); +/*from windows driver*/ + // tda setup tda1004x_write_mask(state, TDA1004X_CONFC4, 0x20, 0); // disable DSP watchdog timer tda1004x_write_byteI(state, TDA1004X_AUTO, 0x87); // 100 ppm crystal, select HP stream @@ -656,9 +682,19 @@ static int tda10046_init(struct dvb_fron tda1004x_write_byteI(state, TDA10046H_AGC_RENORM, 0x08); // Gain Renormalize tda1004x_write_mask(state, TDA10046H_CONF_POLARITY, 0xf0, 0x60); // set AGC polarities break; - } + case TDA10046_AGC_DIGIVOX: + tda1004x_write_byteI(state, TDA10046H_AGC_CONF, 0x0a); // AGC setup + tda1004x_write_byteI(state, TDA10046H_AGC_THR, 0x70); // set AGC threshold + tda1004x_write_byteI(state, TDA10046H_CONF_POLARITY, 0x24); // set AGC polarities + break; + } +#if 1 + tda1004x_write_byteI(state, TDA1004X_CONFADC2, 0x34); + tda1004x_write_byteI(state, TDA10046H_CONF_TRISTATE1, 0xa1); +#else tda1004x_write_byteI(state, TDA1004X_CONFADC2, 0x38); tda1004x_write_byteI(state, TDA10046H_CONF_TRISTATE1, 0x79); // Turn IF AGC output on +#endif tda1004x_write_byteI(state, TDA10046H_AGC_TUN_MIN, 0); // } tda1004x_write_byteI(state, TDA10046H_AGC_TUN_MAX, 0xff); // } AGC min/max values tda1004x_write_byteI(state, TDA10046H_AGC_IF_MIN, 0); // } diff -r 2541388e71f4 linux/drivers/media/dvb/frontends/tda1004x.h --- a/linux/drivers/media/dvb/frontends/tda1004x.h Sat Mar 03 02:56:04 2007 +0200 +++ b/linux/drivers/media/dvb/frontends/tda1004x.h Sat Mar 03 03:01:17 2007 +0200 @@ -36,6 +36,7 @@ enum tda10046_agc { TDA10046_AGC_IFO_AUTO_NEG, /* IF AGC only, automatic, negtive */ TDA10046_AGC_IFO_AUTO_POS, /* IF AGC only, automatic, positive */ TDA10046_AGC_TDA827X, /* IF AGC only, special setup for tda827x */ + TDA10046_AGC_DIGIVOX, /* setup for msi digivox mini ii*/ }; /* Many (hybrid) boards use GPIO 1 and 3
_______________________________________________ linux-dvb mailing list linux-dvb@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb