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

📄 drv0899.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 5 页
字号:

			}
		}
		else
		{
			Params->Results.SymbolRate = Params->SymbolRate;
		}
		
		Params->Direction = -Params->Direction;			/*	Change the zigzag direction	*/    
	}
	while(	(Params->State!=CARRIEROK_899) && NextLoop);
	
	
	if(Params->State == CARRIEROK_899)
	{
		
		STTUNER_IOREG_GetContigousRegisters_SizeU32(DeviceMap, IOHandle,RSTB0899_CFRM,2, cfrm); 								/*	Get the derotator frequency	*/ 
		cfrm[0]&=0xff;
		cfrm[1]&=0xff;
		Params->DerotFreq =(short int)Params->TunerIQSense*((short int) MAKEWORD(cfrm[0],cfrm[1]));

	}
	else
	{
		Params->DerotFreq = LastDerotFreq;	
	}
	
	
	return Params->State;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_SearchData
--ACTION	::	Search a QPSK carrier with the derotator, even if there is a false lock 
--PARAMS IN	::	
--PARAMS OUT::	NONE
--RETURN	::	NOCARRIER_899 if no carrier had been found, CARRIEROK_899 otherwise 
--***************************************************/
FE_STB0899_SIGNALTYPE_t FE_STB0899_SearchData(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_STB0899_InternalParams_t *Params)
{
	short int	DerotFreq,
				DerotStep,
				DerotLimit,
				NextLoop = 3;
	int 	index = 1;
	U32   cfrm[2];
	
	DerotStep = (Params->SymbolRate/4)/Params->Mclk; 
	DerotLimit = (Params->SubRange/2)/Params->Mclk;      
	DerotFreq = Params->DerotFreq;
		
	do
	{
		if((Params->State != CARRIEROK_899) || (FE_STB0899_CheckData(DeviceMap, IOHandle, Params)!= DATAOK_899))
		{
			DerotFreq += (short int)Params->TunerIQSense*index*Params->Direction*DerotStep;		/*	Compute the next derotator position for the zig zag	*/ 
		
			if(ABS(DerotFreq) > DerotLimit)
				NextLoop--;
			
			if(NextLoop)
			{
				
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_CFD_ON,FSTB0899_CFD_ON_INFO,1);
			
				cfrm[0] = MSB((short int)DerotFreq);
				cfrm[1] = LSB((short int)DerotFreq);
				STTUNER_IOREG_SetContigousRegisters_SizeU32(DeviceMap, IOHandle, RSTB0899_CFRM,cfrm,2); 							/*	Reset the derotator frequency */	
				FE_STB0899_CheckCarrier(DeviceMap, IOHandle, Params);
			
				
			
				index++;
			}
		}
		
		Params->Direction = -Params->Direction;			/*	Change the zigzag direction	*/  
	}
	while((Params->State != DATAOK_899) && NextLoop);
	
	if(Params->State == DATAOK_899)
	{
		
		STTUNER_IOREG_GetContigousRegisters_SizeU32(DeviceMap, IOHandle,RSTB0899_CFRM,2, cfrm); 								/*	Get the derotator frequency	 */
		cfrm[0]&=0xff;
		cfrm[1]&=0xff;
		Params->DerotFreq = (short int)Params->TunerIQSense*((short int) MAKEWORD(cfrm[0],cfrm[1]));

	}	
	
	return Params->State;
}



/****************************************************
--FUNCTION	::	FE_STB0899_CheckRange
--ACTION	::	Check if the founded frequency is in the correct range
--PARAMS IN	::	Params->BaseFreq =>	
--PARAMS OUT::	Params->State	=>	Result of the check
--RETURN	::	RANGEOK_899 if check success, OUTOFRANGE_899 otherwise 
--***************************************************/
FE_STB0899_SIGNALTYPE_t FE_STB0899_CheckRange(FE_STB0899_InternalParams_t *Params) 
{
	int	RangeOffset,
		TransponderFrequency;
		
	RangeOffset = Params->SearchRange/2000;  
	TransponderFrequency = Params->Frequency + (S32)((Params->DerotFreq * ((S16)(Params->Mclk)))/1000);
	
	if((TransponderFrequency >= Params->BaseFreq - RangeOffset)
	&& (TransponderFrequency <= Params->BaseFreq + RangeOffset))
		Params->State = RANGEOK_899;
	else
		Params->State = OUTOFRANGE_899;
		
	return Params->State;
}

/****************************************************
--FUNCTION	::	FE_899_CarrierNotCentered
--ACTION	::	Check if the carrier is correctly centered
--PARAMS IN	::		
--PARAMS OUT::	
--RETURN	::	1 if not centered, 0 otherwise
--***************************************************/
int FE_899_CarrierNotCentered(FE_STB0899_InternalParams_t *Params,int AllowedOffset)
{
	int NotCentered = 0,
		DerotFreq;
	long Fs;
	
	Fs = FE_899_CarrierWidth(Params->SymbolRate,Params->RollOff);
	DerotFreq = abs(Params->DerotFreq * Params->Mclk); 
	
	if(Fs < 4000000)
		NotCentered = (int)(Params->TunerBW - Fs)/4 ;
	else
		NotCentered = ((Params->TunerBW/2 - (U32)DerotFreq - (U32)(Fs/2)) < AllowedOffset) && (DerotFreq > Params->TunerStep);
	
	return NotCentered;
}


