[linux-dvb] Patches to fix support for VisionPlus DTV (VP1020) / tuning problem

Manu Abraham manu at kromtek.com
Sat Apr 23 18:51:46 CEST 2005


Steffen Motzer wrote:
> This revised patch for dst.c also fixes the tuning problems. It seems 
> that sometimes the asic acknowledged a command but failed to execute it. 
> This might have also be the reason why sometimes szap reported that the 
> tuner supposedly had lost the lock on the signal even though it did not.
> 
> The values for signal-quality (dB) and signal-level are returned at 
> different offsets and need to be converted for this particular 
> VisionPlus card.
>
> 
> ------------------------------------------------------------------------
> 
> *** dst_common.h.orig	2005-04-23 17:30:45.000000000 +0200
> --- dst_common.h	2005-04-23 17:31:02.000000000 +0200
> ***************
> *** 46,51 ****
> --- 46,52 ----
>   #define DST_TYPE_HAS_FW_1	8
>   #define DST_TYPE_HAS_FW_2	16
>   #define DST_TYPE_HAS_FW_3	32
> + #define DST_TYPE_CONV_LEVEL_SNR 64
>   
>   
>   
> 
> 
> ------------------------------------------------------------------------
> 
> *** dst.c.orig	2005-04-23 17:30:19.000000000 +0200
> --- dst.c	2005-04-23 17:30:56.000000000 +0200
> *************** MODULE_PARM_DESC(new_fw, "Support for th
> *** 58,63 ****
> --- 58,65 ----
>   #define ATTEMPT_TUNE	2
>   #define HAS_POWER	4
>   
> + #define ASIC_DELAY     50
> + 
>   static void dst_packsize(struct dst_state* state, int psize)
>   {
>   	union dst_gpio_packet bits;
> *************** int rdc_reset_state(struct dst_state *st
> *** 129,139 ****
>   		return -1;
>   	}
>   
> ! 	msleep(10);
>   
>   	if (dst_gpio_outb(state, RDC_8820_INT, RDC_8820_INT, RDC_8820_INT, NO_DELAY) < 0) {
>   		dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
> ! 		msleep(10);

This will be problematic on many cards .. The FTA cards are less 
susceptible to this syndrome. The CI based cards as well as DVB-C cards 
are very much susceptible ..

>   		return -1;
>   	}
>   
> --- 131,141 ----
>   		return -1;
>   	}
>   
> ! 	msleep(ASIC_DELAY);
>   
>   	if (dst_gpio_outb(state, RDC_8820_INT, RDC_8820_INT, RDC_8820_INT, NO_DELAY) < 0) {
>   		dprintk("%s: dst_gpio_outb ERROR !\n", __FUNCTION__);
> ! 		msleep(ASIC_DELAY);

Same here too ..
>   		return -1;
>   	}
>   
> *************** int dst_error_recovery(struct dst_state 
> *** 213,221 ****
>   {
>   	dprintk("%s: Trying to return from previous errors...\n", __FUNCTION__);
>   	dst_pio_disable(state);
> ! 	msleep(10);
>   	dst_pio_enable(state);
> ! 	msleep(10);
>   
>   	return 0;
>   }
> --- 215,223 ----
>   {
>   	dprintk("%s: Trying to return from previous errors...\n", __FUNCTION__);
>   	dst_pio_disable(state);
> ! 	msleep(ASIC_DELAY);

Same here too ..

>   	dst_pio_enable(state);
> ! 	msleep(ASIC_DELAY);
>   

Same here too ..
>   	return 0;
>   }
> *************** int dst_error_bailout(struct dst_state *
> *** 226,232 ****
>   	dprintk("%s: Trying to bailout from previous error...\n", __FUNCTION__);
>   	rdc_8820_reset(state);
>   	dst_pio_disable(state);
> ! 	msleep(10);

This would cause the error recovery mechanism to fail completely in case 
of an error ..

>   
>   	return 0;
>   }
> --- 228,234 ----
>   	dprintk("%s: Trying to bailout from previous error...\n", __FUNCTION__);
>   	rdc_8820_reset(state);
>   	dst_pio_disable(state);
> ! 	msleep(ASIC_DELAY);
>   
>   	return 0;
>   }
> *************** int dst_comm_init(struct dst_state* stat
> *** 245,250 ****
> --- 247,257 ----
>   		dprintk("%s: RDC 8820 State RESET Failed.\n", __FUNCTION__);
>   		return -1;
>   	}
> + 	msleep(ASIC_DELAY);
> + 	dst_wait_dst_ready(state,NO_DELAY);
> + 	dst_pio_enable(state);
> + 	msleep(ASIC_DELAY);
> + 

>   	return 0;
>   }
>   EXPORT_SYMBOL(dst_comm_init);
> *************** struct dst_types dst_tlist[] = {
> *** 684,689 ****
> --- 691,704 ----
>   		.dst_feature = 0
>   	},
>   
> + 	{
> +                 .device_id = "200103A",
> +                 .offset = 0,
> +                 .dst_type = DST_TYPE_IS_SAT,
> +                 .type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1 | DST_TYPE_CONV_LEVEL_SNR,
> +                 .dst_feature = 0
> +         },
> + 
>   	{ }
>   
>   };
> *************** static int dst_get_device_id(struct dst_
> *** 702,707 ****
> --- 717,727 ----
>   
>   	device_type[7] = dst_check_sum(device_type, 7);
>   
> + 	if ((dst_comm_init(state)) < 0) {
> + 		dprintk("%s: DST Communication initialization failed.\n", __FUNCTION__);
> + 		return -1;
> + 	}
> + 

I don't think this is right, but i will check it up ..

Manu




More information about the linux-dvb mailing list