[linux-dvb] Anubis Electronics "Lifeview"(0x10fd:0x1513)

Pierre Willenbrock pierre at pirsoft.dnsalias.org
Sat Mar 3 15:56:49 CET 2007


Michael Krufky schrieb:
> Aapo Tahkola wrote:
>> On Fri, 02 Mar 2007 23:06:15 +0100
>> Pierre Willenbrock <pierre at pirsoft.dnsalias.org> 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
> 
> 

Changelog:
Add support for Anubis Electronics "Lifeview" (usb-ID 0x10fd:0x1513).
Breaks other users of tda1004x.c.

Signed-off-by: Pierre Willenbrock <pierre at pirsoft.dnsalias.org>

>>
>> ------------------------------------------------------------------------
>>
>> 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
> 




More information about the linux-dvb mailing list