⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drv0899.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
		STTUNER_IOREG_GetContigousRegisters_SizeU32(DeviceMap, IOHandle, RSTB0899_EQUAI1,10,EqCoeffs); 

		
	}
	
	return	Params->State;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_SetMclk
--ACTION	::	Set demod Master Clock  
--PARAMS IN	::	Handle	==>	Front End Handle
			::	Mclk : demod master clock
			::	ExtClk external Quartz
--PARAMS OUT::	NONE.
--RETURN	::	Error (if any)
--***************************************************/
FE_STB0899_Error_t FE_STB0899_SetMclk(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, U32 Mclk, FE_STB0899_InternalParams_t	*Params)
{
	FE_STB0899_Error_t error = FE_899_NO_ERROR;
	
	U32 mDiv;
	if(Params == NULL)
		error=FE_899_INVALID_HANDLE;
	else
	{
		mDiv = ((6*Mclk)/Params->Quartz)-1;
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_MDIV, FSTB0899_MDIV_INFO, mDiv);
		Params->MasterClock=FE_STB0899_GetMclkFreq(DeviceMap, IOHandle, Params->Quartz);
	}

	return(FE_899_NO_ERROR);
}

/*****************************************************
--FUNCTION	::	FE_STB0899_DVBS2Algo
--ACTION	::	Locking Algo for DVBS2 Signal
--PARAMS IN	::	Params		=>	Pointer to FE_STB0899_InternalParams_t structure
--PARAMS OUT::	Params->State	=> Result of the check
--RETURN	::	
--***************************************************/
FE_DVBS2_State  FE_STB0899_DVBS2Algo(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_STB0899_InternalParams_t *Params, STTUNER_Handle_t TopLevelHandle)
{
	
    S32 offsetfreq, pilots, searchTime, fecLockTime;
    S16 iqSpectrum;		
    FE_DVBS2_ModCod_t modCode;
    FE_STB0899_DVBS2_InitParams_t initParams;
    STTUNER_InstanceDbase_t *Inst;
    STTUNER_tuner_instance_t *TunerInstance;
    ST_ErrorCode_t Error = ST_NO_ERROR;
      
    /* top level public instance data */ 
    Inst = STTUNER_GetDrvInst();
    /* get the tuner instance for this driver from the top level handle */
    TunerInstance = &Inst[TopLevelHandle].Sat.Tuner; 
	
	/*Init Params Initialization*/
	initParams.RRCAlpha=Params->RrcAlpha;
	initParams.SymbolRate=Params->DVBS2SymbolRate;
	initParams.MasterClock=Params->MasterClock;
	initParams.CarrierFrequency=Params->CenterFreq;/*carrier freq = 0?*/
	initParams.AveFrameCoarse=Params->AveFrameCoarse;
	initParams.AveFramefine=Params->AveFramefine;
	initParams.StepSize=Params->StepSize;
	/*Check for (1)Demod lock then (2)FEC lock  for different symbol rates */			
	if(Params->DVBS2SymbolRate <= 2000000)
	{
		searchTime=5000;					/*5000 ms time to lock UWP, CSM and FEC when SYMB <= 2Mbs */
		fecLockTime=350;					/*350 ms to lock the FEC only once the demod locked*/
	}
	else if(Params->DVBS2SymbolRate <= 5000000)
	{
		searchTime=2500;						/*2500 ms time to lock UWP, CSM and FEC when 2Mbs< SYMB <= 5Mbs */ 
		fecLockTime=170;					/*170 ms to lock the FEC only once the demod locked*/
	}
	else if(Params->DVBS2SymbolRate <= 10000000)
	{
		searchTime=1500;					 	/*1500 ms time to lock UWP, CSM and FEC when 5Mbs <SYMB <= 10Mbs */
		fecLockTime=100;					/*100 ms to lock the FEC only once the demod locked*/
	}
	else if  (Params->DVBS2SymbolRate <= 15000000)
	{
		searchTime=500;					 	/*700 ms time to lock UWP, CSM and FEC when 10Mbs <SYMB <= 15Mbs */
		fecLockTime=70;						/*70 ms to lock the FEC only once the demod locked*/
	}
	else if  (Params->DVBS2SymbolRate <= 20000000)
	{
		searchTime=300;					 	/*500 ms time to lock UWP, CSM and FEC when 15Mbs < SYMB <= 20Mbs */
		fecLockTime=50;						/*50 ms to lock the FEC only once the demod locked*/
	}
	else if  (Params->DVBS2SymbolRate <= 25000000)
	{
		searchTime=250;					 	/*250 ms time to lock UWP, CSM and FEC when 20 Mbs < SYMB <= 25Mbs */
		fecLockTime=25;						/*30 ms to lock the FEC only once the demod locked*/
	}
	else
	{
		searchTime=150;						/*150 ms time to lock UWP, CSM and FEC when  SYMB > 25Mbs */ 	
		fecLockTime=20;						/*20 ms to lock the FEC only once the demod locked*/
	}					
		
	Params->SubRange = 12000000;
	initParams.FreqRange = Params->SubRange/1000000;
	Params->Frequency = Params->BaseFreq;
	Params->TunerOffset = 0;
	Params->SubDir = 1;
	
	/*Maintain Stream Merger in reset during acquisition*/
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_FRESRS,FSTB0899_FRESRS_INFO,1);
	
	FE_DVBS2_InitialCalculations(DeviceMap,IOHandle,&initParams);
	
	/*IQ swap setting*/
	if(Params->SpectralInv == STTUNER_IQ_MODE_NORMAL)
	{
		/* I,Q Spectrum Set to Normal*/ 
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO,0);
		
	}
	else if(Params->SpectralInv == STTUNER_IQ_MODE_INVERTED)
	{
		/* I,Q Spectrum Inverted*/ 
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO,1);


	}
	else
	{
		/* I,Q Auto use last "successful search" value first  */ 
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO,Params->IQLocked);

	}
	
	do{
		Error |= (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, (U32)Params->Frequency , (U32 *)&Params->Frequency);	/*	Move the tuner	*/ 
		
		if(Error != ST_NO_ERROR)
		{
			return(FE_DVBS2_NOAGC);
		}
		/*	Temporisations	*/
		WAIT_N_MS_899(10);	/*	Wait for agc1,agc2 and timing loop	*/
		tuner_tunsdrv_Utilfunction(TunerInstance->DrvHandle, VCO_SEARCH_OFF);
		FE_STB0899_WaitTuner(TunerInstance,100);		/*	Is tuner Locked	? (wait 100 ms maxi)	*/
		/*Set IF AGC to Acquire value*/
		
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_IF_LOOPGAIN,FSTB0899_IF_LOOPGAIN_INFO,4);
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_IF_AGCREF,FSTB0899_IF_AGCREF_INFO,32);
		
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_IF_AGC_DUMPPER,FSTB0899_IF_AGC_DUMPPER_INFO,0);
		FE_DVBS2_Reacquire(DeviceMap,IOHandle);
		/*Wait for UWP,CSM and DATA LOCK 70ms max*/
		Params->Results.DVBS2SignalType=Params->DVBS2State=FE_DVBS2_GetDemodStatus(DeviceMap,IOHandle,searchTime);
		if(Params->DVBS2State==FE_DVBS2_DEMOD_LOCKED) 
		{
			/*Demod Locked, check the FEC */
			Params->Results.DVBS2SignalType=Params->DVBS2State=FE_DVBS2_GetFecStatus(DeviceMap,IOHandle,fecLockTime);
				
		}
		if(Params->DVBS2State!=FE_DVBS2_DATAOK)
		{
			if(Params->SpectralInv == STTUNER_IQ_MODE_AUTO)
			{  
				iqSpectrum=STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO);
				/* I,Q Spectrum Inverted*/ 
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO,!iqSpectrum);

				/* start acquistion process  */
				FE_DVBS2_Reacquire(DeviceMap,IOHandle);
				/*Whait for UWP,CSM and data LOCK 200ms max*/
				Params->Results.DVBS2SignalType=Params->DVBS2State=FE_DVBS2_GetDemodStatus(DeviceMap,IOHandle,searchTime);
				if(Params->DVBS2State == FE_DVBS2_DEMOD_LOCKED)
				Params->IQLocked=!iqSpectrum;
			}
		}
		
		if(Params->DVBS2State!=FE_DVBS2_DATAOK)
		{
			FE_899_NextSubRange(Params);		
		}
	}	  
	while(Params->SubRange && Params->DVBS2State!=FE_DVBS2_DATAOK);
	
	
	if(Params->DVBS2State==FE_DVBS2_DATAOK)
	{
		modCode = Params->Results.ModCode=(FE_DVBS2_ModCod_t)FE_DVBS2_GetModCod(DeviceMap, IOHandle);
		pilots = Params->Results.Pilots=STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_UWP_DECODED_MODCODE, FSTB0899_UWP_DECODED_MODCODE_INFO)&0x01;
		Params->Results.FrameLength= (FE_DVBS2_FRAME)((STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_UWP_DECODED_MODCODE, FSTB0899_UWP_DECODED_MODCODE_INFO)>>1)&0x01);
	        if((((10*Params->MasterClock)/(Params->DVBS2SymbolRate/10))<=400)&&(INRANGE(FE_QPSK_23,modCode,FE_QPSK_910))&&(pilots==1))
		{
			FE_DVBS2_CSMInitialize(DeviceMap,IOHandle,pilots,modCode,Params->DVBS2SymbolRate,Params->MasterClock);
			/*Wait for UWP,CSM and data LOCK 20ms max*/
			Params->Results.DVBS2SignalType=Params->DVBS2State=FE_DVBS2_GetFecStatus(DeviceMap,IOHandle,fecLockTime);
		}
		if((((10*Params->MasterClock)/(Params->DVBS2SymbolRate/10))<=400)&&(INRANGE(FE_QPSK_12,modCode,FE_QPSK_35))&&(pilots==1))
		{
			STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_EQ_DISABLE_UPDATE,FSTB0899_EQ_DISABLE_UPDATE_INFO,1);	
		}
		
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_EQ_SHIFT,FSTB0899_EQ_SHIFT_INFO,0x2);

		offsetfreq = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_CRL_FREQUENCY, FSTB0899_CRL_FREQUENCY_INFO);
		offsetfreq = offsetfreq/(S32)(FE_899_PowOf2(30)/1000);
		
		offsetfreq *= (S32)(Params->MasterClock/1000000);
		if(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO))
		offsetfreq*=-1;	
		
		Params->Results.Frequency = (U32)(Params->Frequency - offsetfreq);
		if((Params->Results.Frequency > Params->BaseFreq + Params->SearchRange/2000) || (Params->Results.Frequency < Params->BaseFreq - Params->SearchRange/2000))
		{
			Params->DVBS2State = FE_DVBS2_OUTOFRANGE;
			
			return Params->DVBS2State;
		}
		if(!Inst[TopLevelHandle].Sat.ScanExact)
		{
			Params->Results.DVBS2SymbolRate=FE_DVBS2_GetSymbolRate(DeviceMap, IOHandle, Params->MasterClock);
		}
		else 
		{
			Params->Results.DVBS2SymbolRate = Params->DVBS2SymbolRate;
		}		
		
		/*if offset Frequency >5MHz Tuner centring */
		if(offsetfreq>6000)
		{
			Error |= (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, (U32)Params->Results.Frequency , (U32 *)&Params->Frequency);	/*	Move the tuner	*/ 
		}
		
		 /*Set IF AGC to tracquing value*/
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_IF_LOOPGAIN,FSTB0899_IF_LOOPGAIN_INFO,3);
		/*if QPSK 1/2,QPSK 3/5 or QPSK 2/3 set IF AGC reference to 16 otherwise 32*/
		if(INRANGE(FE_QPSK_12,Params->Results.ModCode,FE_QPSK_23))
			STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_IF_AGCREF,FSTB0899_IF_AGCREF_INFO,16);	/*Write field Image*/
		
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_IF_AGC_DUMPPER,FSTB0899_IF_AGC_DUMPPER_INFO,7);
		
	}
	/*Release Stream Merger Reset*/
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_FRESRS,FSTB0899_FRESRS_INFO,0);	
	return	Params->DVBS2State;
}
/*****************************************************
--FUNCTION	::	FE_STB0899_GetRFLevel
--ACTION	::	Return power of the signal
--PARAMS IN	::	NONE	
--PARAMS OUT::	NONE
--RETURN	::	Power of the signal (dBm), -100 if no signal 
--***************************************************/
S32 FE_STB0899_GetRFLevel(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,STTUNER_FECType_t FECType, STTUNER_FECMode_t FECMode)
{
	S32 agcGain = 0,
		Imin,
		Imax,
		i,
		rfLevel = 0;
	FE_STB0899_LOOKUP_t *lookup;
	lookup = &FE_STB0899_RF_LookUp;
	
	if(FECType == STTUNER_FEC_MODE_DVBS2)
	lookup = &FE_STB0899_DVBS2RF_LookUp;
	
	if((lookup != NULL) && lookup->size)
	{
		if((FECType == STTUNER_FEC_MODE_DVBS1) || (FECMode == STTUNER_FEC_MODE_DIRECTV))
		{
			agcGain = STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_AGCIQ_VALUE,FSTB0899_AGCIQ_VALUE_INFO);
		}
		else if(FECType == STTUNER_FEC_MODE_DVBS2)
		{	
			agcGain = STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_IF_AGCGAIN,FSTB0899_IF_AGCGAIN_INFO);
			
		}
		Imin = 0;
		Imax = lookup->size-1;
		
		if(INRANGE(lookup->table[Imin].regval,agcGain,lookup->table[Imax].regval))
		{
			while((Imax-Imin)>1)
			{
				i=(Imax+Imin)/2; 
				if(INRANGE(lookup->table[Imin].regval,agcGain,lookup->table[i].regval))
					Imax = i;
				else
					Imin = i;
			}
			
			rfLevel =	(((S32)agcGain - lookup->table[Imin].regval)
					* (lookup->table[Imax].realval - lookup->table[Imin].realval)
					/ (lookup->table[Imax].regval - lookup->table[Imin].regval))
					+ lookup->table[Imin].realval;
		}
		else
			rfLevel = -100;
	}
	
	return rfLevel*10;
}


