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

📄 d0899_dvbs2util.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
	return tempus; /* to convert value to db tempus=(10*log10(tempus)/(quant^2)*/
				   /* with quant = UWP_ESN0_QUANT field value 				  */

}

					

/*****************************************************
**FUNCTION	::	FE_DVBS2_AutoConfigCSM
**ACTION	::	Set the CSM to Automatic mode
**PARAMS IN	::  hChip		==>	handle to the chip
**PARAMS OUT::	NONE
**RETURN	::	None
*****************************************************/
void FE_DVBS2_AutoConfigCSM(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
	/* to auto=config write a 1 to auto_param register */
	/*Set filed image value*/
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_AUTO_PARAM,FSTB0899_AUTO_PARAM_INFO,1);
}



/*****************************************************
**FUNCTION	::	FE_DVBS2_AutoConfigCSM
**ACTION	::	Set the CSM to Manual mode. 
**PARAMS IN	::  hChip		==>	handle to the chip
			::  CSMParams	==>	CSM parameters 
**PARAMS OUT::	NONE
**RETURN	::	None
*****************************************************/
void FE_DVBS2_ManualConfigCSM(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_DVBS2_CSMConfig_Params_t CSMParams)
{
	U32 val;
	/* to manually config write a 0 to auto_param register*/

	val=(CSMParams.DvtTable&0x01)+ ((CSMParams.TwoPass & 0x01)<<1)+((CSMParams.AgcGain & 0x1ff)<<2)+
		((CSMParams.AgcShift & 0x7)<<11)+ ((CSMParams.FeLoopShift & 0x7)<<14);
	
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CSMCNTRL1,val);
		
	/*configure other registers*/
	val=(CSMParams.GammaAcq & 0xf)+ ((CSMParams.GammaRhoAcq & 0x1ff)<<8 );
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CSMCNTRL2,val);

	val=(CSMParams.GammaTrack & 0xf)+ ((CSMParams.GammaRhoTrack & 0x1ff)<<8 );
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CSMCNTRL3,val); 
	
	val=(CSMParams.LockCountThreshold & 0xf)+ ((CSMParams.PhaseDiffThreshold & 0x7f)<<8 );
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CSMCNTRL4,val); 
}


