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

📄 qpsk0299.c

📁 stv0299资料
💻 C
📖 第 1 页 / 共 4 页
字号:
 *										TRANSPONDER_INFO_STRUCT
 *
 * OUTPUT						: 	nothing
 *
 * GLOBAL VARIABLES USED	:
 *		a.	iCurSymbolRate			int						(W)
 *		b.	iInitialTunedFreq		int						(W)
 *		c.	iCurLnbFreq				int						(W)
 *		d.	ucCurPolarisation		BYTE						(W)
 *		e.	iTunerOffset			int						(W)
 *		f.	iCurTunedFreq			int						(W)
 *		g.	vco_control_state		vco_control_state_t	(R/W)
 *		h.	iCurTunerTaskState	int			ENUM_TUNER_TASK_STATES			(R/W)
 *		i.	cCurLnbSource			signed char				(R/W)
 *
 * DEVICES ACCESSED			:	
 *			a.	STv0196				I2C			(R/W)
 *
 * FUNCTIONS CALLED			:  
 *			a. I2C_write				..\..\DRIVERS\I2C.C
 *
 * CALLERS						:	
 * 		a.	usif_process			..\..\USIF\SOURCE\USIF.C
 *
 * PURPOSE		:	
 *		to fire new req to tuning process
 */
/*{{{ DVBNewTuneReq ()*/
void	DVBNewTuneReq ( TRANSPONDER_INFO_STRUCT *pstTransponderInfo )
{

#ifndef	INTEGRATE_TUNER_MODULE
	return;
#else


   FORCE_TUNER_STATE ( TUNER_IDLE );
   
   StillLocked = true;
   
   TUNER_TUNER_CRITICAL ( do_report ( severity_info, "NEW_REQ => psemTunerIdleStateEntered (%d)\n", psemTunerIdleStateEntered -> semaphore_count ) );
   semaphore_wait ( psemTunerIdleStateEntered );

#ifdef   PRINT_DEBUG
   do_report ( severity_info, "\n\nTuning Req => F[%d] Sym[%d] Pol[%s]\n", 
            pstTransponderInfo -> iTransponderFreq,
            pstTransponderInfo -> iSymbolRate,
            ( pstTransponderInfo -> ucStatusPolFlag & POL_BIT_MASK ) == TUNER_POL_VERT ? "VERT" : "HORZ" );
#endif

   /* get the tuner step size in KHz */	
   iTunerStepSize = TunerGetStepSize () / 1000;
   if ( iTunerStepSize <= 0 )
      iTunerStepSize = 1;

   /* Initialise Default Params */
   InitParams ();
		   
	/*
	 * save the mailed req as new req
	 */
	iRequestedSymbolRate			= pstTransponderInfo -> iSymbolRate * 1000;

	if ( pstTransponderInfo -> iSymbolRate > SCPC_SYMBOL_RATE_THRESHOLD )
	{
		iMaxLnbDrift = ( int ) MAX_MCPC_OFFSET;
		cMaxTimingDriftNegative	= MCPC_TMG_MAX_DRIFT_NEGATIVE;
		cMaxTimingDriftPositive	= MCPC_TMG_MAX_DRIFT_POSITIVE;
	}
	else
	{
		iMaxLnbDrift = ( int ) MAX_SCPC_OFFSET;
		cMaxTimingDriftNegative	= SCPC_TMG_MAX_DRIFT_NEGATIVE;
		cMaxTimingDriftPositive	= SCPC_TMG_MAX_DRIFT_POSITIVE;
	}

	if ( pstTransponderInfo -> cSourceLnb < 0 || pstTransponderInfo -> cSourceLnb > 1 )
	{
		do_report ( severity_error, "Xpdr Record is corrupted. SrcLNB [%d]\n", pstTransponderInfo -> cSourceLnb );
	}

	if ( pstTransponderInfo -> cSourceLnb == LNB1 )
	{
		cCurLnbSource				= LNB1;
	}
	else
	{
		cCurLnbSource				= LNB2;
	}

   /* setup lnb information */
   iRequestedLnbFreq = pstBoxInfo -> aiLnbFreq [ cCurLnbSource ] [ LNB_LOW_FREQ_INDEX ];

/* LP - 300600 - Enabling SetupLnbPower */
#if 1
	SetupLnbPower ();
#endif
     /* setup polarization */
	if ( TUNER_POL_VERT == ( pstTransponderInfo -> ucStatusPolFlag & POL_BIT_MASK ) )
      iCurPolarization = VERTICAL;
   else
      iCurPolarization = HORIZONTAL;

    SetPolarization ( iCurPolarization );
   
	iRequestedTransponderFreq	= pstTransponderInfo -> iTransponderFreq;
  
	if ( iRequestedLnbFreq > iRequestedTransponderFreq )
	{
		iInitialTunedFreq = iRequestedLnbFreq - iRequestedTransponderFreq;
	} 
	else
	{
		iInitialTunedFreq = iRequestedTransponderFreq - iRequestedLnbFreq;
	  
	}

	/* LP - 290800 - Added support for 22KHz burst tone */
	/* LP - 041200 - Correction of 22KHz burst mode activation,  FREQ_LIMIT_TO_TURN_ON_22KHZ = 1.9GHz */
   	if  (iInitialTunedFreq >= FREQ_LIMIT_TO_TURN_ON_22KHZ)
	{
        TUNER_TUNER_CRITICAL ( do_report ( severity_info, "Turn 22Khz on and switch to upper band\n" ) );
	 	iRequestedLnbFreq = pstBoxInfo -> aiLnbFreq [ cCurLnbSource ] [ LNB_HIGH_FREQ_INDEX ];
	 	SetLnb(1);
	}
	else
	{
	 	TUNER_TUNER_CRITICAL ( do_report ( severity_info, "Turn 22Khz off and switch to lower band\n" ) );
	 	iRequestedLnbFreq = pstBoxInfo -> aiLnbFreq [ cCurLnbSource ] [ LNB_LOW_FREQ_INDEX ];
		SetLnb(0);
	}
	/* End of 22KHz support */
   
   /* Added by LP on 18/12/00 to support Ku switching bands 
    * We need to recalculate the  iInitialTunedFreq since
    * iRequestedLnbFreq might have changed after the band switching 
    */

   iInitialTunedFreq = abs(iRequestedTransponderFreq - iRequestedLnbFreq);


   acLnbOffset [ cTransponderIndex2bRetrieved ] = ( signed char ) pstTransponderInfo -> ucPwmVal;

   iCurFsRegOffset = ( int ) asSymbolRateOffset [ cTransponderIndex2bRetrieved ];

	if ( cTransponderIndex2bRetrieved >= 0 && cTransponderIndex2bRetrieved < MAX_NO_OF_TRANSPONDERS )
		iTunerOffset = ( int ) acLnbOffset [ cTransponderIndex2bRetrieved ];
	else
		iTunerOffset = 0;

	if ( iTunerOffset == 0 )
		iTunerOffset = asLnbOffset [ cCurLnbSource ];

   TUNER_TUNER_CRITICAL ( do_report ( severity_info, "iTunerOffset => %d, Xpdr[%d] LNB[%d]\n",
            iTunerOffset,
            acLnbOffset [ cTransponderIndex2bRetrieved ],
            asLnbOffset [ cCurLnbSource ] ) );

   
   iTunerOffset *= iTunerStepSize;

	iCurTunedFreq			= iInitialTunedFreq + iTunerOffset;
  
   Result . SignalType  = NOAGC1;
   Result . Frequency   = 0;
   Result . SymbolRate  = 0;

	if ( ( int ) pstTransponderInfo -> ucStatusPolFlag & IQ_STATUS_VALID_BIT_MASK )
	{
		/*
		 * if it is a valid status flag, then consider the spectrum inversion
		 * status found during prev tuning.
		 */
		if ( ( ( int ) pstTransponderInfo -> ucStatusPolFlag & IQ_INV_BIT_MASK ) == IQ_INV_BIT_MASK )
			bSpectrumInverted = TRUE;
		else
			bSpectrumInverted = FALSE;
	}
	else
	{

		/*
		 * check whether it is needed to invert I&Q by software if it is C_BAND
		 */
		if ( iRequestedLnbFreq < iRequestedTransponderFreq )
		{
			/*
			 * Ku-BAND, no need to invert I&Q but if it is inverted by
			 * hardware then to nullify it invert it by S/W too.
			 */
#ifdef	IQ_INVERTED_IN_HARDWARE
			bSpectrumInverted = TRUE;
#else
			bSpectrumInverted = FALSE;
#endif
		}
		else
		{
			/*
			 * C-BAND, need to invert I&Q but if it is already inverted by
			 * hardware then no need to invert it by S/W.
			 */
#ifdef	IQ_INVERTED_IN_HARDWARE
			bSpectrumInverted = FALSE;
#else
			bSpectrumInverted = TRUE;
#endif
		}
	}

   if ( bSpectrumInverted == TRUE )
   {
      /* setup inverted IQ */
      RegSetField ( IQ, 1 );
   }
   else
   {
      RegSetField ( IQ, 0 );
   }

   /* 
    * VICKY - 310300 - force initial freq, so that even if the DBASE starts
    * the PAT firing before the actual tuning happening, we will not get the
    * same PAT of the currently tuned one.
    */
   TunerSetFrequency ( iCurTunedFreq );
	FieldSetVal ( DEROTATORFREQUENCYMSB, 0 );
	FieldSetVal ( DEROTATORFREQUENCYLSB, 0 );
	RegSetRegisters ( R_CFRM, 2 );
   		 

   RegSetSymbolRate ( iRequestedSymbolRate + iCurFsRegOffset );

   FORCE_TUNER_STATE ( TUNER_SETUP_PARAMS );
   semaphore_signal ( psemTunerIdleStateReleased );

#endif

}
/*}}}*/