/*****************************************************
--FUNCTION	::	FE_STB0899_GetCarrierQuality
--ACTION	::	Return the carrier to noise of the current carrier
--PARAMS IN	::	NONE	
--PARAMS OUT::	NONE
--RETURN	::	C/N of the carrier, 0 if no carrier 
--***************************************************/
int FE_STB0899_GetCarrierQuality(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,STTUNER_FECType_t FECType, STTUNER_FECMode_t FECMode)  
{
		int c_n = 0,
		quant,
		regval,
		Imin,
		Imax,
		i;
	long val2 = 0;
	long coeff2log10 = 646456993;
	FE_STB0899_LOOKUP_t *lookup;
	        lookup = &FE_STB0899_CN_LookUp;
	U32  nirm[2];
	
	if((FECType == STTUNER_FEC_MODE_DVBS1) || (FECMode == STTUNER_FEC_MODE_DIRECTV))
	{
		if(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_CARRIER_FOUND,FSTB0899_CARRIER_FOUND_INFO))
			{
				if((lookup != NULL) && lookup->size)
				{
					STTUNER_IOREG_GetContigousRegisters_SizeU32(DeviceMap, IOHandle,RSTB0899_NIRM,2,nirm);
					regval = MAKEWORD(nirm[0],nirm[1]);
		
					Imin = 0;
					Imax = lookup->size-1;
			
					if(INRANGE(lookup->table[Imin].regval,regval,lookup->table[Imax].regval))
					{
						while((Imax-Imin)>1)
						{
							i=(Imax+Imin)/2; 
							if(INRANGE(lookup->table[Imin].regval,regval,lookup->table[i].regval))
								Imax = i;
							else
								Imin = i;
						}
				
						c_n =	((regval - lookup->table[Imin].regval)
								* (lookup->table[Imax].realval - lookup->table[Imin].realval)
								/ (lookup->table[Imax].regval - lookup->table[Imin].regval))
								+ lookup->table[Imin].realval;
					}
					else if(regval<lookup->table[Imin].regval)
						c_n = 100;
				}
			}
		}
		else if(FECType == STTUNER_FEC_MODE_DVBS2)
		{
			
			quant=STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_UWP_ESN0_QUANT, FSTB0899_UWP_ESN0_QUANT_INFO);
			c_n=FE_DVBS2_GetUWPEsNo(DeviceMap,IOHandle,quant);
			if(c_n ==1)
				c_n = 301;
			else if(c_n == 2)
				c_n = 270;
			else
			{
				val2 = (long)(-1*(Log10Int((long)(c_n))-2*Log10Int((long)(quant))));
				val2 = MULT32X32(val2,coeff2log10);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -