📄 cx24143drv.c
字号:
chan.symbrate =Stuning.nim_satellite_tune.symbol_rate ;
chan.frequency = Stuning.nim_satellite_tune.frequency*1000;
}
*/
if(i%2)
{
//chan.symbrate =Stuning.nim_satellite_tune.symbol_rate-50*(i/2+1);
chan.frequency = Stuning.nim_satellite_tune.frequency*1000-250000*(i/2+1);
nFrequencyOffset = (-1)*250000*(i/2+1);
}
else
{
//chan.symbrate =Stuning.nim_satellite_tune.symbol_rate +50*(i/2+1);
chan.frequency = Stuning.nim_satellite_tune.frequency*1000+250000*(i/2+1);
nFrequencyOffset = 250000*(i/2+1);
}
CSTRACE(QPSK_DEBUG_LEVEL,"[HDIQPSK] Sym: %d, Freq: %d\n",chan.symbrate, chan.frequency);
// if(LockStatus)
// return CSQPSK_SUCCESS; //full locked
}
CSTRACE(QPSK_DEBUG_LEVEL,"[HDIQPSK] CX2414x not locked!!!\n");
return CSQPSK_FAILURE;
#else
API_AcqBegin( &NIMs[bTunerIndex] );
API_ClearPendingInterrupts( &NIMs[bTunerIndex] );
// acq_failure_countdown[unit] = DEMOD_CONNECT_COUNTDOWN;
APIresult = API_ChangeChannel( &NIMs[bTunerIndex], &chan );
if ( !APIresult )
{
CSASSERT(APIresult);
API_SetInterruptOptions( &NIMs[bTunerIndex], COBRA_NO_INTERRUPTS );
return CSQPSK_FAILURE;
}
API_SetInterruptOptions( &NIMs[bTunerIndex], COBRA_CONNECTING_INTERRUPTS );
//CSSleep(100);//800
nReturn = CSQPSKSleep(bTunerIndex,500);
if ( CSQPSK_DROPPED == nReturn )
{
CSTRACE( INFO_LEVEL, "\nQUICKEXIT\n");
return CSQPSK_DROPPED;
}
/* Make sure it locked on */
CSSleep(800);
API_GetPendingInterrupts( &NIMs[bTunerIndex], &pending );
API_Monitor( &NIMs[bTunerIndex], &NewAcqState[0], &NewLock[0] );
if(LockStatus[0])
mwpp_parse_pat_start();
/* Clear interrupts */
API_ClearPendingInterrupts( &NIMs[bTunerIndex] );
API_SetInterruptOptions( &NIMs[bTunerIndex], COBRA_NO_INTERRUPTS );
if ( (pending & INTR_ACQ_SYNC) &&
((NewAcqState[0] == ACQ_LOCKED_AND_TRACKING) || (NewAcqState[0] == ACQ_FADE)) )
{
return CSQPSK_SUCCESS;
}
else
{
return CSQPSK_FAILURE;
}
#endif
}
CSQPSK_Error_t CX2414xCSLockNew ( CSHDITunerIndex bTunerIndex, CSQPSKCHANNEL *pCSCHANNEL )
{
CHANOBJ chan;
BOOL APIresult=0;
int LockStatus=0;
int i,j,k;
LOCKIND lockinds;
CSQPSK_Error_t nReturn;
DWORD dwFreqStep;
int nDerotFrequency = 0;
BYTE bUpperFlag = FALSE;
BYTE bDownFlag = FALSE;
DWORD vrates;
LONG nFrequencyOffset;
int nDerotMin, nDerotMax;
ACQSTATE acqstate; /* current acq state (i.e. locked/not locked) */
int specinv=1;
int nLoopCnt = 0;
#ifdef QPSK_DEBUG
CSTRACE( QPSK_DEBUG_LEVEL, "[HDIQPSK] CX2414x start Lock,Fec = %d\n",pCSCHANNEL->m_bFECRates);
#endif
if ( (pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 1000) ||
(pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate > 50000) ||
(pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency < 900000) ||
(pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency > 2250000) )
{
_TUNER_CX24108_set_freq(&NIMs[bTunerIndex],900*1000);
{
#ifdef QPSK_DEBUG
CSTRACE( ERROR_LEVEL, "\n[CSLock]Param Error");
CSTRACE( ERROR_LEVEL, "Position:file = %s,line = %d\n", __FILE__, __LINE__);
#endif
return CSQPSK_FAILURE;
}
}
vFillOutTune(pCSCHANNEL);
chan.frequency= Stuning.nim_satellite_tune.frequency*1000+pCSCHANNEL->m_nFrequencyOffset;
chan.modtype = MOD_QPSK;
switch( pCSCHANNEL->m_bFECRates )
{
case FEC_AUTO:
Stuning.nim_satellite_tune.fec = M_RATE_AUTO;
break;
case FEC1_2:
Stuning.nim_satellite_tune.fec = M_RATE_1_2;
break;
case FEC2_3:
Stuning.nim_satellite_tune.fec = M_RATE_2_3;
break;
case FEC3_4:
Stuning.nim_satellite_tune.fec = M_RATE_3_4;
break;
case FEC5_6:
Stuning.nim_satellite_tune.fec = M_RATE_5_6;
break;
case FEC7_8:
Stuning.nim_satellite_tune.fec = M_RATE_7_8;
break;
case FEC8_9:
Stuning.nim_satellite_tune.fec = M_RATE_AUTO;
break;
default:
Stuning.nim_satellite_tune.fec = M_RATE_AUTO;
break;
}
if(Stuning.nim_satellite_tune.fec != M_RATE_AUTO)
{
/* Manual mode. */
chan.coderate = convert_fec_in( Stuning.nim_satellite_tune.fec );
chan.viterbicoderates = viterbicoderates;
}
else
{
/* Automatic mode, try all code rates. */
chan.coderate = CODERATE_3DIV4;
chan.viterbicoderates = viterbicoderates;
}
chan.symbrate = Stuning.nim_satellite_tune.symbol_rate; //sfg,unit is k
chan.specinv = convert_spectrum_in( Stuning.nim_satellite_tune.spectrum );
chan.samplerate = SAMPLE_FREQ_NOM;
dwFreqStep = pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate * 125;
if ( dwFreqStep > 800000 )
{
dwFreqStep = 800000;
}
#ifdef QPSK_DEBUG
CSTRACE(QPSK_DEBUG_LEVEL,"[CX2414xCSLockNew]dwFreqStep = %d\n",dwFreqStep);
#endif
nDerotMin = -2000000;
nDerotMax = 2000000;
// added by yuxibo to optimize demod lock
RegisterWrite(&NIMs[bTunerIndex], CX24130_CTLAFCGAIN, 0x03);
j = 1;
do
{
nDerotFrequency = (j/2) * dwFreqStep / 2;
if ( j % 2)
{
nDerotFrequency *= (-1);
}
if ( nDerotFrequency > nDerotMax )
{
bUpperFlag = TRUE;
break;
}
if ( nDerotFrequency < nDerotMin )
{
bDownFlag = TRUE;
break;
}
#ifdef QPSK_DEBUG
CSTRACE(QPSK_DEBUG_LEVEL,"[API_SetCentralFreq]nDerotFrequency = %d\n",nDerotFrequency);
#endif
if (API_AcqContinue(&NIMs[bTunerIndex],&acqstate) == False) return(False);
/* (CR 7957) */
NIMs[bTunerIndex].CLKSMDIV_flag = CLKSMOOTHDIV_UPDATE;
NIMs[bTunerIndex].CLKSMDIV_CR = CODERATE_NONE;
/* if locked to a signal, the acq-offset will be valid, otherwise use 0 */
NIMs[bTunerIndex].actual_tuner_offset = 0L; /* (CR 6243) */
NIMs[bTunerIndex].samplerate = chan.samplerate;
if (API_SetSymbolRate(&NIMs[bTunerIndex],chan.symbrate) == False) return(False);
if (API_SetTunerFrequency(&NIMs[bTunerIndex],chan.frequency+nDerotFrequency) == False) return(False);
if (API_AcqBegin(&NIMs[bTunerIndex]) == False) return(False);
if (API_GetFrequencyOffset(&NIMs[bTunerIndex],&nFrequencyOffset) == False) return(False);
if (API_SetSpectralInversion(&NIMs[bTunerIndex],chan.specinv) == False) return(False);
/* set the Viterbi code rate settings */
vrates = (chan.viterbicoderates | chan.coderate);
if (API_AcqSetViterbiCodeRates(&NIMs[bTunerIndex],vrates) == False) return(False); /* new style */
/* (CR7349) 4/23/02 cw */
if (DRIVER_SWAssistAcq_CR1DIV2(&NIMs[bTunerIndex],vrates) == False) return(False);
if (API_SetModulation(&NIMs[bTunerIndex],chan.modtype) == False) return(False);
if (API_SetViterbiRate(&NIMs[bTunerIndex],chan.coderate) == False) return(False);
#ifdef QPSK_DEBUG
CSTRACE(QPSK_DEBUG_LEVEL,"Cx24143Lock: opt_fs_disable = %d\n",NIMs[bTunerIndex].opt_fs_disable);
#endif
/* if external sample freq is selected, do not touch the sample freq register */
if (chan.samplerate != SAMPLE_FREQ_EXT)
{
#ifdef OPTIMAL_FS_CODE /* Fs optimization */
if (NIMs[bTunerIndex].opt_Fs_pllmult != 0 && NIMs[bTunerIndex].opt_fs_disable == False)
{
if (__API_SetSampleFrequency(&NIMs[bTunerIndex],NIMs[bTunerIndex].opt_Fs_chosen) == False) return(False);
}
else
#endif /* #ifdef OPTIMAL_FS_CODE */
if (API_SetSampleFrequency(&NIMs[bTunerIndex],chan.samplerate) == False) return(False);
#ifdef OPTIMAL_FS_CODE /* Fs optimization */
/* set default Fs as one chosen */
/* (CR 7672) line below commented */
/* --> if (API_GetAssociatedSampleFrequency(nim,chanobj->samplerate,&nim->opt_Fs_chosen) == False) return(False); */
}
else
{
/* Fs is externally set, so get current default Fs from by reading the demod */
if (API_GetSampleFrequency(&NIMs[bTunerIndex],&NIMs[bTunerIndex].opt_Fs_chosen) == False) return(False);
#endif /* #ifdef OPTIMAL_FS_CODE */
}
/* cause some serious channel-changing action */
if (API_AcqTrackingSetup(&NIMs[bTunerIndex]) == False) return(False);
/* successful channel change operation, save copy in the nim */
memcpy(&NIMs[bTunerIndex].chanobj,&chan,sizeof(CHANOBJ));
/* perform SW assist as required */
if (DRIVER_SWAssistAcq(&NIMs[bTunerIndex]) == False)
{
DRIVER_SetError(&NIMs[bTunerIndex],API_BAD_SWA);
return(False);
}
/* (CR 6243) */
if(DRIVER_SWAssistTuner(&NIMs[bTunerIndex]) == False)
{
DRIVER_SetError(&NIMs[bTunerIndex],API_BAD_SWA);
return(False);
}
/* (CR6838) clear the esno average buffer */
if (API_GetChannelEsNo(&NIMs[bTunerIndex],ESNOMODE_UNDEF,NULL,NULL) == False) return(False);
/* set the clock smoother freq if required (otherwise, clksmooth freq will be set at API_SetOutputOptions() ) */
if (NIMs[bTunerIndex].mpeg_out.ClkSmoothSel == DDS_LEGACY_SMOOTHING)
{
if (DRIVER_SetSmoothClock(&NIMs[bTunerIndex],NIMs[bTunerIndex].mpeg_out.ClkSmoothSel,True) == False) return(False);
}
#ifdef CAMARIC_FEATURES
else if (NIMs[bTunerIndex].mpeg_out.ClkSmoothSel == PLL_ADVANCED_SMOOTHING)
{
if (DRIVER_SetSmoothClock(&NIMs[bTunerIndex],NIMs[bTunerIndex].mpeg_out.ClkSmoothSel,True) == False) return(False);
}
#endif /* #ifdef CAMARIC_FEATURES */
//API_SetCentralFreq( &NIMs[bTunerIndex], nDerotFrequency );
for (k=0; k<4; k++)
{
nReturn = CSQPSKSleep(bTunerIndex,50);
if (CSQPSK_DROPPED == nReturn)
{
#ifdef QPSK_DEBUG
CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Dropped\n");
#endif
return CSQPSK_DROPPED;
}
API_GetLockIndicators(&NIMs[bTunerIndex],&lockinds);
if ( lockinds.demod )
{
#ifdef QPSK_DEBUG
CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Demod Lock with k=%d\n",k);
#endif
break;
}
else
{
#ifdef QPSK_DEBUG
//CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Demod not Lock with k=%d\n",k);
#endif
}
}
if ( lockinds.demod )
{
#ifdef QPSK_DEBUG
//CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Demod Lock\n");
#endif
for ( i=0; i<5; i++ )
{
if ( lockinds.demod != TRUE )
{
break;
}
if ( lockinds.syncbyte )
{
#ifdef QPSK_DEBUG
CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Full Sync\n");
#endif
/* Get Acq Freq Offset */
API_GetAcquisitionOffset(&NIMs[bTunerIndex],&nFrequencyOffset);
#ifdef QPSK_DEBUG
CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Locked!nFrequencyOffset = %d\n",nFrequencyOffset);
#endif
if ( abs(nFrequencyOffset) > 5000000 )
{
#ifdef QPSK_DEBUG
CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Offset overflow!\n");
#endif
return CSQPSK_FAILURE;
}
else
{
#ifdef QPSK_DEBUG
CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Locked!Freq=%d, nLoopCnt=%d\n",chan.frequency,nLoopCnt);
#endif
pCSCHANNEL->m_nFrequencyOffset += nFrequencyOffset;
return CSQPSK_SUCCESS;
}
}
nReturn = CSQPSKSleep(bTunerIndex,300);
if (CSQPSK_DROPPED == nReturn)
{
#ifdef QPSK_DEBUG
CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Dropped\n");
#endif
return CSQPSK_DROPPED;
}
API_GetLockIndicators(&NIMs[bTunerIndex],&lockinds);
#ifdef QPSK_DEBUG
CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Demod Lock i=%d, IQ=%d\n",i,specinv);
#endif
}
}
else
{
CSTRACE(QPSK_DEBUG_LEVEL,"[CX24143Lock]Demod not lock!!!\n");
}
j++;
}while( !( bUpperFlag && bDownFlag ) );
//#ifdef QPSK_DEBUG
CSTRACE(QPSK_DEBUG_LEVEL,"[HDIQPSK] CX2414x not locked!!!%d\n",chan.frequency);
//#endif
return CSQPSK_FAILURE;
}
CSQPSK_Error_t CX2414xGetBER(CSHDITunerIndex bTunerIndex, DWORD *pdwBer)
{
int i;
CMPLXNO berest;
MSTATUS status;
for (i=0;i<CNT_TIMES;i++)
{
if ( API_GetBER(&NIMs[bTunerIndex],BER_WINDOW_SIZE,&berest,&status) )
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -