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

📄 driv0299.c

📁 stv0299资料
💻 C
📖 第 1 页 / 共 4 页
字号:
	else
		pParams->State = BWTOONARROW;
		
	return pParams->State;
}

  
/****************************************************
--FUNCTION	::	NextSubRange
--ACTION	::	Compute the next SubRange of the search 
--PARAMS IN	::	Frequency	->	Start frequency
--				pParams->SearchRange
--PARAMS OUT::	pParams->SubRange
--RETURN	::	NONE
--***************************************************/
void NextSubRange(SEARCHPARAMS *pParams)
{
	long OldSubRange;

	if(pParams->SubDir > 0)
	{
		OldSubRange = pParams->SubRange;
		pParams->SubRange = MIN((pParams->SearchRange/2) - (pParams->TunerOffset + pParams->SubRange/2),pParams->SubRange);
		pParams->TunerOffset += (OldSubRange + pParams->SubRange)/2;
	}
	
	pParams->Frequency = pParams->BaseFreq + (pParams->SubDir * pParams->TunerOffset)/1000;    
	pParams->SubDir = -pParams->SubDir;

#if   1
   do_report ( severity_info, "New => SubR[%d] SrchR[%d] TO[%d] Dir[%d] Freq[%d]\n",
		   pParams->SubRange,
         pParams->SearchRange,
         pParams->TunerOffset,
	      pParams->SubDir,
	      pParams->Frequency );
#endif
}

/*****************************************************
--FUNCTION	::	AutoSearchAlgo
--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)
--***************************************************/
SIGNALTYPE AutoSearchAlgo(void)
{
	int		errorrate,sn,to,hy;

	SEARCHPARAMS *pParams;
	SEARCHRESULT *pResult;
	
	pParams = &Params;
	pResult = &Result;
	
	pParams->Frequency = pParams->BaseFreq;
	pParams->Direction = 1;
	
#if   0
   /* VICKY - 290200 - modify the beta_car depending on the i/p symb rate */
   {
      int   iValue2Write;
      
      iValue2Write = RegGetField ( BETA_CAR );

      if ( pParams -> SymbolRate > 15000000L )
      {
         iValue2Write = 0x15;
      }
      else
      {
         if ( pParams -> SymbolRate > 5000000L )
         {
            iValue2Write = 0x0F;
         }
         else
         {
            if ( pParams -> SymbolRate > 2000000L )
            {
               iValue2Write = 0x09;
            }
            else
            {
               iValue2Write = 0x06;
            }
         }
      }

      RegSetField ( BETA_CAR, iValue2Write );
   }
#endif
   
	/*	Insert I2C access here	*/
	RegTriggerOn();	/*______________________________________TRIGGER____________________________________________*/  
	RegSetSymbolRate ( pParams -> SymbolRate );	/*	Set the symbol rate	*/
	RegGetOneRegister(R_PR);
	RegGetOneRegister(R_VSEARCH);  
	
	/*	Get fields value	*/
	sn=FieldGetVal(SN);  
	to=FieldGetVal(TO);  
	hy=FieldGetVal(H);  
	errorrate=FieldGetVal(RATE);
	RegTriggerOff();	/*______________________________________TRIGGER____________________________________________*/  
	
	/*	Initial calculations	*/
	RegTriggerOn();	/*______________________________________TRIGGER____________________________________________*/    
	pParams->DerotStep = pParams->DerotPercent*(pParams->SymbolRate/1000L)/pParams->Mclk;	/*	saut de DerotStep/1000 * Fsymbol	*/     
	pParams->Ttiming = CalcTimingTimeConstant(pParams->SymbolRate);
	pParams->Tderot = 2 + CalcDerotTimeConstant(pParams->SymbolRate);
	pParams->Tdata = 2 + CalcDataTimeConstant(errorrate,sn,to,hy,pParams->SymbolRate);
	RegTriggerOff();	/*______________________________________TRIGGER____________________________________________*/ 

   REPORT_PRINT ( ( FE_MSG_CALC_AGC_TIMING, 
               pParams -> Tagc1,
               pParams -> Tagc2,
               pParams -> DerotStep ) );

   REPORT_PRINT ( ( FE_MSG_CALC_SEARCH_TIMING, 
               pParams -> Ttiming,
               pParams -> Tderot,
               pParams -> Tdata ) );

	if ( FirstSubRange(pParams) == BWOK )
	{
		do
		{ 
         REPORT_PRINT ( ( FE_MSG_SEARCH_PARAMS,
               pParams -> SubRange,
               pParams -> TunerOffset, 
               pParams -> SubDir ) );

			/*	Initialisations	*/
			FieldSetVal(DEROTATORFREQUENCYMSB,0); 
			FieldSetVal(DEROTATORFREQUENCYLSB,0);   
			RegSetRegisters(R_CFRM,2); 		/*	Reset of the derotator frequency	*/
			RegSetField(RTF,0);
			RegSetField(CFD_ALGO,1);
	
			pParams->DerotFreq = 0;
			pParams->State = NOAGC1;
		
			RegTriggerOn();		/*______________________________________TRIGGER____________________________________________*/    
			pParams->Frequency = TunerSetFrequency(pParams->Frequency);	/*	Move the tuner	*/ 
			RegTriggerOff();	/*______________________________________TRIGGER____________________________________________*/
		
			/*	Temporisations	*/
			RegTriggerOn();	/*______________________________________TRIGGER____________________________________________*/    
			SystemWaitFor(pParams->Tagc1 + pParams->Tagc2 + pParams->Ttiming);	/*	Wait for agc1,agc2 and timing loop	*/
			WaitTuner(100);		/*	Is tuner Locked	? (wait 100 ms maxi)	*/
			#if (HOST > 1000)  
				ReportInsertMessage(SEARCHFREQUENCY,pParams->Frequency,0); 
			#endif
			RegTriggerOff();	/*______________________________________TRIGGER____________________________________________*/
		
         REPORT_PRINT ( ( FE_MSG_SEARCH_FREQUENCY, pParams -> Frequency, 0, 0 ) );

			RegTriggerOn();	/*______________________________________TRIGGER____________________________________________*/    
			if(CheckAgc1(pParams)>AGC1SATURATION)
			{
				#if (HOST > 1000)  
					ReportInsertMessage(SEARCHAGC1,0,0);   
				#endif

            REPORT_PRINT ( ( FE_MSG_SEARCH_AGC1, 0, 0, 0 ) );

				/*	There is signal in the band	*/
#if   0
				if ( pParams -> SymbolRate <= ( pParams -> SubRange / 2L ) )
#else
				if ( pParams -> SymbolRate <= ( pParams -> TunerBW / 2L ) )
#endif
            {
					SearchTiming(pParams,pResult);		/*	For low rates (SCPC)	*/
            }
				else
            {
					CheckTiming(pParams);				/*	For high rates (MCPC)	*/ 
            }
			
				if(pParams->State == TIMINGOK)
				{	
					#if (HOST > 1000)  
						ReportInsertMessage(SEARCHTIMING,pParams->DerotFreq,pParams->Mclk);   
					#endif
                REPORT_PRINT ( ( FE_MSG_CARRIER_SEARCH, pParams -> DerotFreq, pParams -> Mclk, 0  ) );

#ifdef   ENABLE_CENTRE_TIMING
               {
                  long  lNewSymbolRate;
                  lNewSymbolRate = CenterTimingLoop ( pParams -> SymbolRate, pParams -> MasterClock );
#if   0
                  printf ( "\n\n\n\n****> Old(%d) New(%d)\n\n\n",
                        pParams -> SymbolRate,
                        lNewSymbolRate );
#endif
               }   
#endif

					if(SearchCarrier(pParams,pResult) == CARRIEROK)	/*	Search for carrier	*/  			
					{
						#if (HOST > 1000)  
							ReportInsertMessage(SEARCHCARRIER,pParams->DerotFreq,pParams->Mclk);  
						#endif

						if(SearchData(pParams,pResult) == DATAOK)	/*	Check for data	*/ 
						{
							if(pParams->ScanMode != DRV_SCAN)
								TunerCentering(pParams,pResult,2000000);
						
							if(CheckRange(pParams,pResult) == RANGEOK)
							{
									pResult->Frequency = pParams->Frequency + (pParams->DerotFreq*(pParams->Mclk)/1000); 
									pResult->PunctureRate = RegGetField(CPR); 
							
									#if (HOST > 1000)  
										ReportInsertMessage(SEARCHFOUND,pResult->Frequency,0);  
										ReportInsertMessage(SEARCH_SR_PR,pResult->SymbolRate,pResult->PunctureRate);   
									#endif
                           REPORT_PRINT ( ( FE_MSG_DATA_LOCKED, pResult -> Frequency, 0, 0 ) );
                           REPORT_PRINT ( ( FE_MSG_SYMBOL_PR, pResult -> SymbolRate, pResult -> PunctureRate, 0 ) );
							}
						}
					}
				}
			}
		
			if(pParams->State != RANGEOK) 
         {
				NextSubRange(pParams);
         }
		
			RegTriggerOff();	/*______________________________________TRIGGER____________________________________________*/
		}	  
#ifdef   SYNCHRONISE_WITH_TUNER_TASK_STATE
      while(pParams->SubRange && pParams->State!=RANGEOK && iCurTunerTaskState == iSavedTunerTaskState );
#else
      while(pParams->SubRange && pParams->State!=RANGEOK );
#endif
	}
	else
	{
		#if (HOST > 1000)  
			ReportInsertMessage(SEARCHBW,0,0);   
		#endif	
	}
	
	pResult->SignalType = pParams->State;
	
	return	pParams->State;
}


/****************************************************
--FUNCTION	::	FillWidthArray
--ACTION	::	Create a list of carrier's width
--PARAMS IN	::	pSymbolRate	->	List of carrier's symbol rate (Kbauds or Mbauds)
--				RollOff		->	Rolloff * 100
--PARAMS OUT::	NONE
--RETURN	::	List of carrier's width (KHz or MHz) 
--**************************************************/
long *FillWidthArray(long *pSymbolRate, long RollOff,long *Min)
{
	long *pWidth;
	int Width=0;
	int i;
	
	while(pSymbolRate[Width]) Width++;
	
	pWidth =(long *) calloc (Width,sizeof(long));
	
	for(i=0;i<Width;i++)
	{
		pWidth[i]=CarrierWidth(pSymbolRate[i],RollOff);  
		
		if(i==0 || pWidth[i]<*Min)
			*Min = pWidth[i];
	}
	
	return pWidth;
}

/*****************************************************
--FUNCTION	::	DeleteWidthArray
--ACTION	::	Destroy a list of carrier's width
--PARAMS IN	::	pWidth	->	List of carrier's width
--PARAMS OUT::	NONE
--RETURN	::	NONE 
--***************************************************/
void DeleteWidthArray(long *pWidth)
{
	if(pWidth) free(pWidth);
}

/*****************************************************
--FUNCTION	::	EndOfScan
--ACTION	::	Check the end of the scan
--PARAMS IN	::	Direction	->	Direction of the scan
--				Frequency	->	Current frequency
--				EndFrequency	->	Frequency to be reached
--PARAMS OUT::	NONE
--RETURN	::	TRUE if the end is reached, FALSE otherwise 
--***************************************************/
int EndOfScan(SCANDIR Direction, long Frequency, long EndFrequency)
{
	if(Direction == SCANUP)
		return Frequency >= EndFrequency;
	else
		return Frequency <= EndFrequency;
}

/*****************************************************
--FUNCTION	::	SetPolarization
--ACTION	::	set the polarization
--PARAMS IN	::	Polarization	->	Polarization
--PARAMS OUT::	NONE
--RETURN	::	NONE
--***************************************************/
void SetPolarization(POLARIZATION Polarization)
{
	U8 				   DataBuf[2];
	U32                ActLen;
	extern 	   STI2C_Handle_t		   I2CDemodHandle;	

	/* LP - 28/08/00 - Standard settings restored:
                	   Polarization vert == 13V (LOW) =>   OP2=0
                	   Polarization horiz == 18V (HIGH) => OP2=1
    				   Lock configuration == Push-Pull
      Remark: In MiCo software or EVAL0299MAX the reverse convention has been adopted!
     */

	if(Polarization == VERTICAL)
	  { /*	RegSetField(LOCKOUTPUT,0x40);*/
	  	RegSetOneRegister(R_DISEQC, 0x0);
	  /* DataBuf[0] = (char) R_DISEQC;
	   DataBuf[1] = 0 ;	
	   STI2C_Write(I2CDemodHandle, DataBuf, sizeof(DataBuf), 100, &ActLen );*/
      }
	 else
	  {	
	  /*DataBuf[0]= (char)R_DISEQC;
	  DataBuf[1]= 0x40;	
	  STI2C_Write(I2CDemodHandle, DataBuf, sizeof(DataBuf), 100, &ActLen );
		RegSetField(LOCKOUTPUT,0);*/
		RegSetOneRegister(R_DISEQC,0x40);
	  }
}