/*{{{ DEMOD_Delay ()*/
void  DEMOD_Delay ( unsigned int uiDelayInMilliSec )
{
   MILLI_DELAY ( uiDelayInMilliSec );
}  
/*}}}*/

/*{{{ DEMOD_TunerCentering ()*/
SIGNALTYPE  DEMOD_TunerCentering ( SEARCHPARAMS *pParams )
{
   signed int  iLocLnbOffset;
   int         iFrequency;

   /* read the current derotator offset */
	RegGetRegisters ( R_CFRM, 2 );
	iLocLnbOffset = ( short int ) MAKEWORD ( FieldGetVal ( DEROTATORFREQUENCYMSB ), FieldGetVal ( DEROTATORFREQUENCYLSB ) );

   iFrequency = TunerGetFrequency () + ( iDerotatorSignValue * iLocLnbOffset * ( pParams -> Mclk ) / 1000 );

   iLocLnbOffset = pParams -> BaseFreq - iFrequency;

   TUNER_TUNER_CRITICAL ( do_report ( severity_info, "TunerCentring => [%c] Act[%d] Off[%d] New[%d] CarrOff[%d]\n", 
            iDerotatorSignValue == -1 ? '-' : '+',
            pParams -> BaseFreq,
            iLocLnbOffset,
            iFrequency,
            ( short int ) MAKEWORD ( FieldGetVal ( DEROTATORFREQUENCYMSB ), FieldGetVal ( DEROTATORFREQUENCYLSB ) ) ) );

   if ( ABS ( iLocLnbOffset ) < iMaxLnbDrift )
   {
      pParams -> Frequency = TunerSetFrequency ( iFrequency );
		pParams -> DerotFreq = ( ( iFrequency  - pParams -> Frequency ) * 1000 ) / pParams -> Mclk;

		pParams -> DerotFreq *= iDerotatorSignValue;

	   RegSetField ( CFD_ALGO, 0 );
		FieldSetVal ( DEROTATORFREQUENCYMSB, MSB ( pParams -> DerotFreq ) );
		FieldSetVal ( DEROTATORFREQUENCYLSB, LSB ( pParams -> DerotFreq ) );   
		RegSetRegisters ( R_CFRM, 2 );

		/* center TUNER_FREQ before doing Zig-Zag scan */
      iTunerOffset = iLocLnbOffset;
      pParams -> TunerOffset = iTunerOffset;

		RegGetRegisters ( R_CFRM, 2 );
      TUNER_TUNER_CRITICAL ( do_report ( severity_info, "TunerCentred => (%c) Freq (W[%d] R[%ld]) Derot (W[%d] R[%d])\n",
            iDerotatorSignValue == -1 ? '-' : '+',
            iFrequency,
            TunerGetFrequency (),
		      pParams -> DerotFreq,
            ( short int ) MAKEWORD ( FieldGetVal ( DEROTATORFREQUENCYMSB ), FieldGetVal ( DEROTATORFREQUENCYLSB ) ) ) );

      DEMOD_CenterTimingLoop ( pParams );
   }
   else	/* ADDED BY LP on 101100 */
   {
	TUNER_TUNER_CRITICAL ( do_report ( severity_info, "iLocLnbOffset > iMaxLnbDrift!!\n"));
  
   }	
   /* after centering check for data */
   CheckData ( pParams );

   return   pParams -> State;
}
/*}}}*/

/*
 * CODE       : DEMOD_SearchData
 * TYPE       : subroutine
 * PROTOTYPE  : 
 *    SIGNALTYPE  DEMOD_SearchData ( SEARCHPARAMS *pParams );
 *
 * PURPOSE :  
 * Searches the DATA by first with & without inverting IQ.
 */
/*{{{ DEMOD_SearchData ()*/
SIGNALTYPE DEMOD_SearchData ( SEARCHPARAMS *pParams )
{
	if ( CheckData ( pParams ) == NODATA )		/*	Check for data	*/   
	{
      int   iIqOriginal;

      iIqOriginal = RegGetField ( IQ );

		IQInvertion();					/*	Invert I and Q	*/

      TUNER_TUNER_CRITICAL ( do_report ( severity_info, "TCC => Inverting IQ => O[%d] N[%d]\n",
            iIqOriginal, 
            RegGetField ( IQ ) ) );

		if ( CheckData ( pParams ) == NODATA ) /*	Check for data	*/
		{
         iIqOriginal = RegGetField ( IQ );
			IQInvertion();				/*	Invert I and Q	*/ 

         TUNER_TUNER_CRITICAL ( do_report ( severity_info, "TCC => Bringing IQ to Normal => O[%d] N[%d]\n",
               iIqOriginal, 
               RegGetField ( IQ ) ) );
		}
	}
	
	return pParams -> State;
}
/*}}}*/

