Aapo Tahkola wrote: > On Fri, 02 Mar 2007 23:06:15 +0100 > Pierre Willenbrock <[EMAIL PROTECTED]> 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.
Pierre and Aapo BOTH, I'd like to push this into a dev repository so that all of the developers currently working on m920x can test it without having to worry about patch conflicts, etc... but I would prefer to have your sign-off before pushing it to there. Can both of you you please reply to this email with a short patch description and sign-off, as described in: http://linuxtv.org/hg/v4l-dvb?f=-1;file=README.patches Then, I can push in this patch, and we can continue working on this from there. Cheers, Michael Krufky > > > > ------------------------------------------------------------------------ > > 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@linuxtv.org http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb