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

📄 drv0899.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
				c_n = (int)(((unsigned long)(val2*100))/FE_899_PowOf2(24));
			}
		}
	
	if(c_n>=100)
	c_n = 100;
	return c_n;

}
/*****************************************************
--FUNCTION	::	FE_STB0899_GetError
--ACTION	::	Return the BER
--PARAMS IN	::		
--PARAMS OUT::	
--RETURN	::	In DVBS1 returns BER & In DVBS2 returns LDPC errors
--***************************************************/
U32 FE_STB0899_GetError(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,STTUNER_FECType_t FECType, STTUNER_FECMode_t FECMode)
{
	U32 ber = 0,i;
	if((FECType == STTUNER_FEC_MODE_DVBS1) || (FECMode == STTUNER_FEC_MODE_DIRECTV))
	{
		/*Read registers*/
		STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,RSTB0899_ERRCTRL1,0x3D);	/* force to viterbi bit error */ 
		STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,RSTB0899_VSTATUS);
		
		/* Average 5 ber values */ 
		for(i=0;i<5;i++)
		{
			WAIT_N_MS_899(100); 
			ber += FE_STB0899_GetErrorCount(DeviceMap,IOHandle,COUNTER1_899);
		}
		
		ber/=5;
		
		if(STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_PRFVIT,FSTB0899_PRFVIT_INFO))	/*	Check for carrier	*/
		{
				/*	Error Rate	*/
			ber *= 9766;
			ber /= (U32)(-1+FE_899_PowOf2(0 + 2*STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_NOE,FSTB0899_NOE_INFO)));	/*  theses two lines => ber = ber * 10^7	*/
			ber/=8;
				
		}
	}
	else if(FECType == STTUNER_FEC_MODE_DVBS2)
	{
		STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,RSTB0899_ERRCTRL1,0xB6);	/* force to DVBS2 PER  */ 
		STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,RSTB0899_VSTATUS);

		/* Average 5 ber values */ 
		for(i=0;i<5;i++)
		{
			WAIT_N_MS_899(100);
			ber += FE_STB0899_GetErrorCount(DeviceMap,IOHandle,COUNTER1_899);
		}
		ber/=5;
		ber*=10000000;
		ber/=(U32)(-1+FE_899_PowOf2(4 + 2*STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_NOE,FSTB0899_NOE_INFO)));	/*  theses two lines => per = ber * 10^7	*/
		
	
	}
	
	return ber;
}


/*Symbol Rate in Hz,Mclk in Hz */
void FE_STB0899_SetIterScal(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U32 MasterClock,U32 SymbolRate)
{
	S32 iTerScal,
	    maxIter;
	
	iTerScal = 17* (MasterClock/1000);
	iTerScal +=410000;
	iTerScal /= (SymbolRate/1000000);
	iTerScal /=1000;

	maxIter=LPDPC_MAX_ITER;
	
	if(iTerScal>maxIter)
		iTerScal=maxIter;
		
	/*use set field mandatory*/
	STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_ITERATION_SCALE,FSTB0899_ITERATION_SCALE_INFO,iTerScal);

	
}

/*****************************************************
--FUNCTION	::	FE_STB0899_Search
--ACTION	::	Run the search algo for DVBS1 & DVBS2 signal
--PARAMS IN	::	FE_STB0899_SearchParams_t	
--PARAMS OUT::	
--RETURN	::	Error
--***************************************************/
FE_STB0899_Error_t	FE_STB0899_Search(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,
										    FE_STB0899_SearchParams_t	*pSearch,
										    FE_STB0899_SearchResult_t	*pResult,
										    STTUNER_Handle_t            TopLevelHandle)
{
    FE_STB0899_Error_t error = FE_899_NO_ERROR;
    FE_STB0899_InternalParams_t *Params;
    STTUNER_InstanceDbase_t *Inst;
    STTUNER_tuner_instance_t *TunerInstance;
    TUNSDRV_InstanceData_t *Instance;
    TUNER_Status_t  TunerStatus;  
    ST_ErrorCode_t Error;
   
    /* 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;
    Instance = TUNSDRV_GetInstFromHandle(TunerInstance->DrvHandle);
    Instance->SymbolRate = (U32)pSearch->SymbolRate;
    
	Params = memory_allocate_clear(DeviceMap->MemoryPartition, 1, sizeof( FE_STB0899_InternalParams_t));
	Params->Quartz = 27000000; /* 27 MHz quartz */
	Error = (TunerInstance->Driver->tuner_GetStatus)(TunerInstance->DrvHandle, &TunerStatus);
	Params->TunerIQSense = TunerStatus.IQSense;
	Params->DemodIQMode = pSearch->DemodIQMode;
	Params->Standard = pSearch->Standard;
	Params->FECMode = pSearch->FECMode;
	/*Params->Pilots = pSearch->Pilots;*/
	FE_STB0899_InitialCalculations(DeviceMap, IOHandle, Params);
	
	if(Params != NULL)
	{
		if(	(INRANGE(1000000,pSearch->SymbolRate,45000000)) &&
			(INRANGE(1000000,pSearch->SearchRange,50000000))
		  )
		  {
			FE_STB0899_SetStandard(DeviceMap, IOHandle, pSearch->Standard, pSearch->FECMode);
			/*For Low Symbol Rate (<=5Mbs) set Mclk to 45MHz, else use 108MHz*/
			if(pSearch->SymbolRate <= 5000000)
			{
				FE_STB0899_SetMclk(DeviceMap, IOHandle, 45000000,Params);	
			}
			else
			{
				FE_STB0899_SetMclk(DeviceMap, IOHandle, 99000000,Params);
			}
			if((Params->FECMode == STTUNER_FEC_MODE_DIRECTV) || (Params->Standard == STTUNER_FEC_MODE_DVBS1))
			{
					/* Fill Params structure with search parameters */
					Params->BaseFreq = pSearch->Frequency;	
					Params->SymbolRate = pSearch->SymbolRate;
					Params->SearchRange = pSearch->SearchRange;
					Params->DerotPercent = 1000;
					Error = (TunerInstance->Driver->tuner_SetBandWidth)( TunerInstance->DrvHandle, 
                                                        (13*((U32)( FE_899_CarrierWidth(Params->SymbolRate,Params->RollOff) + 10000000)/1000)/10),/* set bandwidth some more to optimize scanning->GNBvd26185*/
                                                        &(Params->TunerBW));
                                        
                                       	/* Run the search algorithm */
					/*Set DVB-S1 AGC*/
					STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_AGCRFCFG, 0x11);
					if((FE_STB0899_Algo(DeviceMap, IOHandle, Params, TopLevelHandle) == RANGEOK_899) && (DeviceMap->Error==ST_NO_ERROR))
						{
							pResult->Locked = TRUE;
							/* update results */
							pResult->Frequency = Params->Results.Frequency;			
							pResult->SymbolRate = Params->Results.SymbolRate;										
							pResult->Rate = Params->Results.PunctureRate;
						}
						else
						{
							pResult->Locked = FALSE;
							error = FE_899_SEARCH_FAILED;
															
						}
				}
				
				else if(Params->Standard == STTUNER_FEC_MODE_DVBS2)				
				{
					
					/* Fill Params structure with search parameters */
					Params->Frequency = pSearch->Frequency;
					Params->BaseFreq = pSearch->Frequency;
					Params->DVBS2SymbolRate = pSearch->SymbolRate;
					Params->SpectralInv=pSearch->DemodIQMode;
					Params->SearchRange = pSearch->SearchRange;
					
					Error = (TunerInstance->Driver->tuner_SetBandWidth)( TunerInstance->DrvHandle,(U32)(((FE_DVBS2_CarrierWidth(Params->DVBS2SymbolRate,Params->RrcAlpha)) + 10000000)/1000), &(Params->TunerBW));
					
					/*Set DVB-S2 AGC*/
					STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_AGCRFCFG, 0x1c);
					/*Set IterScale =f(MCLK,SYMB,MODULATION*/
					FE_STB0899_SetIterScal(DeviceMap, IOHandle, Params->MasterClock,Params->DVBS2SymbolRate);
					
					/* Run the DVBS2  search algorithm */
					if((FE_STB0899_DVBS2Algo(DeviceMap, IOHandle, Params, TopLevelHandle) == FE_DVBS2_DATAOK)&& (DeviceMap->Error==ST_NO_ERROR))
					{
						
						pResult->Locked = TRUE;
					
						/* update results */
						pResult->Frequency = Params->Results.Frequency;			
						pResult->SymbolRate = Params->Results.DVBS2SymbolRate;										
						pResult->ModCode = Params->Results.ModCode;
						pResult->Pilots  = Params->Results.Pilots;
						pResult->FrameLength = Params->Results.FrameLength;
						
					}
					else
					{
						pResult->Locked = FALSE;
						error = FE_899_SEARCH_FAILED;
					}

				
			}
		
		}
			else
				error = FE_899_BAD_PARAMETER;
	
	}
	else
	error=FE_899_BAD_PARAMETER;
	
    TunerInstance->realfrequency = pResult->Frequency;	
    memory_deallocate(DeviceMap->MemoryPartition, Params);
	return error;

	
}

/*****************************************************
--FUNCTION	::	FE_STB0899_GetSignalInfo
--ACTION	::	Return informations on the locked transponder
--PARAMS IN	::	Handle	==>	Front End Handle
--PARAMS OUT::	pInfo	==> Informations (BER,C/N,power ...)
--RETURN	::	Error (if any)
--***************************************************/
FE_STB0899_Error_t   FE_STB0899_GetSignalInfo(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,STTUNER_Handle_t TopLevelHandle, FE_STB0899_SignalInfo_t	*pInfo, STTUNER_FECType_t FECType, STTUNER_FECMode_t FECMode)
{
	FE_STB0899_Error_t error = FE_899_NO_ERROR;
	STTUNER_tuner_instance_t *TunerInstance;
	STTUNER_InstanceDbase_t *Inst;  
	U32 cfrm[2];
	S32 derotFreq, offsetfreq;
	U32  MasterClock, Mclk;
	Inst = STTUNER_GetDrvInst(); 
	TunerInstance = &Inst[TopLevelHandle].Sat.Tuner;
	MasterClock = FE_STB0899_GetMclkFreq(DeviceMap, IOHandle,27000000);
	Mclk = (U32)(MasterClock/65536L); 
	
	if((FECMode == STTUNER_FEC_MODE_DIRECTV) || (FECType== STTUNER_FEC_MODE_DVBS1))
	{
				pInfo->Locked = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_LOCKEDVIT,FSTB0899_LOCKEDVIT_INFO);
		
				if(pInfo->Locked)
				{
					STTUNER_IOREG_GetContigousRegisters_SizeU32(DeviceMap, IOHandle,RSTB0899_CFRM,2,cfrm);							/*	read derotator value */ 
					cfrm[0]&=0xff;
					cfrm[1]&=0xff;
					derotFreq = (S16) MAKEWORD(cfrm[0],cfrm[1]); 
					/* transponder_frequency = tuner + derotator_frequency */
					pInfo->Frequency = TUNSDRV_GetInstFromHandle(TunerInstance->DrvHandle)->Status.Frequency + ((derotFreq*((S16)Mclk))/1000);
					pInfo->SymbolRate = FE_STB0899_GetSymbolRate(DeviceMap, IOHandle, MasterClock);	/* Get symbol rate */
					pInfo->SymbolRate += (pInfo->SymbolRate*STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_TIMING_LOOP_FREQ,FSTB0899_TIMING_LOOP_FREQ_INFO))>>19;	/* Get timing loop offset */
					pInfo->Rate = (FE_STB0899_Rate_t)STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_VIT_CURPUN,FSTB0899_VIT_CURPUN_INFO);
					pInfo->Power = FE_STB0899_GetRFLevel(DeviceMap, IOHandle, FECType, FECMode);
					pInfo->C_N = FE_STB0899_GetCarrierQuality(DeviceMap, IOHandle,FECType, FECMode);
					pInfo->BER = FE_STB0899_GetError(DeviceMap, IOHandle, FECType, FECMode);
					if(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SYMI,FSTB0899_SYMI_INFO)==0)
						pInfo->SpectralInv = STTUNER_IQ_MODE_NORMAL;
					else
						pInfo->SpectralInv = STTUNER_IQ_MODE_INVERTED;
				}
		}
		else
		{
			
				pInfo->Locked=(((STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_LOCK, FSTB0899_LOCK_INFO))&&
				   	(STTUNER_IOREG_GetRegister(DeviceMap, IOHandle,RSTB0899_DMDSTAT2)==0x03))?1:0);
				if(pInfo->Locked)
				{
					
					offsetfreq=STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_CRL_FREQUENCY, FSTB0899_CRL_FREQUENCY_INFO);
					offsetfreq = (S32)(offsetfreq/(FE_899_PowOf2(30)/1000));
					
					offsetfreq*=(MasterClock/1000000);
					if(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_SPECTRUM_INVERT, FSTB0899_SPECTRUM_INVERT_INFO))
					offsetfreq*=-1;	
					pInfo->Frequency=TUNSDRV_GetInstFromHandle(TunerInstance->DrvHandle)->Status.Frequency - offsetfreq;
					
	  				pInfo->SymbolRate=FE_DVBS2_GetSymbolRate(DeviceMap, IOHandle, MasterClock);
					pInfo->ModCode=(FE_DVBS2_ModCod_t)FE_DVBS2_GetModCod(DeviceMap, IOHandle);
					pInfo->Pilots=STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_UWP_DECODED_MODCODE,FSTB0899_UWP_DECODED_MODCODE_INFO)&0x01;
					pInfo->FrameLength= (STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_UWP_DECODED_MODCODE,FSTB0899_UWP_DECODED_MODCODE_INFO)>>1)&0x01;
				
					pInfo->C_N = FE_STB0899_GetCarrierQuality(DeviceMap, IOHandle,FECType, FECMode);
					pInfo->Power = FE_STB0899_GetRFLevel(DeviceMap, IOHandle, FECType, FECMode);
					pInfo->BER = FE_STB0899_GetError(DeviceMap, IOHandle,FECType, FECMode);
					if(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO)==0)
						pInfo->SpectralInv = STTUNER_IQ_MODE_NORMAL;
					else
						pInfo->SpectralInv = STTUNER_IQ_MODE_INVERTED;

				}
				
		}
	
	return error;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_ToneDetection
--Description	::	Returns the no. of tones detected and fill their freq in ToneLIst
--Return: No. of tones deteced.

--***************************************************/
U32 FE_STB0899_ToneDetection(STTUNER_IOREG_DeviceMap_t *DeviceMap,STTUNER_Handle_t TopLevelHandle,U32 StartFreq,U32 StopFreq,U32 *ToneList, U8 mode)
{
	U32     step;		/* Frequency step */ 
		
	U32     BandWidth;
	U8	nbTones=0;
	STTUNER_InstanceDbase_t *Inst;
	ST_ErrorCode_t Error = ST_NO_ERROR;

	STTUNER_tuner_instance_t *TunerInstance;
        Inst = STTUNER_GetDrvInst();
       /* get the tuner instance for this driver from the top level handle */
       TunerInstance = &Inst[TopLevelHandle].Sat.Tuner;
	
	/* wide band acquisition */
	step = 36000000;						/* use 36MHz step */
	if(TunerInstance->Driver->ID == STTUNER_TUNER_STB6100)
	Error = (TunerInstance->Driver->tuner_SetBandWidth)(TunerInstance->DrvHandle, 36000, &BandWidth); /* LPF cut off freq = 18MHz*/
	else 		
	Error = (TunerInstance->Driver->tuner_SetBandWidth)(TunerInstance->DrvHandle, 36000, &BandWidth); /* LPF cut off freq = 18MHz*/
	if(Error == ST_NO_ERROR)
	{
	nbTones = FE_STB0899_SpectrumAnalysis(TunerInstance, DeviceMap, Inst[TopLevelHandle].Sat.Demod.IOHandle, StartFreq, StopFreq, step, ToneList, mode);	/* spectrum acquisition */
	}
		
	return nbTones;
}
/*****************************************************
--FUNCTION	::	FE_STB0899_SpectrumAnalysis
--Description	::	Read the tone spectrum in given band.
--Return: No. of tones deteced.

--***************************************************/
U32 FE_STB0899_SpectrumAnalysis(STTUNER_tuner_instance_t *TunerInstance, STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, U32 StartFreq,U32 StopFreq,U32 StepSize,U32 *ToneList, U8 mode)
{
    U32 freq, realTunerFreq, freqstep = 2000000,
	tempfreq,lastfreq,freqlowerthreshold, freqhigherthreshold,epsilon;
   int  agcVal[500],index=0, points = 0, pt_max,i=0, j = 1;
    int direction = 1, agc_threshold, *spectrum_agc ,agc_threshold_adjust,agc_high,agc_low,agc_threshold_detect;
    U32 *spectrum;
    ST_ErrorCode_t Error = ST_NO_ERROR;
    
    TUNSDRV_InstanceData_t *Instance;

	points = (U16)((StopFreq - StartFreq)/StepSize + 1);
	spectrum = memory_allocate_clear(DeviceMap->MemoryPartition, points, sizeof(U16));
	spectrum_agc = memory_allocate_clear(DeviceMap->MemoryPartition, points, sizeof(int));
	
	Instance = TUNSDRV_GetInstFromHandle(TunerInstance->DrvHandle);
	if(Instance->TunerType == STTUNER_TUNER_STB6100)
	STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FSTB6100_G,7, Instance->TunerRegVal);		/* Gain = 0 */
	
	Error = STTUNER_IOREG_SetContigousRegisters(&(Instance->DeviceMap), Instance->IOHandle, 5,Instance->TunerRegVal, 1);
	    		
	Error |= STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOH

⌨️ 快捷键说明

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