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

📄 drv0288.c

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

/*****************************************************
--FUNCTION	::	FE_288_Search
--ACTION	::	Search for a valid transponder
--PARAMS IN	::	Handle	==>	Front End Handle
				pSearch ==> Search parameters
				pResult ==> Result of the search
--PARAMS OUT::	NONE
--RETURN	::	Error (if any)
--***************************************************/
FE_288_Error_t	FE_288_Search(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,
										    FE_288_SearchParams_t	*pSearch,
										    FE_288_SearchResult_t	*pResult,
										    STTUNER_Handle_t            TopLevelHandle)
{
    FE_288_Error_t error = FE_288_NO_ERROR;
    FE_288_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_288_InternalParams_t));
	Params->BaseFreq = pSearch->Frequency;	
	
	Params->Symbolrate = pSearch->Symbolrate;
	Params->SearchRange = pSearch->SearchRange;
	Params->DerotPercent = 1000;
	Params->Quartz = pSearch->ExternalClock; /* 30 MHz quartz in 5188*/
	Error = (TunerInstance->Driver->tuner_GetStatus)(TunerInstance->DrvHandle, &TunerStatus);
	Params->TunerIQSense = /*TunerStatus.IQSense;*/-1;
	Params->DemodIQMode = pSearch->DemodIQMode;
	
	Params->MasterClock = FE_288_GetMclkFreq(DeviceMap, IOHandle, Params->Quartz);
	
	Params->Tagc1 = 0;
	Params->Tagc2 = 0;
	Params->Mclk = (U32)(Params->MasterClock/65536L);
	Params->RollOff = FE_288_GetRollOff(DeviceMap, IOHandle);
	Params->MinOffset = -(S32)(pSearch->SearchRange/1000);
	Params->MaxOffset = (S32)(pSearch->SearchRange/1000);
	if(Params != NULL)
	{
			if(	(pSearch != NULL) && (pResult != NULL) &&
				(INRANGE_288(0,(S32)pSearch->Symbolrate,60000000)) &&
				(INRANGE_288(500000,pSearch->SearchRange,50000000)) &&
				(INRANGE_288(FE_288_MOD_BPSK,pSearch->Modulation,FE_288_MOD_QPSK))
				)
			{
				
				Params->State = FE_288_Algo(DeviceMap, IOHandle, Params, TopLevelHandle	);
				/* check results */
				if( (Params->State == RANGEOK_288) && (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_288_SEARCH_FAILED;
				}
			}
			else
			{
				error = FE_288_BAD_PARAMETER;
			}
		}
		else
			error = FE_288_INVALID_HANDLE;
    
	    TunerInstance->realfrequency = pResult->Frequency;	
	    memory_deallocate(DeviceMap->MemoryPartition, Params);
	return error;
}

BOOL FE_288_Status(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)  
{
	BOOL lock = FALSE;
	
	lock=STTUNER_IOREG_GetField(DeviceMap,IOHandle,F288_LK);
			
	return lock;
}

/*****************************************************
--FUNCTION	::	FE_288_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_288_Error_t	FE_288_GetSignalInfo(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_288_SignalInfo_t	*pInfo)
{
	U8 cfrm[2];
	FE_288_Error_t error = FE_288_NO_ERROR;
			
	pInfo->Locked = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F288_LK);
		
		if(pInfo->Locked)
		{
			STTUNER_IOREG_GetContigousRegisters(DeviceMap,IOHandle,R288_CFRM,2,cfrm);							/*	read derotator value */ 
			pInfo->derotFreq = (S16) MAKEWORD_288(cfrm[0],cfrm[1]);
			
			pInfo->Rate = 1 << STTUNER_IOREG_GetField(DeviceMap,IOHandle,F288_PR);
			pInfo->Power_dBm = FE_288_GetRFLevel(DeviceMap,IOHandle);/*+(pInfo->Frequency-945000)/12000;*/ /* correction applied according to RF frequency */
			pInfo->CN_dBx10 = FE_288_GetCarrierToNoiseRatio(DeviceMap,IOHandle);
			pInfo->BER = FE_288_GetError(DeviceMap,IOHandle);
			pInfo->SpectralInv = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F288_SYM);
		}
			
	return error;
}

