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

📄 d0370vsb_drv.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
	
	 WAIT_N_MS(1);
	 FSM2Lock=(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370_EQSTATE)==0x05);
	 Time++; 
	}while((FSM2Lock==0)&&(Time<pParams->TFSM2)); 

	if (STTUNER_IOREG_GetField(DeviceMap, IOHandle,F0370_EQSTATE)==0x05)							/*	Read FSM2 LOCK indicator	*/
	{
		pParams->State = FSM2OK_370VSB; 
	}
	else
	{
		pParams->State = NOFSM2_370VSB; 
	}

		
	return pParams->State;
}

/*****************************************************
**FUNCTION	::	FE_370_VSB_SetInternalError
**ACTION	::	Set the internal error value and location 
**PARAMS IN	::	Type		==> Type of the error
**				Location	==> Location of the error
**PARAMS OUT::	pError
**RETURN	::	NONE
*****************************************************/
void FE_370_VSB_SetInternalError(FE_370_VSB_ErrorType_t Type,FE_370_VSB_Location_t Location,FE_370_VSB_InternalError_t *pError)
{
	if(pError != NULL)
	{
		pError->Type = Type;
		pError->Location = Location;
	}
}


FE_370_VSB_Error_t STB0370_VSB_SetCarrier(STTUNER_IOREG_DeviceMap_t *DeviceMap,IOARCH_Handle_t IOHandle,U32 IF,int clk,U32 IQMode)
{
	FE_370_VSB_Error_t error = FE_VSB_NO_ERROR;
	S32 IFfrequency;
	if(IQMode == STTUNER_INVERSION)
	{
	IFfrequency=(S32)(IF*1000 - clk);
        }
        else
        {
        	IFfrequency=(S32)(2*clk-IF*1000);
        }
	
	Set_NCOcnst_Regs(DeviceMap,IOHandle,(int)Calc_NCOcnst(IFfrequency,clk));
	
	
	return error;
}

FE_370_VSB_Error_t STB0370_VSB_SetTiming(STTUNER_IOREG_DeviceMap_t *DeviceMap,IOARCH_Handle_t IOHandle,int clk)
{
	FE_370_VSB_Error_t error = FE_VSB_NO_ERROR;
		
	 Set_vcxoOffset_Regs(DeviceMap,IOHandle,(int)Calc_vcxoOffset(SYMBOLRATE,clk));
		
	return error;
}



/*****************************************************
--FUNCTION	::	FE_370_VSB_Algo
--ACTION	::	Search for Signal, Timing, Carrier and then data at a given Frequency, 
--				in a given range
--PARAMS IN	::	NONE
--PARAMS OUT::	NONE
--RETURN	::	Type of the founded signal (if any)
--***************************************************/
FE_370_VSB_SIGNALTYPE_t FE_370_VSB_Algo(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_370_VSB_InternalParams_t *pParams,STTUNER_Handle_t TopLevelHandle)
{

	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].Terr.Tuner;
	/*pParams->Frequency = pParams->BaseFreq;*/ /*commented for repeated call*/
	
	pParams->Ttiming  = 100;
	pParams->Tcarrier = 150;
	
	pParams->Tdata = 200;
	pParams->TFSM1 = 170;
	pParams->TFSM2 = 300;
	pParams->Frequency = pParams->BaseFreq;
	pParams->TunerOffset = 0;
	
		/* May be must called from Init routine */
		STB0370_VSB_SetCarrier(DeviceMap, IOHandle,pParams->IF,pParams->Quartz,pParams->IQMode); 
		STB0370_VSB_SetTiming(DeviceMap, IOHandle,pParams->Quartz);
	        
	     	
		
		/**********************************************/
		Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle,(U32)pParams->Frequency,(U32 *)&pParams->Frequency);	/*	Move the tuner	*/   
		
		/*	Temporisations	*/ 
		FE_370VSB_WaitTuner(TunerInstance,100);		/*	Is tuner Locked	? (wait 100 ms maxi)	*/  
		
				
		
			
	
		if(1) 
		{
						
			/*	There is signal in the band	*/
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RST_TIMING,1);
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RST_CARRIER,1);
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RSTAGC,1);
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_PRST,1);
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RSTFSM1,1);
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RSTFSM2,1);
			
			WAIT_N_MS(5);
				
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RST_TIMING,0);
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RST_CARRIER,0);
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RSTAGC,0);
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_PRST,0);
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RSTFSM1,0);
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RSTFSM2,0);		
			
			
			if(CheckCarrier(DeviceMap,IOHandle,pParams) == CARRIEROK_370VSB)
			{	
				
				pParams->FreqOffset=Get_FrequencyOffset(DeviceMap,IOHandle,pParams->Quartz);
				   
				if(CheckTiming(DeviceMap,IOHandle,pParams) == TIMINGOK_370VSB)	/*	Search for carrier	*/  			
				{
					
										
						if(CheckData(DeviceMap,IOHandle,pParams) == DATAOK_370VSB)	/*	Check for data	*/ 
						{
							
					
							if(CheckFSM1(DeviceMap,IOHandle,pParams) == FSM1OK_370VSB)	/*	Check for FSM1 Lock	*/ 
							{
								
								
								if(CheckFSM2(DeviceMap,IOHandle,pParams) == FSM2OK_370VSB)	/*	Check for FSM2 Lock	*/ 
								{
									
									
									pParams->Results.Frequency = pParams->Frequency+(pParams->FreqOffset/1000);
															
								     
								}
							}	
						}
					}
				}
		}
	
		
		

	
	pParams->Results.SignalType = pParams->State;    
	
	return	pParams->State;
}

