📄 qpsk0299.c
字号:
* 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 + -