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

📄 drv0370qam.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
	/*	AcqLoopsTime (In ms): It Is The Time Required For The Lock
		Of The Carrier And Timing Loops */
	switch (QAMSize)
	{
		case 16:
			Log2QAMSize = 4;
			break;
		case 32:
			Log2QAMSize = 5;
			break;
		case 64:
			Log2QAMSize = 6;
			break;
		case 128:
			Log2QAMSize = 7;
			break;
		case 256:
			Log2QAMSize = 8;
			break;
	}
	NbSymbols = 100000;	/* 100000 Symbols Needed At Least To Lock The STL */
	AcqLoopsTime = (int) (NbSymbols/(SymbolRate/1000));	/* In ms */

	/*	SweepRate = 1000*(Sweep Rate/Symbol Rate)
		CarrierOffset = 10000 * (Offset/Symbol Rate)
		Then:
		LMS2TimeOut = 100 * (CarrierOffset/SweepRate)
		In Order To Scan [-Offset, +Offset], We Must Double LMS2TimeOut
		And To Be Safer, 25% Margin Is Added */
	if(SweepRate != 0)	/* TimeOut When Sweep Function Is Used */
	{
		LMS2TimeOut  = 250*CarrierOffset;
		LMS2TimeOut /= SweepRate;	/* In ms */
		if (LMS2TimeOut < 0)	LMS2TimeOut = - LMS2TimeOut;
		/*	Even In Low Carrier Offset Cases, LMS2TimeOut Must Not Be Lower Than A Minimum
			Value Which Is Linked To The QAM Size. */
		switch (QAMSize)
		{
			case 16:
				if( LMS2TimeOut < 50)
					LMS2TimeOut = 100;
				break;
			case 32:
				if( LMS2TimeOut < 50)
					LMS2TimeOut = 150;
				break;
			case 64:
				if( LMS2TimeOut < 50)
					LMS2TimeOut = 100;
				break;
			case 128:
				if( LMS2TimeOut < 100)
					LMS2TimeOut = 200;
				break;
			case 256:
				if( LMS2TimeOut < 100)
					LMS2TimeOut = 150;
				break;
		}
	}
	else						/* TimeOut When Estimator Is Used */
		LMS2TimeOut = 200;	/* Actual TimeOuts Will Be Used In Following Releases */

	/*	The Equalizer Timeout Must Be Greater Than The Carrier And Timing Lock Time */
	LMS2TimeOut += AcqLoopsTime;
	
	/******************************/
	/*	Chip Initialization			*/
	/******************************/
	
	LoadRegisters(DeviceMap,IOHandle,QAMSize,TunerInstance_p->Driver->ID);

	
	/******************************/
	/*	Derotator Initialization	*/
	/******************************/
	
	Clk50_QAM = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_CLK50_QAM);
	multiply_factor_times_quartz =((-2*Clk50_QAM* pParams->Quartz)/3)+((8*pParams->Quartz)/3);
	
	/* The Initial Demodulator Frequency Is Set If enabled */
	if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_IN_DEMOD_EN) ==1)
		Driv0370QAMDemodSetting(DeviceMap,IOHandle,pParams->InitDemodOffset,multiply_factor_times_quartz,pParams->IF);
	/**/
	/******************************/
	/*	Delayed AGC Initialization	*/
	/******************************/
	/* Wide Band AGC Loop Freeze, Wide Band AGC Clear And
	 Wide Band AGC Status Forced To Unlock Position */
	
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,R0370QAM_WBAGC_3,0x40);
	/* Wide Band AGC AGC2SD Initialisation To 25% Range */
	AGC2SD = 256;
	Reg0370QAM_SetAGC(DeviceMap, IOHandle,AGC2SD);
	/* AGC RollOff Set To 384 And Acquisition Threshold To 512
	 In Order To Speed-up The WBAGC Lock. Old values are saved*/
	AGCLoop = Reg0370QAM_GetWBAGCloop(DeviceMap,IOHandle);
	ACQThreshold = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_ACQ_TH);
	Reg0370QAM_SetWBAGCloop(DeviceMap,IOHandle,384);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_ACQ_TH,9);
	/**/
	

	/******************************/
	/*	STL Initialization			*/
	/******************************/
	/* Symbol Timing Loop Reset And Release
	 Both Integral And Direct Paths Are Cleared */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_STL_RESET,1);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_STL_RESET,0);
	/* Integral Path Enabled Only After The WBAGC Lock */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_ERR_EN,0);
	/* Direct Path Enabled Immediatly */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_PHASE_EN,1);
	/******************************/
	/*	CRL Initialization			*/
	/******************************/
	/* Carrier Recovery Loop Reset And Release
	 Frequency And Phase Offset Cleared As Well As All Internal Signals */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_CRL_RESET,1);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_CRL_RESET,0);
	/* Integral Path Enabled Only After The PMFAGC Lock */
	/* Direct Path Enabled Only After The PMFAGC Lock */
	/* Sweep OFF */
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,R0370QAM_CRL_2,0x02);
	/* Corner Detector OFF */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_LOCK_DETECT_ENA,0);
	/* PN Loop Bypass */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_BYP_SEC_LOOP,1);
	/* Fading Detector OFF */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_EN_FADDET,0);
	/* Frequency Estimator Reset */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_FREQ_EST_RESET,0); /* was 1 before*/
	
	/**/
	/******************************/
	/*	PMF AGC Initialization		*/
	/******************************/
	/* PMF AGC Status Forced To Unlock Position. Accumulator Is Also Reset */
	STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,R0370QAM_PMFAGC_2,0x08);
	/**/
	/******************************/
	/*	Equalizer Initialization	*/
	/******************************/
	/* Equalizer Values Capture */
	Freq19	=	STTUNER_IOREG_GetRegister(DeviceMap, IOHandle,R0370QAM_FREQ_19)	;
	Freq23	=	STTUNER_IOREG_GetRegister(DeviceMap, IOHandle,R0370QAM_FREQ_23)	;
	Freq24	=	STTUNER_IOREG_GetRegister(DeviceMap, IOHandle,R0370QAM_FREQ_24)	;
	/* Equalizer Reset And Release */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_EQ_RESET,1);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_EQ_RESET,0);
	/* Equalizer Values Reload */
	STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R0370QAM_FREQ_19,Freq19);
	STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R0370QAM_FREQ_23,Freq23);
	STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R0370QAM_FREQ_24,Freq24);
	/**/
	/******************************/
	/*	Signal Parameters Setting	*/
	/******************************/
	Reg0370QAM_SetQAMSize(DeviceMap,IOHandle,QAMSize);
	/* STL Freeze (Avoiding STV0297J Symbol Rate Update) */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_PHASE_CLR,1);
	Reg0370QAM_SetSymbolRate(DeviceMap,IOHandle,SymbolRate,multiply_factor_times_quartz);
	Reg0370QAM_SetSpectrumInversion(DeviceMap,IOHandle,SpectrumInversion);
	/**/
	
	/******************************/
	/*	FEC Initialization			*/
	/******************************/
	Driv0370QAMFecInit(DeviceMap,IOHandle);
	/**/
	
	
	/**/
	/******************************/
	/*	AGC Lock Part					*/
	/******************************/
	/* WBAGC Loop Enable */
	STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R0370QAM_WBAGC_3,0x10);
	/* Wide Band AGC Lock Check */
	EndOfSearch = NO;
	TimeOut = DataSearchTime + 30;	/* 30 ms Timeout */
	while(EndOfSearch == NO)
	{
		STB0370QAM_DelayInMilliSec(5);/*SystemWaitFor(5); to be checked whether this 
						replacement is correct or not ????*/
		DataSearchTime += 5;
		WBAGCLock = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_WAGC_ACQ);
		if((WBAGCLock == 1)||(DataSearchTime > TimeOut))
			EndOfSearch = YES;			
		
	}
	if(WBAGCLock == 0)	/* The WBAGC Has Not Converged */
	{
		return (DataFound);
	}
	/* The Code Commented Below Can Be Used To Avoid Locking On Very Low Signals */
	
	/* AGC Roll And Acquisition Threshold Set To the formerly chosen values
	 In Order To Switch To Tracking Mode */
	Reg0370QAM_SetWBAGCloop(DeviceMap,IOHandle,AGCLoop);
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_ACQ_TH,ACQThreshold);
	
	/******************************/
	/*	Post WBAGC Blocks Lock		*/
	/******************************/
	/* STL Release */
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_PHASE_CLR,0x00);
	/* Different Settings According To Whether The Estimator Is Used Or Not */
	if ((STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_FREQ_EST_CORR_BLIND) || STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_FREQ_EST_CORR_LMS1) || STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_FREQ_EST_CORR_LMS1)) != 1)
	{
		Reg0370QAM_SetFrequencyOffset(DeviceMap,IOHandle,CarrierOffset);
		Reg0370QAM_SetSweepRate(DeviceMap,IOHandle,SweepRate,multiply_factor_times_quartz)				;
		STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R0370QAM_CRL_2,0x03)			;	/* Enable Sweep, Estimator Reset Above */
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_LOCK_DETECT_ENA,0x01)		;	/* Corner Detector On */
		
	}
	else	/* Estimator Used */
	{
		/* Corner Detector Is Not Used Because There Is A Similar Detector In The Frequency Estimator */
		Reg0370QAM_SetFrequencyOffset(DeviceMap,IOHandle,0)		;	/* Offset Zeroed */
		Reg0370QAM_SetSweepRate(DeviceMap,IOHandle,0,multiply_factor_times_quartz)				;	/* Sweep Rate Zeroed, Sweep Is Disabled Above */
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_FREQ_EST_RESET,1)	;	/* Release Of Estimator Reset */	
		
	}	 
	/* PMF AGC Unlock Forcing Is Disabled, The CRL Can Act Now */	
	STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R0370QAM_PMFAGC_2,0x02);
	
	/* Waiting For A LMS2 Lock Indication Or A Timeout; Several Successive
	 Lock Indications Are Requested To Decide Equalizer Convergence */
	EndOfSearch    = NO;
	TimeOut = DataSearchTime + LMS2TimeOut;
	LMS2TrackingLock = 0;
	while (EndOfSearch == NO)
	{
		STB0370QAM_DelayInMilliSec(5);
		DataSearchTime += 5;
		int_tmp =  STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_LMS_STEP2);
		if(int_tmp == 1)
		{
			LMS2TrackingLock += 1;
		}
		else
		{
			LMS2TrackingLock = 0;
		}
		if((LMS2TrackingLock >= 5)||(DataSearchTime > TimeOut))
		{		
			EndOfSearch = YES;
		}
		
			
			
	}
	if(int_tmp == 0)	/* The Equalizer Has Not Converged */
	{		
			return (DataFound);
	}
	if ((STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_FREQ_EST_CORR_BLIND) || STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_FREQ_EST_CORR_LMS1) || STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_FREQ_EST_CORR_LMS2)) != 1)
	{
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_SW_EN,0);		/* LMS2 Is Locked: Sweep Is Disabled */
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_LOCK_DETECT_ENA,0);	/* Corner Detector Disabled */
		
	}
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_EN_FADDET,1);		/* Fading Detector Enabled */
	if (SymbolRate <= 2000000)	/* Phase-Noise Loop Activated For Low Symbol Rate Signals */
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_BYP_SEC_LOOP,0);
	/**/
	/******************************/
	/*	FEC Lock Check					*/
	/******************************/
	EndOfSearch = NO;
	
	 
	DataFound = Driv0370QAMFECLockCheck(DeviceMap,IOHandle,pParams,EndOfSearch, TimeOut, DataSearchTime);
	/**/
	/******************************/
	/*	Signal Parameters Update	*/
	/******************************/
	pParams->SymbolRate			= (S32)Reg0370QAM_GetSymbolRate(DeviceMap,IOHandle,multiply_factor_times_quartz)		;	/* Symbol Rate Update In Baud/s .... 
																		check this typecasting */
	pParams->Frequency			-=(S32) pParams->InitDemodOffset;  /* Carrier Offset Update ... check this typecasting */
	/* Signal Structure Update */
	pParams->Results.Modulation= pParams->Modulation		;
	pParams->Results.SymbolRate	= pParams->SymbolRate	;
	pParams->Results.Frequency	= pParams->Frequency	;
	
	
	return (DataFound);
}

/*----------------------------------------------------
 FUNCTION      FE_370QAM_Search
 ACTION
                This routine is the ENTRY POINT of the STB0370QAM driver.
                ======================================================

                This routine performs the carrier search following the user indications.
                This routine is the entry point of the STB0370QAM driver.

                The returned value is a flag (TRUE, FALSE) which indicates if the trial is
                successful or not. In case of lock, _pSignal->Frequency and _pSignal->SymbolRate
                are modifyed accordingly with the found carrier parameters.
 PARAMS IN     NONE
 PARAMS OUT    NONE
 RETURN        NONE
------------------------------------------------------*/
BOOL FE_370QAM_Search(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,D0370QAM_StateBlock_t *pSearch, STTUNER_Handle_t  TopLevelHandle)
{
	FLAG_370QAM	DataFound = NO	;
	int	CarrierOffset	;
	int	RangeOffset;
	int	SweepRate;
	int	int_tmp	;
	int	InitDemodOffset	;
	ST_ErrorCode_t              Error = ST_NO_ERROR;
	STTUNER_tuner_instance_t *TunerInstance; 
	STTUNER_InstanceDbase_t     *Inst;
	FE_370QAM_InternalParams_t pParams; 
	FLAG_370QAM Driv0370QAMInitDemodOk;
	/* top level public instance data */ 
        Inst = STTUNER_GetDrvInst();
        
        /* get the tuner instance for this driver from the top level handle */
        TunerInstance = &Inst[TopLevelHandle].Cable.Tuner;
	
			
		
			Driv0370QAMSignalStatus.Status	=	_370QAM_NO_LOCKED				;	/* disable the signal monitoring */ 
			Driv0370QAMSignalStatus.NbLockLoss=	0;	
			/* results init */
			pSearch->Result.Lock.Status	    = _370QAM_NO_LOCKED				;	/* disable the signal monitoring */
			pSearch->Result.Lock.NbLockLoss	= 0						;	
			pParams.Quartz = pSearch->Quartz;
			pParams.Modulation			= pSearch->QAMSize;	/* QAM Size =  64, 256 */
			pParams.SymbolRate		    = (S32)pSearch->Params.SymbolRate;	/* in Baud/s ...check this typecasting*/
			pParams.Frequency		    = (S32)pSearch->Params.Frequency	;	/* in kHz */
			pParams.SpecInv	        = pSearch->SpectrumInversion;	/* YES or NO */
			pParams.SweepRate			= pSearch->SweepRate;	/* = 1000* (SweepRate (in MHz/s) / Symbol Rate (in MBaud/s)) */
			pParams.CarrierOffset		= pSearch->CarrierOffset;	/* = 10000 * (Carrier Offset (in KHz) / Symbol Rate (in KBaud)) */
                        pParams.IF                     = (U32) pSearch->Params.TunerIF;
			if (((pParams.SweepRate > 0)&&(pParams.CarrierOffset > 0)) ||
				((pParams.SweepRate < 0)&&(pParams.CarrierOffset < 0)))
				return(DataFound);
			if (pParams.SweepRate < 0)
			{
				SweepRate     = -pParams.SweepRate;
				CarrierOffset = -pParams.CarrierOffset;
			}
			else
			{
				SweepRate     = pParams.SweepRate;
				CarrierOffset = pParams.CarrierOffset;
			}


			Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle,(U32)pParams.Frequency,(U32 *)&pParams.Frequency);	/*	Move the tuner	*/   			


			DataFound = NO;
			RangeOffset = CarrierOffset;

			/* Initial Derotator Enabled ? */
			int_tmp = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_IN_DEMOD_EN);
			if ((int_tmp == 1)&&(RangeOffset < -400))
			{
				Driv0370QAMInitDemodOk = YES;
				RangeOffset = -400;				
			}
			else 
			{
				Driv0370QAMInitDemodOk = NO;
				
			}

			/* [- RangeOffset, + RangeOffset] range is scanned */
			pParams.InitDemodOffset = 0;
			pParams.CarrierOffset= (110*RangeOffset)/100;
			pParams.SweepRate= SweepRate;
			DataFound = Driv0370QAMDataSearch(DeviceMap,IOHandle,&pParams,TunerInstance);

			if (Driv0370QAMInitDemodOk == YES)
			{
				/* Initial Demodulation Is Required */
				InitDemodOffset = 0 ;
				while ((DataFound == NO)&&((InitDemodOffset + RangeOffset) >= CarrierOffset))
				{
					/* The subranges are scanned in a zig-zag mode around the initial subrange */
					SweepRate = -SweepRate;
					RangeOffset = -RangeOffset;
					if (RangeOffset > 0)
						InitDemodOffset = -InitDemodOffset + RangeOffset;
					else
						InitDemodOffset = -InitDemodOffset;

					/* [InitDemod - RangeOffset, InitDemod + RangeOffset] range is scanned */
					pParams.InitDemodOffset =  (int)((InitDemodOffset*(pParams.SymbolRate/1000))/10000);
					pParams.CarrierOffset= (110*RangeOffset)/100;
					pParams.SweepRate= SweepRate;
					
					DataFound = Driv0370QAMDataSearch(DeviceMap,IOHandle,&pParams,TunerInstance);
				}
			}

			if (DataFound)	
			{
				
				pSearch->Result.Lock.Status = _370QAM_LOCKED;
				Driv0370QAMSignalStatus.Status = _370QAM_LOCKED;
				
				/* Signal Structure Update */
	                    pSearch->Result.QAMSize= pParams.Modulation		;
	                    pSearch->Result.SymbolRate	= pParams.SymbolRate	;
	                    pSearch->Result.Frequency	= pParams.Frequency	;
			}

	return (DataFound);
}


/* End of drv370qam.c */

⌨️ 快捷键说明

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