/*****************************************************
**FUNCTION	::	FE_DVBS2_CSMInitialize
**ACTION	::	Set the parameters for Manual mode. 
				Should be used when QPSK pilots on and Mclk/SymbolRate<=4
**PARAMS IN	::  hChip		==>	handle to the chip
			::  Pilots		==>	Pilots On/Off
			::  ModCode		==>	found MODCODE
			::  SymbolRate	==>	Symbol Rate in Symb/s 
			::  MasterClock ==>	Demod Clock in Hz
**PARAMS OUT::	NONE
**RETURN	::	None
*****************************************************/
void FE_DVBS2_CSMInitialize(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int Pilots,FE_DVBS2_ModCod_t ModCode,U32 SymbolRate,U32 MasterClock)
{
	FE_DVBS2_CSMConfig_Params_t csmParams;
	
	csmParams.DvtTable=1;
	csmParams.TwoPass=0;
	csmParams.AgcGain=6;
	csmParams.AgcShift=0;
	csmParams.FeLoopShift=0;
	csmParams.PhaseDiffThreshold=0x80;
	
	if( ((MasterClock/SymbolRate)<=4)&&(ModCode<=11)&&(Pilots==1))
	{
		switch (ModCode)
		{
			case FE_QPSK_12:
				csmParams.GammaAcq=25;  
				csmParams.GammaRhoAcq=2700;
				csmParams.GammaTrack=12;  
				csmParams.GammaRhoTrack=180; 
				csmParams.LockCountThreshold=8;
			break;
			
			case FE_QPSK_35:
				csmParams.GammaAcq=38;  
				csmParams.GammaRhoAcq=7182;
				csmParams.GammaTrack=14; 
				csmParams.GammaRhoTrack=308; 
				csmParams.LockCountThreshold=8;
			break;
			
			case FE_QPSK_23:
				csmParams.GammaAcq=42;  
				csmParams.GammaRhoAcq=9408;
				csmParams.GammaTrack=17;  
				csmParams.GammaRhoTrack=476; 
				csmParams.LockCountThreshold=8;
			break;
			
			case FE_QPSK_34:
				csmParams.GammaAcq=53;
				csmParams.GammaRhoAcq=16642;
				csmParams.GammaTrack=19;
				csmParams.GammaRhoTrack=646;
				csmParams.LockCountThreshold=8;
			break;
			
			case FE_QPSK_45:
				csmParams.GammaAcq=53;
				csmParams.GammaRhoAcq=17119;
				csmParams.GammaTrack=22;
				csmParams.GammaRhoTrack=880;
				csmParams.LockCountThreshold=8;
			break;
			
			case FE_QPSK_56:
				csmParams.GammaAcq=55;
				csmParams.GammaRhoAcq=19250;
				csmParams.GammaTrack=23;
				csmParams.GammaRhoTrack=989;
				csmParams.LockCountThreshold=8;
			break;
			
			case FE_QPSK_89:
				csmParams.GammaAcq=60;
				csmParams.GammaRhoAcq=24240;
				csmParams.GammaTrack=24;
				csmParams.GammaRhoTrack=1176;
				csmParams.LockCountThreshold=8;
			break;
			
			case FE_QPSK_910:
				csmParams.GammaAcq=66;
				csmParams.GammaRhoAcq=29634;
				csmParams.GammaTrack=24;
				csmParams.GammaRhoTrack=1176;
				csmParams.LockCountThreshold=8;
			break;
			
			default:
				csmParams.GammaAcq=66;
				csmParams.GammaRhoAcq=29634;
				csmParams.GammaTrack=24;
				csmParams.GammaRhoTrack=1176;
				csmParams.LockCountThreshold=8;
			break;
			
		}
		
	FE_DVBS2_ManualConfigCSM(DeviceMap,IOHandle,csmParams);
	}
	
}


/*****************************************************
**FUNCTION	::	FE_DVBS2_GetCSMLock
**ACTION	::	Read the CSM status locked or not
**PARAMS IN	::  hChip		==>	handle to the chip
			::	TimeOut		==> timeout to wait for CSM lock
**PARAMS OUT::	NONE
**RETURN	::	CSM state
*****************************************************/
int FE_DVBS2_GetCSMLock(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int TimeOut)
{
	int Time=0,
		CSMLocked=0;

	while((!CSMLocked)&&(Time<TimeOut))
	{
		CSMLocked=STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_CSM_LOCK,FSTB0899_CSM_LOCK_INFO);
		/*WAIT_N_MS_899(1);*/
		Time++; 
	}
	
	return CSMLocked; 

}

/*****************************************************
--FUNCTION	::	CarrierWidth
--ACTION	::	Compute the width of the carrier
--PARAMS IN	::	SymbolRate	->	Symbol rate of the carrier (Kbauds or Mbauds)
--				RollOff		->	Rolloff * 100
--PARAMS OUT::	NONE
--RETURN	::	Width of the carrier (KHz or MHz) 
--***************************************************/
long FE_DVBS2_CarrierWidth(long SymbolRate,FE_DVBS2_RRCAlpha_t Alpha)
{
	long RollOff;
	
	switch(Alpha)
	{
		case RRC_20:
			RollOff=20;
		break;
		case RRC_25:
			RollOff=25;
		break;
		case RRC_35:
			RollOff=35;
		break;
		
	}
	return (SymbolRate  + (SymbolRate*RollOff)/100);
}