FE_288_Error_t  FE_288_SetTSClock_OutputRate(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U32 SymbolRate, U32 MasterClock)
{
	U32 bitrate;
	U8 ENA8_Level;
	FE_288_Error_t error = FE_288_NO_ERROR;
	bitrate = SymbolRate*2;	
	
	switch(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F288_PR))
	{
		case	0:		/*	PR 1/2	*/
			bitrate *= 1;
			bitrate /= 2;
		break;

		case	1:		/*	PR 2/3	*/
			bitrate *= 2;
			bitrate /= 3;
		break;

		case	2:		/*	PR 3/4	*/
			bitrate *= 3;
			bitrate /= 4;
		break;

		case	3:		/*	PR 5/6	*/
			bitrate *= 5;
			bitrate /= 6;
		break	;

		case	4:		/*	PR 6/7	*/
			bitrate *= 6;
			bitrate /= 7;
		break;

		case	5:		/*	PR 7/8	*/
			bitrate *= 7;
			bitrate /= 8;
		break;

		default	:
			
		break;
	}

	if(!(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F288_OUTRS_PS)))
	{
		
		
		ENA8_Level = (MasterClock*8) / (bitrate*4);
		if(ENA8_Level>=15)
		ENA8_Level = 15;
		STTUNER_IOREG_SetField(DeviceMap, IOHandle, F288_ENA8_LEVEL, ENA8_Level);
	}
	else
	{
		ENA8_Level = MasterClock / bitrate;
		ENA8_Level -= 1;
		if(ENA8_Level>=3)
		ENA8_Level = 3;
		ENA8_Level <<= 2;
		ENA8_Level |= 0x01;
		STTUNER_IOREG_SetField(DeviceMap, IOHandle, F288_ENA8_LEVEL, ENA8_Level);
	}
	
	return error;
}
#ifndef STTUNER_MINIDRIVER
#ifdef STTUNER_DRV_SAT_SCR