/*****************************************************
--FUNCTION	::	FE_370_VSB_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_370_VSB_Error_t	FE_370_VSB_Search(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,
						FE_370_VSB_SearchParams_t	*pSearch,
						FE_370_VSB_SearchResult_t	*pResult,
						 STTUNER_Handle_t            TopLevelHandle)
{
	FE_370_VSB_Error_t error = FE_VSB_NO_ERROR;
	FE_370_VSB_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_370_VSB_SetInternalError(FE_VSB_IERR_NO,FE_VSB_LOC_NOWHERE,&pParams.Error);
	
		if(1)
		{
			if(1)
			{
			
				/* 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;
				
				
				/* Run the search algorithm */
				error = (TunerInstance->Driver->tuner_GetStatus)(TunerInstance->DrvHandle, &TunerStatus);
				pParams.IF = TunerStatus.IntermediateFrequency ;
				
				if(FE_370_VSB_Algo(DeviceMap, IOHandle,&pParams,TopLevelHandle) == FSM2OK_370VSB)
				{
					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_VSB_IERR_I2C:				/*	I2C error	*/
							error = FE_VSB_I2C_ERROR;
						break;
				
						case FE_VSB_IERR_NO:
						default:
							error = FE_VSB_SEARCH_FAILED;
						break;
					}
				}
				
			}
			else
				error = FE_VSB_BAD_PARAMETER;
			
		}
	
	
	return error;
}

void FE_370_VSB_Status(FE_370_VSB_Handle_t	Handle,FE_370_VSB_SIGNALTYPE_t *SignalType)  
{
	if(Handle)
		*SignalType = ((FE_370_VSB_InternalParams_t *)Handle)->Results.SignalType;
}

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

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

	
	return ( c_n);
}

/*****************************************************
--FUNCTION	::	FE_370_VSB_GetBitErrorRate
--ACTION	::	Return the bit error rate 
--PARAMS IN	::	NONE	
--PARAMS OUT::	NONE
--RETURN	::	100000000 * ber 
--***************************************************/
S32 FE_370_VSB_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_370_BER_LookUp.size)
		{

			regval = MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370_SER_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370_SER_LSB));
			regval =regval*10000; 
			
			
			divider= MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370_SER_PERIOD_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370_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_370_BER_LookUp.size-1;
			
			if(INRANGE(FE_370_BER_LookUp.table[Imin].regval,regval,FE_370_BER_LookUp.table[Imax].regval))
			{
				while((Imax-Imin)>1)
				{
					i=(Imax+Imin)/2; 
					if(INRANGE(FE_370_BER_LookUp.table[Imin].regval,regval,FE_370_BER_LookUp.table[i].regval))
						Imax = i;
					else
						Imin = i;
				}
				
				ber =	((regval - FE_370_BER_LookUp.table[Imin].regval)
						* (FE_370_BER_LookUp.table[Imax].realval - FE_370_BER_LookUp.table[Imin].realval)
						/ (FE_370_BER_LookUp.table[Imax].regval - FE_370_BER_LookUp.table[Imin].regval))
						+ FE_370_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 + -