/*****************************************************
**FUNCTION	::	FE_DVBS2_GetDataLock
**ACTION	::	Read the FEC status for data lock
**PARAMS IN	::  hChip		==>	handle to the chip
			::	TimeOut		==> timeout to wait for data lock
**PARAMS OUT::	NONE
**RETURN	::	Data Lock status
*****************************************************/
int FE_DVBS2_GetDataLock(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int TimeOut)
{
	int Time=0,
	DataLocked=0;

	while((!DataLocked)&&(Time<TimeOut))
	{
		DataLocked=STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_LOCK,FSTB0899_LOCK_INFO);
		/*WAIT_N_MS_899(1);*/
		Time++; 
	}
	
	return DataLocked; 

	
}


/*****************************************************
**FUNCTION	::	FE_DVBS2_GetDemodStatus
**ACTION	::	Return the DVBS2 DEMOD status Locked or not 
**PARAMS IN	::  hChip		==>	handle to the chip
			::	timeout		==> timeout to wait for DEMOD lock.
**PARAMS OUT::	NONE
**RETURN	::	DEMOD STATE
*****************************************************/
FE_DVBS2_State FE_DVBS2_GetDemodStatus(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int timeout)
{
	int time=0;
	BOOL Locked=FALSE;
		
	do
	{   
		if(STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,RSTB0899_DMDSTAT2)==0x03) /*CSM_LOCK == 1 and UWP_LOCK ==1*/
		Locked=TRUE;
		time+=3;
		WAIT_N_MS_899(1);
		
	}while((Locked==FALSE) &&(time<=timeout));

	if(Locked)
		return FE_DVBS2_DEMOD_LOCKED;
	else	
		return FE_DVBS2_DEMOD_NOT_LOCKED;
}


/*****************************************************
**FUNCTION	::	FE_DVBS2_GetFecStatus
**ACTION	::	Return the DVBS2 FEC status Locked or not 
**PARAMS IN	::  hChip		==>	handle to the chip
			::	timeout		==> timeout to wait for FEC lock.
**PARAMS OUT::	NONE
**RETURN	::	FEC STATE
*****************************************************/
FE_DVBS2_State FE_DVBS2_GetFecStatus(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int timeout)
{
	int time=0,
		Locked;
	
	do
	{
		Locked=FE_DVBS2_GetDataLock(DeviceMap,IOHandle,1);
		time++;
		WAIT_N_MS_899(1);
		
	}while((Locked==FALSE) &&(time<timeout));

	if(Locked)
		return FE_DVBS2_DATAOK;
	else
		return FE_DVBS2_FEC_NOT_LOCKED;
}