/*****************************************************
--FUNCTION	::	GetPolarization
--ACTION	::	Get the polarization
--PARAMS IN	::	Polarization	->	Polarization
--PARAMS OUT::	NONE
--RETURN	::	NONE
--***************************************************/
POLARIZATION GetPolarization(void)
{
	if(RegGetField(LOCKOUTPUT))
		return HORIZONTAL;
	else
		return VERTICAL;
}

/*****************************************************
--FUNCTION	::	NextPolarization
--ACTION	::	Compute the next polarization
--PARAMS IN	::	Polarization	->	Current polarization
--				Mode			->	Polarization mode
--PARAMS OUT::	NONE
--RETURN	::	Next polarization 
--***************************************************/
int NextPolarization(POLARIZATION Polarization,POLARIZATION Mode) 
{
	switch(Polarization)
	{
		case HORIZONTAL:
			if(Mode == H_V)
				Polarization = VERTICAL; 
			else
				Polarization = NOPOLARIZATION;
		break;
		
		case VERTICAL:
			if(Mode == V_H)
				Polarization = HORIZONTAL; 
			else
				Polarization = NOPOLARIZATION;
		break;
		
		default:
			Polarization = NOPOLARIZATION;  
		break;
	}
	
	if(Polarization != NOPOLARIZATION)
		SetPolarization(Polarization);
	
	return Polarization;
}


/*****************************************************
--FUNCTION	::	FirstPolarization
--ACTION	::	Compute the first polarization
--PARAMS IN	::	Mode	->	Polarization mode
--PARAMS OUT::	NONE
--RETURN	::	First polarization 
--***************************************************/
int FirstPolarization(POLARIZATION Mode)
{
	int Polarization = NOPOLARIZATION;
	
	switch(Mode)
	{
		case HORIZONTAL: 
		case H_V:
			Polarization = HORIZONTAL;
		break;
		
		case VERTICAL: 
		case V_H:
			Polarization = VERTICAL;
		break;
	}
	
	/*	Insert here your code to change the polarization	*/ 
	SetPolarization(Polarization);
	
	return Polarization;
}

/*****************************************************
--FUNCTION	::	SetLnb
--ACTION	::	set the Lnb
--PARAMS IN	::	Lnb	-> true for LnbHigh, false for LnbLow	
--PARAMS OUT::	NONE
--RETURN	::	NONE
--***************************************************/
void SetLnb(int Lnb)
{
	RegSetField(OP0VALUE,Lnb);
}

/*****************************************************
--FUNCTION	::	SelectLnb
--ACTION	::	Select the local oscillator corresponding to the current frequency 
--PARAMS IN	::	CurrentLnb			->	Current value of the Lnb offset
--				ScanLnb				->	List of Lnb followed by the switch value
--				CurrentFrequency	->	Frequency to be scanned 
--PARAMS OUT::	CurrentLnb			->	New value of the Lnb offset
--RETURN	::	NONE
--***************************************************/
void SelectLnb(long *CurrentLnb,long *ScanLnb,long CurrentFrequency)
{
	if((CurrentFrequency > ScanLnb[2]) && (*CurrentLnb!=ScanLnb[1]))
	{
		*CurrentLnb = ScanLnb[1];
		SetLnb(1);
	}
	
	if((CurrentFrequency < ScanLnb[2]) && (*CurrentLnb!=ScanLnb[0]))
	{
		*CurrentLnb = ScanLnb[0];
		SetLnb(0);
	}
}

/*****************************************************
--FUNCTION	::	AutoFrequencyScan
--ACTION	::	Search all the carriers with the selected symbol rates and polarization 
--				in the bandwidth [StartScanFrequency,EndScanFrequency]
--				(symbol rates must be in increase order)
--PARAMS IN	::	StartScanFrequency	->	start frequency
--				EndScanFrequency	->	end frequency
--				ScanLnb				->	LowLnb, HighLnb and switch value
--				pSymbolRate			->	List of symbol rates (Kbauds)
--				DerotStep			->	Step of the derotator during the carrier search
--				PolarizationMode	->	polarization test order

⌨️ 快捷键说明

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