/*{{{ DEMOD_CenterTimingLoop ()*/
long  DEMOD_CenterTimingLoop ( SEARCHPARAMS *pParams )
{
   int      iLoopCount;
   int      iTimingOffset;
   long     lCurSymbolRate,
            lCurOffset,
            lNewCalcSymbolRate;
   int      iLocFsOffset;

   if ( pParams -> SymbolRate > ( SCPC_SYMBOL_RATE_THRESHOLD * 1000 ) )
   {
      return   pParams -> SymbolRate;
   }
   
   iLoopCount = 4;
   while ( iLoopCount ) 
   {
      /*    Read register    */
      iTimingOffset = RegGetField ( RTF );

      lCurSymbolRate = RegGetSymbolRate ();
      lCurOffset = ( pParams -> SymbolRate * iTimingOffset ) / 524288;  /* Fs(off) = ( TO * Fs ) / (2^19); */
      lNewCalcSymbolRate = lCurSymbolRate + lCurOffset;

      iLocFsOffset = ( int ) ( pParams -> SymbolRate - lNewCalcSymbolRate );

      TUNER_TUNER_CRITICAL ( do_report ( severity_info, "CenterTiming => CurSym[%ld] CurOff[%ld] TiO[%d]\n",
                  lCurSymbolRate,
                  lCurOffset,
                  iTimingOffset ) );

      if ( iLocFsOffset != iCurFsRegOffset )
      {
         iCurFsRegOffset = iLocFsOffset;
         asSymbolRateOffset [ cTransponderIndex2bRetrieved ] = ( signed short int ) iCurFsRegOffset;

         RegSetSymbolRate ( lNewCalcSymbolRate );

         TUNER_TUNER_CRITICAL ( do_report ( severity_info, "Symb => A[%ld] C[%ld] Off[%ld] TiO[%d] N[%ld] Diff[%ld]\n",
               pParams -> SymbolRate,
               lCurSymbolRate,
               lCurOffset,
               iTimingOffset,
               lNewCalcSymbolRate,
               lCurSymbolRate - lNewCalcSymbolRate ) );

#if   0
         printf ( "CurSymb [%ld] Calc[%ld]\n",
               RegGetSymbolRate (),
               lNewCalcSymbolRate );
#endif

         MILLI_DELAY ( pParams -> Ttiming );
         iTimingOffset = RegGetField ( RTF );
      }

      if ( ABS ( iTimingOffset ) < 60 )
         break;
      
      --iLoopCount;
   }

   return lNewCalcSymbolRate;
}
/*}}}*/

