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

Reply via email to