/****************************************************
--FUNCTION	::	FE_899_FirstSubRange
--ACTION	::	Compute the first SubRange of the search 
--PARAMS IN	::	Params->SearchRange
--PARAMS OUT::	Params->SubRange
--RETURN	::	NONE
--***************************************************/
void FE_899_FirstSubRange(STTUNER_tuner_instance_t *TunerInstance, FE_STB0899_InternalParams_t *Params)
{
	int maxsubrange;
	
	maxsubrange = (int)((Params->TunerBW)*1000 - (U32)FE_899_CarrierWidth(Params->SymbolRate,Params->RollOff)/2);
	
	if(maxsubrange > 0)
		Params->SubRange = MIN(Params->SearchRange,maxsubrange);
	else
		Params->SubRange = 0;
	Params->Frequency = Params->BaseFreq;
	Params->TunerOffset = 0;
	
	Params->SubDir = 1;

}

  
/****************************************************
--FUNCTION	::	FE_899_NextSubRange
--ACTION	::	Compute the next SubRange of the search 
--PARAMS IN	::	Frequency	->	Start frequency
--				Params->SearchRange
--PARAMS OUT::	Params->SubRange
--RETURN	::	NONE
--***************************************************/
void FE_899_NextSubRange(FE_STB0899_InternalParams_t *Params)
{
	S32 OldSubRange;
	
	if(Params->SubDir > 0)
	{
		OldSubRange = Params->SubRange;
		Params->SubRange = MIN((S32)(Params->SearchRange/2) - (Params->TunerOffset + Params->SubRange/2),Params->SubRange);
		if(Params->SubRange < 0)
			Params->SubRange = 0;	
		Params->TunerOffset += (OldSubRange + Params->SubRange)/2;
	}
	
	Params->Frequency = Params->BaseFreq + (Params->SubDir * Params->TunerOffset)/1000;    
	Params->SubDir = -Params->SubDir;

}

