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

📄 drv0370qam.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (CurrentMean < OldMean)
	{
		Result -= (100*(CurrentMean - ComputedMean))/(CurrentMean - OldMean);
	}

	*Mean_p	= Instance->Driv0370QAMCNEstimation;
	*CN_Ratio_p = Result;
	*CN_dB100_p = Result;

	


#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
    STTBX_Print(("%s Mean %d CNdBx100 %d CNRatio %d\n", identity, *Mean_p, *CN_dB100_p, *CN_Ratio_p));
#endif
     

}


/*----------------------------------------------------
 FUNCTION      Drv0370QAMApplicationSaturationComputation
 ACTION
 PARAMS IN     NONE
 PARAMS OUT    NONE
 RETURN        NONE
------------------------------------------------------*/
void Drv0370QAMApplicationSaturationComputation(int * _pSaturation)
{
    int int_tmp ;
    /*
    In order to get a smooth saturation value, this is filtered
    with a low-pass filter : sat(n) = 0.25*sat(n-1) + 0.75*acc(n)
    pSaturation[0] = accumulator value
    pSaturation[1] = low-pass filter memory
    */
    if (_pSaturation[0] != 0)
    {
        int_tmp  = 100*_pSaturation[0];
        int_tmp /= 65536;
        if(_pSaturation[1] > int_tmp)
        {
            int_tmp  = 10*int_tmp/100;
            int_tmp += 90*_pSaturation[1]/100;
        }
        else
        {
            int_tmp  = 75*int_tmp/100;
            int_tmp += 25*_pSaturation[1]/100;
        }

        if(int_tmp > 100) int_tmp = 100;

        _pSaturation[1] = int_tmp ;
    }
    return ;
}

/*----------------------------------------------------
 FUNCTION      Driv0370QAMBertCount
 ACTION
 PARAMS IN     NONE
 PARAMS OUT    NONE
 RETURN        NONE
------------------------------------------------------*/
void Driv0370QAMBertCount(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,
                       D0370QAM_StateBlock_t *StateBlock_p, STTUNER_tuner_instance_t *TunerInstance_p,
                       int *_pBER_Cnt, int *_pBER)
{
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
    const char *identity = "STTUNER drv0370qam.c Driv0370QAMBertCount()";
#endif
    int     err_hi1, err_lo1,err_hi0,err_lo0; 
    int     int_tmp;
    U32     BER;
     int	double_tmp ;
   int	NumberBitsPerFrame;
    /*
    --- Set parameters
    */
    _pBER[0] = 0;


    /*
    --- Compute ...
    ---
    ---     BER =   10E6 * (Counter)/(2^(2*NBYTE + 12))
    ---         = 244,14 * (Counter)/(2^(2*NBYTE))                   (Unit 10E-6)
    */
    
   
        /* rate mode */
      
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
            STTBX_Print(("===> Count is finished\n"));
#endif
            /* the previous count is finished */
            /* Get BER from demod */
            err_hi0 = STTUNER_IOREG_GetField(DeviceMap, IOHandle, F0370QAM_RS_RATE_LSB);
            err_lo0 = STTUNER_IOREG_GetField(DeviceMap, IOHandle, F0370QAM_RS_RATE_MSB);
            err_hi1 = STTUNER_IOREG_GetField(DeviceMap, IOHandle, F0370QAM_RS_RATE_LSB);
            err_lo1 = STTUNER_IOREG_GetField(DeviceMap, IOHandle, F0370QAM_RS_RATE_MSB);
            if(err_hi0 == err_hi1)
            {
            *_pBER_Cnt = err_lo0 + (err_hi0 <<8);
            }
            else
            {
             *_pBER_Cnt = err_lo1 + (err_hi1 <<8);
            }
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
            STTBX_Print(("===> _pBER_Cnt = %d\n", *_pBER_Cnt));
#endif
            BER = *_pBER_Cnt;

            double_tmp = (int)*_pBER_Cnt;
	    int_tmp =  STTUNER_IOREG_GetField(DeviceMap, IOHandle,F0370QAM_RS_RATE_ADJ);
	    NumberBitsPerFrame = 78888; 
	    if (STTUNER_IOREG_GetField(DeviceMap, IOHandle,F0370QAM_F_64_256) == 1)
	    {	
	    	NumberBitsPerFrame = 53802;
	    }
	    double_tmp /= (4*NumberBitsPerFrame);
	    double_tmp *= 7;
	    double_tmp /= (int)(POW_370QAM(4,int_tmp));	   
           
            _pBER[0] = *_pBER_Cnt;
          
          Drv0370QAMApplicationSaturationComputation(_pBER); 
    /*
    --- Get Blk parameters
    */
    StateBlock_p->BlkCounter = Reg0370QAM_GetBlkCounter(DeviceMap, IOHandle);
    StateBlock_p->CorrBlk    = Reg0370QAM_GetCorrBlk(DeviceMap, IOHandle);
    StateBlock_p->UncorrBlk  = Reg0370QAM_GetUncorrBlk(DeviceMap, IOHandle);

#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
    STTBX_Print(("%s BER_Cnt %9d BER Cnt %9d Sat %3d Rate %9d (10E-6)\n", identity,
                *_pBER_Cnt,
                _pBER[0],
                _pBER[1],
                _pBER[2]
                ));
    STTBX_Print(("%s BlkCounter %9d CorrBlk %9d UncorrBlk %9d\n", identity,
                StateBlock_p->BlkCounter,
                StateBlock_p->CorrBlk,
                StateBlock_p->UncorrBlk
                ));
#endif

}


/*----------------------------------------------------
 FUNCTION      Driv0370QAMFECLockCheck
 ACTION	       
           
 PARAMS IN     
 PARAMS OUT    
 RETURN        
------------------------------------------------------*/

FLAG_370QAM Driv0370QAMFECLockCheck (STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_370QAM_InternalParams_t *pParams, FLAG_370QAM EndOfSearch, int TimeOut, int DataSearchTime)
{
	int QAMSize, MPEGLockCount;
	int noCodeWordsInAframe = 60, Log2QAMSize;
	int FrameSyncTimeOut, ViterbiTimeOut, MPEGTimeOut;
	long SymbolRate;
	FLAG_370QAM DataFound = NO;
		
	QAMSize     = pParams->Modulation	;
	SymbolRate  = pParams->SymbolRate	; /* in Baud/s */
	switch (QAMSize)
	{
		case 16:
			Log2QAMSize = 4;
			break;
		case 32 :
			Log2QAMSize = 5;
			break ;
		case 64 :
			Log2QAMSize = 6;
			noCodeWordsInAframe = 60;
			break;
		case 128 :
			Log2QAMSize = 7;
			break ;
		case 256 :
			Log2QAMSize = 8;
			noCodeWordsInAframe = 88;
			break;
	}

		ViterbiTimeOut = 20;
		MPEGTimeOut = 200;
		/* frameSyncTimeOut (in mSec) : it is the time necessary for an MPEG frame lock in the worst case. */
		FrameSyncTimeOut =((int) (noCodeWordsInAframe*128*7)/(int)(Log2QAMSize*(SymbolRate/1000))); /* in ms */
		/* length of a code word is 128 words; each word is of 7 bits 
		 Waiting for MPEG sync Lock or a time-out; A few  successful 
		tracking indicators are required in succession to decide MPEG Sync */
		EndOfSearch = NO;
		MPEGTimeOut = MPEGTimeOut + ViterbiTimeOut + FrameSyncTimeOut;
		TimeOut = DataSearchTime + MPEGTimeOut;
		MPEGLockCount = 0;
		while (EndOfSearch == NO)
			{
				WAIT_N_MS_370QAM(5);
				DataSearchTime += 5;
				if(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_MPEG_SYNC) == 1)	MPEGLockCount++;
				else	MPEGLockCount = 0;
				if((MPEGLockCount == 1)||(DataSearchTime > TimeOut))
					EndOfSearch = YES;
			}
			if(MPEGLockCount == 1)
				DataFound = YES;
			
			else
			{
				
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_INV_SPEC_MAPPING,!STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_INV_SPEC_MAPPING)); /*Check this syntax???? */
				WAIT_N_MS_370QAM(20);
				DataSearchTime += 20 ;
				if(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_MPEG_SYNC) == 1)
					DataFound = YES;
			}		

			if(STTUNER_IOREG_GetRegister(DeviceMap, IOHandle,R0370QAM_SYNC_STAT) != 0x1e)
			{
				
				DataFound = NO;			
			
					if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_COMB_STATE) != 2)
					{
						DataFound = NO;
					   
							if( (STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_VIT_I_SYNC) == 0) || (STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_VIT_Q_SYNC) == 0))
							{								
								DataFound = NO;
					
							}
					}
				return (DataFound);
			}
		DataFound = YES;

	return DataFound;
}



/*----------------------------------------------------
 FUNCTION      Driv0370QAMFecInit
 ACTION	       
           
 PARAMS IN     
 PARAMS OUT    
 RETURN        
------------------------------------------------------*/
ST_ErrorCode_t Driv0370QAMFecInit (STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle) /*FECType is the value of FEC_AC_OR_B*/
{
	ST_ErrorCode_t  Error = ST_NO_ERROR;

		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_FEC_NRESET,0)		;	/* FEC B reset */
		
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_FEC_NRESET,1)		;	/* FEC B reset cleared */
		
		
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_NRST,0)		;	/* FEC B viterbi reset */
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_RS_EN,0)				;	/* FEC B RS correction disabled */
	
	
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_NRST,1)		;	/* FEC B viterbi reset cleared */
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_RS_EN,1)				;	/* FEC B RS correction enabled */
	
	return Error;
}


/*----------------------------------------------------
 FUNCTION      LoadRegisters
 ACTION
           
 PARAMS IN     
 PARAMS OUT    
 RETURN        
------------------------------------------------------*/

ST_ErrorCode_t LoadRegisters(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int QAMSize,int TunerType)
{	
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
    const char *identity = "STTUNER drv0370qam.c LoadRegisters()";
#endif	
	ST_ErrorCode_t  Error = ST_NO_ERROR;	
	
	switch (QAMSize)
	{
		case  64:
		switch(TunerType)
		{
			case STTUNER_TUNER_TD1336:
			 /*QAMDefaultValue = STB0370_DefVal_64QAM_TD1336 ;*/
			 /*Set the corresponding registers which are required to reprogram for 
			   lock for 64 QAM from the default value of 256 QAM*/
			 STTUNER_IOREG_SetField(DeviceMap, IOHandle,F0370QAM_MODE_SEL,0x04);
			 STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,R0370QAM_FREQ_6,0x80); 
			 STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_F_64_256,1);  
			   
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
    STTBX_Print(("%s Default Value of Tuner TD1336, QAM-64 used\n", identity));
#endif
			break;
			case STTUNER_TUNER_DCT7050:
			case STTUNER_TUNER_DTT7600:
			/* QAMDefaultValue =STB0370_DefVal_64QAM_DCT7050;*/
			  /*Set the corresponding registers which are required to reprogram for 
			   lock for 64 QAM from the default value of 256 QAM*/
			 STTUNER_IOREG_SetField(DeviceMap, IOHandle,F0370QAM_MODE_SEL,0x04);
			 STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,R0370QAM_FREQ_6,0x80); 
			 STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_F_64_256,1); 
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
    STTBX_Print(("%s Default Value of Tuner DCT7050, QAM-64 used\n", identity));
#endif			 
			break;
			default:
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
            STTBX_Print(("%s WARNING - Any Supported  Tuner is not  specified\n", identity));
#endif	
			break;
			 
		}
		break;
		case 256:
		  switch(TunerType)
		{
			case STTUNER_TUNER_TD1336:
			 /*QAMDefaultValue = STB0370_DefVal_256QAM_TD1336 ;*/
			 /*Set the corresponding registers which are required to reprogram to 
			   lock for 256 QAM from the default value of 256 QAM and after 
			   applying modifications for 64 QAM*/
			 STTUNER_IOREG_SetField(DeviceMap, IOHandle,F0370QAM_MODE_SEL,0x03);
			 STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,R0370QAM_FREQ_6,0x81); 
			 STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_F_64_256,0);  
			break;
			case STTUNER_TUNER_DCT7050:
			case STTUNER_TUNER_DTT7600:
			 /*QAMDefaultValue =STB0370_DefVal_256QAM_DCT7050;*/
			 /*Set the corresponding registers which are required to reprogram to 
			   lock for 256 QAM from the default value of 256 QAM and after 
			   applying modifications for 64 QAM*/
			 STTUNER_IOREG_SetField(DeviceMap, IOHandle,F0370QAM_MODE_SEL,0x03);
			 STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,R0370QAM_FREQ_6,0x81); 
			 STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_F_64_256,0);  
			break;
			default:
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
            STTBX_Print(("%s WARNING - Any Supported  Tuner is not  specified\n", identity));
#endif	
			break;
			 
		}
		break;
		default:
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
            STTBX_Print(("%s WARNING - Any Supported  QAM(64/256) is not  specified\n", identity));
#endif			
		break;
	}
   
	return Error;
}

/*----------------------------------------------------
 FUNCTION      Driv0370QAMDataSearch
 ACTION
                This routine performs a carrier lock trial with a given offset and sweep rate.
                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     
 PARAMS OUT    
 RETURN        
------------------------------------------------------*/
BOOL Driv0370QAMDataSearch(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,
                        FE_370QAM_InternalParams_t *pParams, STTUNER_tuner_instance_t *TunerInstance_p)
{
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
    const char *identity = "STTUNER drv0370QAM.c Driv0370QAMDataSearch()";
    clock_t                 time_spend_register;
    clock_t                 time_start_lock, time_end_lock;
#endif
 
   int	TimeOut, LMS2TimeOut, AcqLoopsTime, DataSearchTime;
   int	NbSymbols, Log2QAMSize, LMS2TrackingLock;
   int	QAMSize, SweepRate, CarrierOffset;
   long	SymbolRate;
   long	Frequency;
   FLAG_370QAM	SpectrumInversion;
   int	AGC2SD, int_tmp, WBAGCLock, AGCLoop, ACQThreshold;
   int	Freq19, Freq23, Freq24;
   FLAG_370QAM	EndOfSearch, DataFound;
  
   int multiply_factor_times_quartz;
   int Clk50_QAM;	


	/**/
	/******************************/
	/*	Variables Initialization	*/
	/******************************/
	DataFound			= NO;
	EndOfSearch			= NO;
	DataSearchTime		= 0;
	Frequency			= pParams->Frequency;
	QAMSize				= pParams->Modulation;
	SymbolRate			= pParams->SymbolRate; /* in Baud/s */
	SweepRate			= pParams->SweepRate; /* in 1/ms */
	CarrierOffset		= pParams->CarrierOffset;
	SpectrumInversion	= pParams->SpecInv;
	/**/
	/******************************/
	/*	Timouts Computation			*/
	/******************************/

⌨️ 快捷键说明

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