/*****************************************************
**FUNCTION	::	FE_DVBS2_InitialCalculations
**ACTION	::	Initialize DVBS2 UWP, CSM, carrier 
				and timing loop for  Acquisition 
**PARAMS IN	::  hChip		==>	handle to the chip
			::	InitParams	==> Initializing parameters.
**PARAMS OUT::	NONE
**RETURN	::	None
*****************************************************/
void FE_DVBS2_InitialCalculations(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_STB0899_DVBS2_InitParams_t *InitParams)
{


	FE_DVBS2_UWPConfig_Params_t	uwpParams;
	FE_DVBS2_LoopBW_Params_t loopBW;
	
	S32 numSteps,
	freqStepSize,
	acqcntrl2,
	i=0;

	U32 eqcoeffs[22] = {0,0,0,0,0,0,0,0,0,0,1024,0,0,0,0,0,0,0,0,0,0,0};

	uwpParams.EsNoAve=ESNO_AVE;
	uwpParams.EsNoQuant=ESNO_QUANT;
	uwpParams.AveFramesCoarse=InitParams->AveFrameCoarse;
	uwpParams.AveframesFine =InitParams->AveFramefine;
	uwpParams.MissThreshold=MISS_THRESHOLD;
	uwpParams.ThresholdAcq=UWP_THRESHOLD_ACQ;
	uwpParams.ThresholdTrack=UWP_THRESHOLD_TRACK;
	uwpParams.ThresholdSof=UWP_THRESHOLD_SOF;
	uwpParams.SofSearchTimeout=SOF_SEARCH_TIMEOUT;
	
	loopBW.LoopBwPercent=60;
	loopBW.SymbolRate=InitParams->SymbolRate;
	loopBW.MasterClock=InitParams->MasterClock;
	loopBW.Mode=InitParams->ModeMode;
	loopBW.Zeta=707;
	loopBW.SymPeakVal=23;/**5.76*/
	
	/* config uwp and csm */ 
	FE_DVBS2_ConfigUWP(DeviceMap,IOHandle,uwpParams);
	FE_DVBS2_AutoConfigCSM(DeviceMap,IOHandle);

	/* initialize BTR	*/
	FE_DVBS2_SetSymbolRate(DeviceMap,IOHandle,InitParams->SymbolRate,InitParams->MasterClock);
	FE_DVBS2_SetBtrLoopBW(DeviceMap,IOHandle,loopBW);
	
	if(InitParams->SymbolRate/1000000 >=15)
		freqStepSize =(1<<17)/5;
	else if(InitParams->SymbolRate/1000000 >=10)
		freqStepSize =(1<<17)/7;
		
	else if(InitParams->SymbolRate/1000000 >=5)
		freqStepSize =(1<<17)/10;
	else
		freqStepSize =(1<<17)/3;

	numSteps = (10* InitParams->FreqRange*(1<<17))/(freqStepSize * (InitParams->SymbolRate/1000000));
	numSteps =(numSteps+6)/10;
	numSteps = (numSteps ==0)?1:numSteps; 
	   
	if(numSteps%2 == 0)
		FE_DVBS2_SetCarrierFreq(DeviceMap,IOHandle,InitParams->CarrierFrequency-(InitParams->StepSize*(InitParams->SymbolRate/20000000)),(InitParams->MasterClock)/1000000);
	else
		FE_DVBS2_SetCarrierFreq(DeviceMap,IOHandle,InitParams->CarrierFrequency,(InitParams->MasterClock)/1000000);
			
	/*Set Carrier Search params (zigzag, num steps and freq step size*/
	acqcntrl2=(1<<25) |(numSteps<<17) |(freqStepSize);
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_ACQCNTRL2,acqcntrl2);

}



/*****************************************************
**FUNCTION	::	FE_DVBS2_Reacquire
**ACTION	::	Trig a DVBS2 Acquisition 
**PARAMS IN	::  hChip		==>	handle to the chip				
**PARAMS OUT::	NONE
**RETURN	::	None
*****************************************************/
void FE_DVBS2_Reacquire(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
	
	S32 numSteps,
		freqStepSize,
		acqcntrl2,
		i=0;
		
	/* demod soft reset */
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_RESETCNTRL,1);

		
	/*Reset Timing Loop*/
	FE_DVBS2_BtrInit(DeviceMap,IOHandle);
	/* reset Carrier loop	*/
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CRLFREQINIT,1<<30);
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CRLFREQINIT,0); 
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CRLLOOPGAIN,0);
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CRLPHSINIT,1<<30);
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CRLPHSINIT,0);
	
	/*release demod soft reset */
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_RESETCNTRL,0);

	/* start acquistion process  */
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_ACQUIRETRIG,1);
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_LOCKLOST,0);
	
	/* equalizer Init*/
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_EQUILIZERINIT,1);

	/*Start equilizer*/
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_EQUILIZERINIT,0); 
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_EQCNTL,0x054800);

	
	/*Reset Packet Delin*/
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_ALGOSWRST,FSTB0899_ALGOSWRST_INFO,1);
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_ALGOSWRST,FSTB0899_ALGOSWRST_INFO,0);
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_HYSTSWRST,FSTB0899_HYSTSWRST_INFO,1);
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_HYSTSWRST,FSTB0899_HYSTSWRST_INFO,0);
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_PDELCTRL,0x4a);

}

⌨️ 快捷键说明

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