/*****************************************************
--FUNCTION	::	FE_STB0899_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_STB0899_SIGNALTYPE_t FE_STB0899_Algo(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_STB0899_InternalParams_t *Params, STTUNER_Handle_t TopLevelHandle)
{
	/*S32	pr,sn,to,hy;*/
		/*beta value for 99MHz*/
    S32	betaTab[5][4]=	{   /*5MBs*/	/*10MBs*/   /*20MBs*/   /*30Mbs*/
			/*QPSK 1/2 */		37,			34,			32,			31,
			/*QPSK 2/3 */		37,			35,			33,			31,
			/*QPSK 3/4 */		37,			35,			33,			31,
			/*QPSK 5/6 */		37,			36,			33,			32,
			/*QPSK 7/8 */		37,			36,			33,			32
						};
    S32 clnI=3;	
    U32   cfrm[2]={0,0},EqCoeffs[10];	
    STTUNER_InstanceDbase_t *Inst;
    STTUNER_tuner_instance_t *TunerInstance;   
    ST_ErrorCode_t Error;
    U32 TransponderFreq;
    /* 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;


	Params->Frequency = Params->BaseFreq;
	Params->Direction = 1;
	
	FE_STB0899_SetSymbolRate(DeviceMap, IOHandle, Params->MasterClock,Params->SymbolRate);	/*	Set the symbol rate	*/
	/* Carrier loop optimization versus symbol rate */
	
	if(Params->SymbolRate <= 5000000)
	{
		STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_ACLC,0x89);
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_BETA,FSTB0899_BETA_INFO,0x1c);
		clnI=0;
	}
	else if(Params->SymbolRate <= 15000000)
	{
		STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_ACLC,0xc9);
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_BETA,FSTB0899_BETA_INFO,0x22);
		clnI=1;
	}
	else if(Params->SymbolRate <= 125000000)
	{
		STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_ACLC,0x89);
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_BETA,FSTB0899_BETA_INFO,0x27);
		clnI=2;
	}
	else
	{
		STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_ACLC,0xc8);
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_BETA,FSTB0899_BETA_INFO,0x29);
		clnI=3;
	}
	/*Set the timing loop to acquisition  */
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_RTC,0x46);
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CFD,0xee);

			
	/*	Initial calculations	*/
	Params->DerotStep = Params->DerotPercent*(Params->SymbolRate/1000)/Params->Mclk;	/*	step of DerotStep/1000 * Fsymbol	*/     
	Params->Ttiming = (S16)FE_STB0899_TimingTimeConstant(Params->SymbolRate);
	Params->Tderot = (S16)FE_STB0899_DerotTimeConstant(Params->SymbolRate);
	Params->Tdata = 500; /*2 + FE_STB0899_DataTimeConstant(pr,sn,to,hy,Params->SymbolRate);*/
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_FRESRS, FSTB0899_FRESRS_INFO,1);  /* Reset Stream Merger*/
	/*FE_899_FirstSubRange(TunerInstance, Params);*/
	Params->SubRange = 10000000;
	Params->Frequency = Params->BaseFreq;
	Params->TunerOffset = 0;
	Params->SubDir = 1;
	
	do
	{ 
		/*	Initialisations	*/
		/*	Initialisations	*/
		STTUNER_IOREG_SetContigousRegisters_SizeU32(DeviceMap, IOHandle,RSTB0899_CFRM,cfrm,2);		/*	Reset of the derotator frequency */	
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_TIMING_LOOP_FREQ,FSTB0899_TIMING_LOOP_FREQ_INFO,0xf2);
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_CFD_ON,FSTB0899_CFD_ON_INFO,1);
		
		Params->DerotFreq = 0;
		Params->State = NOAGC1_899;
		TransponderFreq = Params->Frequency;
		Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, (U32)Params->Frequency, (U32 *)&Params->Frequency);
		
		if(Error != ST_NO_ERROR)
		{
			return(NOAGC1_899);
		}
		/*	Temporisations	*/
		WAIT_N_MS_899(10);	/*	Wait for agc1,agc2 and timing loop	*/
		tuner_tunsdrv_Utilfunction(TunerInstance->DrvHandle, VCO_SEARCH_OFF);
		
		Params->State = AGC1OK_899;	/* No AGC test actually */  
		/*	There is signal in the band	*/
		if(Params->SymbolRate <= (Params->TunerBW)/2)	   
			FE_STB0899_SearchTiming(DeviceMap, IOHandle,Params);			/*	For low rates (SCPC)	*/
		else
			FE_STB0899_CheckTiming(DeviceMap, IOHandle,Params);			/*	For high rates (MCPC)	*/ 
		
		if(Params->State == TIMINGOK_899)
		{	
			if(FE_STB0899_SearchCarrier(DeviceMap, IOHandle, Params) == CARRIEROK_899)	/*	Search for carrier	*/  			
			{
				
				if(FE_STB0899_SearchData(DeviceMap, IOHandle, Params) == DATAOK_899)	/*	Check for data	*/ 
				{
					
					if(FE_STB0899_CheckRange(Params) == RANGEOK_899)
					{
						
						Params->Results.Frequency = Params->Frequency + (Params->DerotFreq*((S16)(Params->Mclk)))/1000; 
						Params->Results.PunctureRate = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_VIT_CURPUN, FSTB0899_VIT_CURPUN_INFO); 
					}
				}
			}
		}
		
		if(Params->State != RANGEOK_899) 
			FE_899_NextSubRange(Params);
		
	}	  
	while(Params->SubRange && Params->State!=RANGEOK_899);
	
	Params->Results.SignalType = Params->State;
	/*if locked and range is ok set Kdiv value*/
	if(Params->State == RANGEOK_899)
	{
		/*Set the timing loop to tracking  */
		STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_RTC,0x23);
		STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CFD,0xF7);
		switch(Params->Results.PunctureRate)
		{
			case 13:		/*1/2*/
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_KDIVIDER,FSTB0899_KDIVIDER_INFO,0x1a);
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_BETA,FSTB0899_BETA_INFO,betaTab[0][clnI]);
			break;
			
			case 18:		/*2/3*/
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_KDIVIDER,FSTB0899_KDIVIDER_INFO,44/*0x27*/);
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_BETA,FSTB0899_BETA_INFO,betaTab[1][clnI]);
			break;
			
			case 21:		/*3/4*/
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_KDIVIDER,FSTB0899_KDIVIDER_INFO,/*0x34*/60);
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_BETA,FSTB0899_BETA_INFO,betaTab[2][clnI]);
			break;
			
			case 24:		/*5/6*/
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_KDIVIDER,FSTB0899_KDIVIDER_INFO,75/*0x4f*/);
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_BETA,FSTB0899_BETA_INFO,betaTab[3][clnI]);
			break;
			
			case 25:		/*6/7*/	
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_KDIVIDER,FSTB0899_KDIVIDER_INFO,/*0x5c*/80);
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_BETA,FSTB0899_BETA_INFO,betaTab[3][clnI]);
			break;
			
			case 26:		/*7/8*/	
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_KDIVIDER,FSTB0899_KDIVIDER_INFO,94/*0x6a*/);
				STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_BETA,FSTB0899_BETA_INFO,betaTab[4][clnI]);
			break;
			
		}
		
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_FRESRS,FSTB0899_FRESRS_INFO,0); /*release Stream merger reset*/ 
		STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_CFD_ON,FSTB0899_CFD_ON_INFO,0); /*Disable Carrier detector*/ 
	

⌨️ 快捷键说明

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