/*{{{ DEMOD_SearchFalseLock ()*/
BOOLEAN  DEMOD_SearchFalseLock ( SEARCHPARAMS *pParams )
{
   signed int  iCurCarrierOffset;
   int         iFrequency;
   int         iNewFrequency;
   int         iSignValue;

   if ( bImageTried == TRUE )
      return   FALSE;

   /* read the current derotator offset */
	RegGetRegisters ( R_CFRM, 2 );
	iCurCarrierOffset = ( short int ) MAKEWORD ( FieldGetVal ( DEROTATORFREQUENCYMSB ), FieldGetVal ( DEROTATORFREQUENCYLSB ) );

   iFrequency = TunerGetFrequency () + ( iCurCarrierOffset * ( pParams -> Mclk ) / 1000 );

   if ( pParams -> DerotFreq > 0 )
      iSignValue = 1;
   else
      iSignValue = -1;

   iNewFrequency = iFrequency + ( iSignValue * ( pParams -> SymbolRate / 4000 ) );

   TUNER_TUNER_CRITICAL ( do_report ( severity_info, "FalseLock => Base[%d] Off[%d] Cur[%d] New[%d] CarrOff[%d]\n", 
            pParams -> BaseFreq,
            pParams -> BaseFreq - iFrequency,
            iFrequency,
            iNewFrequency,
            ( short int ) MAKEWORD ( FieldGetVal ( DEROTATORFREQUENCYMSB ), FieldGetVal ( DEROTATORFREQUENCYLSB ) ) ) );

   iCurCarrierOffset = pParams -> BaseFreq - iNewFrequency;

   if ( ABS ( iCurCarrierOffset ) < iMaxLnbDrift )
   {
      bImageTried = TRUE;

      pParams -> Frequency  = TunerSetFrequency ( iNewFrequency );
      pParams -> DerotFreq  = ( ( iNewFrequency  - pParams -> Frequency  ) * 1000 ) / pParams -> Mclk;

      pParams -> DerotFreq *= iDerotatorSignValue;

      RegSetField ( CFD_ALGO, 1 );
	   FieldSetVal ( DEROTATORFREQUENCYMSB, MSB ( pParams -> DerotFreq ) );
	   FieldSetVal ( DEROTATORFREQUENCYLSB, LSB ( pParams -> DerotFreq ) );   
	   RegSetRegisters ( R_CFRM, 2 );

	   RegGetRegisters ( R_CFRM, 2 );
      TUNER_TUNER_CRITICAL ( do_report ( severity_info, "FalseLock => New[%d] Off[%d]\n",
               TunerGetFrequency (),
               ( short int ) MAKEWORD ( FieldGetVal ( DEROTATORFREQUENCYMSB ), FieldGetVal ( DEROTATORFREQUENCYLSB ) ) ) );

      return   TRUE;
   }

   return   FALSE;
}
/*}}}*/


⌨️ 快捷键说明

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