U32 Drv0288_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,int* power_detection_level)
{ 
    U32 freq, realTunerFreq, freqstep = 2000000,
	tempfreq,lastfreq,freqlowerthreshold, freqhigherthreshold,epsilon;
    int  i=0, j = 1,pt_max;
    int  agcVal[500],index=0,points;
    int direction = 1, agc_threshold, *spectrum_agc ,agc_threshold_adjust,agc_high,agc_low,agc_threshold_detect;
    U32 *spectrum;
    U8 gain;
    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_STB6000)
	gain=0;
		
	
	STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FSTB6000_G, 0,Instance->TunerRegVal);   /* Gain = 0 */
	else if(Instance->TunerType == STTUNER_TUNER_MAX2116) 
	
	STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FMAX2116_G,0x1F,Instance->TunerRegVal);
	gain=0x1F;
	
	Error = STTUNER_IOREG_SetContigousRegisters(&(Instance->DeviceMap), Instance->IOHandle, 0, gain,(Instance->DeviceMap).Registers);
	    		
	Error |= STTUNER_IOREG_SetField(DeviceMap, IOHandle, F288_AGC1R_REF, 48); /* set AGC_Ref as 48*/
	lastfreq = StartFreq - 100000000;
	
	/*added by fsu*/
	/*auto detection of max AGC*/
        if(mode==1) 
        {
	 agc_high=-500;
	 agc_low=500;
	 for(freq=StartFreq;freq<StopFreq;freq+=3000000)
	 {
	  Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, freq/1000, (U32 *)&realTunerFreq);
	  WAIT_N_MS_288(2);
	  agc_threshold = (S8)STTUNER_IOREG_GetField(DeviceMap, IOHandle, F288_AGC1_VALUE);
	  agcVal[index]=agc_threshold;
	  index++;
	  if(agc_threshold>agc_high) {
	     agc_high=agc_threshold;
	  }
	  if(agc_threshold<agc_low) {
	     agc_low=agc_threshold;
	  }
         };
        
	 /*adjust agc_threshold*/
	 points=0;
	 agc_threshold_adjust=(agc_high+agc_low)/2;
	 pt_max=3*index/4;
	 epsilon=agc_high-agc_low;
	 
	 while(epsilon>5) {
	  points=0;
	  /*get numbers of points for which treshold is lower than agc_threshold_adjust*/		
	  for(i=0;i<index;i++) {
	   if(agcVal[i]<agc_threshold_adjust) {
	   points++;
	   }
	  }
	  if(points>pt_max) { 
	  	/*most of points are bellow agc_threshold_adjust level*/
	  	agc_high=agc_threshold_adjust;
	  } else {
	  	agc_low=agc_threshold_adjust;
	  }
	  agc_threshold_adjust=(agc_high+agc_low)/2;
	  epsilon=agc_high-agc_low;
	 }
	  agc_threshold_detect=agc_threshold_adjust;
	  *power_detection_level=agc_threshold_adjust;
	} else {
	  agc_threshold_detect=*power_detection_level; /*quick setup*/
	}
	
	i=0;
	points=0;
	
	for(freq=StartFreq;freq<StopFreq;freq+=StepSize)
	{
		direction = 1;j = 1;
		Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, freq/1000, (U32 *)&realTunerFreq);
		WAIT_N_MS_288(2);
		agc_threshold = (S8)STTUNER_IOREG_GetField(DeviceMap, IOHandle, F288_AGC1_VALUE);
		if(agc_threshold > agc_threshold_detect)/* - 70 */
		{
				if(((agc_threshold >= agc_threshold_detect) && (ABS_288((S32)(freq - lastfreq)))>40000000))
				{	
					while(agc_threshold > agc_threshold_detect)/* -128*/
					{
						tempfreq = freq+(freqstep)*direction * j/* *2 */;
						Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, tempfreq/1000, (U32 *)&realTunerFreq);
						WAIT_N_MS_288(2);
						agc_threshold = (S8)STTUNER_IOREG_GetField(DeviceMap, IOHandle, F288_AGC1_VALUE);
						++j;
				        }
				        freqhigherthreshold = tempfreq;
				        direction *= -1;
				        agc_threshold = 0; j = 1;
				        do
					{
						tempfreq = freq+(freqstep)*direction * j/* *2 */;
						Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, tempfreq/1000, (U32 *)&realTunerFreq);
						WAIT_N_MS_288(2);
						agc_threshold = (S8)STTUNER_IOREG_GetField(DeviceMap, IOHandle, F288_AGC1_VALUE);
						++j;
				        }while( agc_threshold> agc_threshold_detect);
				        freqlowerthreshold = tempfreq;

				        spectrum[i] = freqlowerthreshold + (freqhigherthreshold - freqlowerthreshold)/2;
				        if(spectrum[i] >= StartFreq && spectrum[i] <= StopFreq)
				        {
				        	lastfreq = spectrum[i];
				        	Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, spectrum[i]/1000, (U32 *)&realTunerFreq);
						WAIT_N_MS_288(2);
						spectrum_agc[i] = (S8)STTUNER_IOREG_GetField(DeviceMap, IOHandle, F288_AGC1_VALUE);
				        
				        	++i;
				        	
				        }
				        
					
				}	
		}
				
	}
	
	if(mode==1) {
	 agc_threshold=agc_threshold_detect;
	 for(j = 0; j<i; ++j) {
			ToneList[points] = spectrum[j];
			points++;
			if(points>=8)
			break;
	 }
	} else {

	 for(j = 0; j<i; ++j) {
			ToneList[points] = spectrum[j];
			points++;
			if(points>=8)
			break;
	 }		
		
	  
	}
        
	
	memory_deallocate(DeviceMap->MemoryPartition, spectrum);
	memory_deallocate(DeviceMap->MemoryPartition, spectrum_agc);
	/*memory_deallocate(DeviceMap->MemoryPartition, agcVal);*/

	return points;		
}
#endif
#endif
#ifndef STTUNER_MINIDRIVER
#ifdef STTUNER_DRV_SAT_SCR
U32 Drv0288_ToneDetection(STTUNER_IOREG_DeviceMap_t *DeviceMap,STTUNER_Handle_t TopLevelHandle,U32 StartFreq,U32 StopFreq,U32 *ToneList,U8 mode,int* power_detection_level)
{
	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_STB6000)
	{
		step = 9000000;
		Error = (TunerInstance->Driver->tuner_SetBandWidth)(TunerInstance->DrvHandle, 12000, &BandWidth); /* LPF cut off freq = 4+5+5MHz*/
	}
	else if(TunerInstance->Driver->ID == STTUNER_TUNER_MAX2116)
	Error = (TunerInstance->Driver->tuner_SetBandWidth)(TunerInstance->DrvHandle, 36000, &BandWidth); /* LPF cut off freq = 18MHz*/
	else if(TunerInstance->Driver->ID == STTUNER_TUNER_HZ1184)
	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*/
	
	nbTones = Drv0288_SpectrumAnalysis(TunerInstance, DeviceMap, Inst[TopLevelHandle].Sat.Demod.IOHandle, StartFreq, StopFreq, step, ToneList,mode,power_detection_level);	/* spectrum acquisition */
		
	return nbTones;
}
#endif
#endif


⌨️ 快捷键说明

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