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

📄 d0372_drv.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
	U8 AgcVal1,AgcVal2,AgcVal3; 
	/* top level public instance data */ 
        Inst = STTUNER_GetDrvInst();
       
        /* get the tuner instance for this driver from the top level handle */
        TunerInstance = &Inst[TopLevelHandle].Terr.Tuner;
	/*pParams->Frequency = pParams->BaseFreq;*/ /*commented for repeated call*/
	
	pParams->Ttiming  = 100;
	pParams->Tcarrier = 150;
	
	pParams->Tdata = 200;
	pParams->TFSM1 = 500;
	pParams->TFSM2 = 300;
	pParams->Frequency = pParams->BaseFreq;
	pParams->TunerOffset = 0;
	EQResetNb=0;
		
	/* May be must called from Init routine */
	STV0372_SetCarrier(DeviceMap, IOHandle,pParams->IF,pParams->Quartz,pParams->IQMode); 
	STV0372_SetTiming(DeviceMap, IOHandle,pParams->Quartz);
	   
	   
	     	
	/**********************************************/
	Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle,(U32)pParams->Frequency,(U32 *)&pParams->Frequency);	/*	Move the tuner	*/   
		
	/*	Temporisations	*/ 
	FE_372_WaitTuner(TunerInstance,100);		/*	Is tuner Locked	? (wait 100 ms maxi)	*/  
	
	
	
	/*Power estimation. Check whether power level is within 
	 threshold level or not. If yes then proceed for lock
	  else return without doing anything*/
	  
	  AgcVal1 = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_AGC_IND_LSB);
	  AgcVal2 = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_AGC_IND_MSB);
	  AgcVal3 = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_AGC_IND_MMSB);
	  
	  powerestimation=AgcVal1 + AgcVal2*256+ AgcVal3*65536; 
	          					
	
	
	if (powerestimation>=131072)
	{
		powerestimation= powerestimation-262144;
		
		}
	
	if(powerestimation<=0)
	{
		powerestimation=-powerestimation;
	}
		
	powerestimation=(S32)(powerestimation/(UTIL_372_PowOf2(11-STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_AGCBWSEL))));
	if ((powerestimation< pParams->LOWPowerTh)||(powerestimation > pParams->UPPowerTh))
	{		
		pParams->State=NOPOWER_372;		
		return pParams->State;
	}
	else
	{		
		pParams->State=POWEROK_372;
		
	}	
				
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_MAXNBFRAMEDD_LSB,0x00)	;
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_MAXNBFRAMERCA,0x00)	;
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_NCO_TIMEOUT_MMSB,0x00)	;
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_NCO_TIMEOUT_MSB,0x00)	;
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_NCO_TIMEOUT_LSB,0x00);
			
	
		
						
	/*	There is signal in the band	*/
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_TIMING,1);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_CARRIER,1);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTAGC,1);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM1,1);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,0);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,1);
			
	WAIT_N_MS_372(5);
			
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTAGC,0);	
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_CARRIER,0);			
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_TIMING,0);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM1,0);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,1); 
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,0);		
			
			
	FirstWatchdog=time_now();
		
	if(CheckFSM1_372(DeviceMap,IOHandle,pParams) == FSM1OK_372)	/*	Check for FSM1 Lock	*/ 
	   {
		
		do
		 {
		   EQState=STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_EQSTATE); /* Read EQSTATE */
									
			if (EnableEQreset)
			   {
				FirstTimeOutEQ=time_now();
			   }
										
			if(EQState==0)
			  {
										
				/* FULL RESET */
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTAGC,1);
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_TIMING,1);
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_CARRIER,1);
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM1,1);
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,0);
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,1);
		
				WAIT_N_MS_372(20);

				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTAGC,0);
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_CARRIER,0); 
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_TIMING,0);
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM1,0);
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,1); 
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,0);		
				
				/* END OF FULL RESET */
	
				Watchdog= time_now()-FirstWatchdog;

				if ( Watchdog<=pParams->Watchdog )
				   {
					FirstTimeOutEQ=time_now();
					EnableEQreset=1;
				   }
				else
				   {
					pParams->State = NOFSM2_372;											
				   }
							
			   }
									  
									  
			   if(EQState>5)  
			     {
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,0);  /* Reset Equalizer */
				WAIT_N_MS_372(5); 
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,1); 
							
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,1);   
				WAIT_N_MS_372(5); 
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,0); 
									  	
				Watchdog= time_now()-FirstWatchdog;

				if ( Watchdog<=pParams->Watchdog )
				   {
					FirstTimeOutEQ=time_now();
					EnableEQreset=1;
				   }

				else
				   {
					pParams->State = NOFSM2_372;
				   }											
									  
			     }
									  
									  
			   if(EQState==5)  
			     {
				   EQState   = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_EQSTATE);
				   MAINState = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_MAINSTATE);
								  
				   Watchdog= time_now()-FirstWatchdog;
									  
				   if((MAINState==0x0A)&&(EQState==0x05))    
				     {
				     				
							pParams->FreqOffset=UTIL_372_Get_FrequencyOffset(DeviceMap,IOHandle,pParams->Quartz);   
							pParams->Results.Frequency = pParams->Frequency+(pParams->FreqOffset/1000);
							pParams->Results.EQResetNB = EQResetNb;
																		/*	Read FSM2 LOCK indicator	*/
							pParams->State = FSM2OK_372; 

						    }
						  else
						    {
							pParams->State = NOFSM2_372;
						     }
									  
				           }
									  
				if((EQState>0)&&(EQState<5))  
				  {
						TimeOutEQ=time_now()- FirstTimeOutEQ;
						if(TimeOutEQ>pParams->TimeOut) 
						   {
							STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,0);  /* Reset Equalizer */
							WAIT_N_MS_372(5); 
							STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,1); 
							
							STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,1);   
							WAIT_N_MS_372(5); 
							STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,0); 
									  	
							Watchdog= time_now()-FirstWatchdog;

						if ( Watchdog<=pParams->Watchdog )
						    {
							 FirstTimeOutEQ=time_now();
							 EnableEQreset=1;
						    }
												
						else
						    {
							pParams->State = NOFSM2_372;											
						    }
					 }
					else
					 {
						EnableEQreset=0; 
						Watchdog= time_now()-FirstWatchdog;
					 }
									  	
					}
									  
									  
										
				}
				while( (Watchdog <= pParams->Watchdog)&&(pParams->State != FSM2OK_372)&&(pParams->State != NOFSM2_372) );
			    }	
		
	
	
	pParams->Results.SignalType = pParams->State;    
	
	return	pParams->State;
}

/*****************************************************
--FUNCTION	::	FE_372_Search
--ACTION	::	Search for a valid transponder
--PARAMS IN	::	Handle	==>	Front End Handle
pSearch ==> Search parameters
pResult ==> Result of the search
--PARAMS OUT::	NONE
--RETURN	::	Error (if any)
--***************************************************/
FE_372_Error_t	FE_372_Search(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,
							  FE_372_SearchParams_t	*pSearch,
							  FE_372_SearchResult_t	*pResult,
							  STTUNER_Handle_t            TopLevelHandle)
{
	FE_372_Error_t error = FE_372_NO_ERROR;
	FE_372_InternalParams_t pParams;
	STTUNER_tuner_instance_t *TunerInstance; 
	STTUNER_InstanceDbase_t     *Inst;
	TUNER_Status_t  TunerStatus; 
	/* top level public instance data */ 
	Inst = STTUNER_GetDrvInst();
	
	/* get the tuner instance for this driver from the top level handle */
	TunerInstance = &Inst[TopLevelHandle].Terr.Tuner;
	
	
	/*This is to be put in initparams*/pParams.Quartz = 27000000; /*For 27Mhz Quartz Frequency*/
	
	FE_372_SetInternalError(FE_372_IERR_NO,FE_372_LOC_NOWHERE,&pParams.Error);
	
	
	/* Fill pParams structure with search parameters */
	pParams.BaseFreq = pSearch->Frequency;	
	pParams.SymbolRate = pSearch->SymbolRate;
	
	pParams.SearchRange = pSearch->SearchRange;
	pParams.DerotPercent = 30;
	pParams.IQMode = pSearch->IQMode;
	pParams.Watchdog = pSearch->FistWatchdog;	
	pParams.TimeOut = pSearch->DefaultWatchdog;
	pParams.LOWPowerTh = pSearch->LOWPowerTh;	
	pParams.UPPowerTh = pSearch->UPPowerTh;
				
	/* Run the search algorithm */
	error = (TunerInstance->Driver->tuner_GetStatus)(TunerInstance->DrvHandle, &TunerStatus);
	pParams.IF = TunerStatus.IntermediateFrequency ;
				
	if(FE_372_Algo(DeviceMap, IOHandle,&pParams,TopLevelHandle) == FSM2OK_372)
	  {
		pResult->Locked = TRUE;
		/* update results */
		pResult->Frequency = pParams.Results.Frequency;			
		pResult->SymbolRate = pParams.Results.SymbolRate;										
	  }
	else
	  {
		pResult->Locked = FALSE;
					
		switch(pParams.Error.Type)
			{
			   case FE_372_IERR_I2C:				/*	I2C error	*/
				error = FE_372_I2C_ERROR;
				break;
						
			   case FE_372_IERR_NO:
				default:
			   error = FE_372_SEARCH_FAILED;
				break;
			}
	  }
				
				
				
				
  return error;
}

void FE_372_Status(FE_372_Handle_t	Handle,FE_372_SIGNALTYPE_t *SignalType)  
{
	if(Handle)
		*SignalType = ((FE_372_InternalParams_t *)Handle)->Results.SignalType;
}

/*****************************************************
--FUNCTION	::	FE_372_GetCarrierToNoiseRatio
--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 
--***************************************************/
S32 FE_372_GetCarrierToNoiseRatio(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
	S32 c_n = 0,
		regval,
		Imin,
		Imax,
		i;
	
		if(FE_372_CN_LookUp.size)
		{

			regval = MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_ERROR_POWER_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_ERROR_POWER_LSB));
			Imin = 0;
			Imax = FE_372_CN_LookUp.size-1;
			
			if(INRANGE(FE_372_CN_LookUp.table[Imin].regval,regval,FE_372_CN_LookUp.table[Imax].regval))
			{
				while((Imax-Imin)>1)
				{
					i=(Imax+Imin)/2; 
					if(INRANGE(FE_372_CN_LookUp.table[Imin].regval,regval,FE_372_CN_LookUp.table[i].regval))
						Imax = i;
					else
						Imin = i;
				}
				
				c_n =	((regval - FE_372_CN_LookUp.table[Imin].regval)
						* (FE_372_CN_LookUp.table[Imax].realval - FE_372_CN_LookUp.table[Imin].realval)
						/ (FE_372_CN_LookUp.table[Imax].regval - FE_372_CN_LookUp.table[Imin].regval))
						+ FE_372_CN_LookUp.table[Imin].realval;
			}
			else
				c_n = 10;
		}

	
	return ( c_n);
}

/*****************************************************
--FUNCTION	::	FE_372_GetBitErrorRate
--ACTION	::	Return the bit error rate 
--PARAMS IN	::	NONE	
--PARAMS OUT::	NONE
--RETURN	::	100000000 * ber 
--***************************************************/
S32 FE_372_GetBitErrorRate(STTUNER_IOREG_DeviceMap_t *DeviceMap,IOARCH_Handle_t IOHandle)
{
	S32 ber = 0,
		regval,
		divider,
		Imin,
		Imax,
		i;
	unsigned char low_precision=1;	
	
		if(FE_372_BER_LookUp.size)
		{

			regval = MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_SER_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_SER_LSB));
			regval =regval*10000; 
			
			
			divider= MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_SER_PERIOD_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_SER_PERIOD_LSB));
			if (regval < divider )/*If regval*10e4 < divider then div of regval by
			                      divider will give 0. To avoid this multiply regval by 100 */
			{
				regval = regval *100;
				low_precision=0;
			}
			else
			{
				low_precision =1;
			}
			
			if (divider!=0)
			{
			regval/=divider;
			
			}
			
			if (low_precision ==1 )/*Now multiply after division by 100 if it is not multiplied by 10e6 before*/
			{
		        regval =regval *100;
		        }
		        
			Imin = 0;
			Imax = FE_372_BER_LookUp.size-1;
			
			if(INRANGE(FE_372_BER_LookUp.table[Imin].regval,regval,FE_372_BER_LookUp.table[Imax].regval))
			{
				while((Imax-Imin)>1)
				{
					i=(Imax+Imin)/2; 
					if(INRANGE(FE_372_BER_LookUp.table[Imin].regval,regval,FE_372_BER_LookUp.table[i].regval))
						Imax = i;
					else
						Imin = i;
				}
				
				ber =	((regval - FE_372_BER_LookUp.table[Imin].regval)
						* (FE_372_BER_LookUp.table[Imax].realval - FE_372_BER_LookUp.table[Imin].realval)
						/ (FE_372_BER_LookUp.table[Imax].regval - FE_372_BER_LookUp.table[Imin].regval))
						+ FE_372_BER_LookUp.table[Imin].realval;
			}
			else
				ber = 684546;
		}

	
	return ber; /* returned value is 100000000 time the ber */
}

/*
--
--==============================================================================
--
-- END of the source code .
--
--==============================================================================
--
--   TTT  H H  EEE
--    T   HHH  EE
--    T   H H  EEE
--
--
--             EEEEEEEEEEEE        NNNNNNNN      NNNN       DDDDDDDDDDDDDD
--             EEEEEEEEEEEE        NNNNNNNN      NNNN       DDDDDDDDDDDDDDDD
--             EEEE                NNNN NNNN     NNNN       DDDD         DDDD
--             EEEE                NNNN  NNNN    NNNN       DDDD          DDDD
--             EEEEEEEE            NNNN   NNNN   NNNN       DDDD          DDDD
--             EEEEEEEE            NNNN    NNNN  NNNN       DDDD          DDDD
--             EEEE                NNNN     NNNN NNNN       DDDD         DDDD
--             EEEE                NNNN      NNNNNNNN       DDDD        DDDD
--             EEEEEEEEEEEE        NNNN       NNNNNNN       DDDDDDDDDDDDDDD
--             EEEEEEEEEEEE        NNNN        NNNNNN       DDDDDDDDDDDDDD
--
--
*/

⌨️ 快捷键说明

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