stv0288drv.c
来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 2,124 行 · 第 1/5 页
C
2,124 行
}while(/*(nfull_lock != 1) && (kt>=36)*/0);
//CSTRACE( INFO_LEVEL, "\n [qpsk][STV0288ChannelLock] return error=%d\n",error);
//if ( nfull_lock )
//vDebug_Regisger_Value( bTunerIndex);
if ( nfull_lock )
return CSQPSK_SUCCESS;
else
return CSQPSK_FAILURE;
}
CSQPSK_Error_t STV0288ChannelLockNewWithCoarse ( CSHDITunerIndex bTunerIndex, CSQPSKCHANNEL *pCSCHANNEL )
{
int nFreq, nOffset;
DWORD dwSearchTime;
DWORD dwCHFreq_Khz, dwFreqStep;
int nLockState = ALLLOST ;
long nFrequency;
// sfg int nSwaped;
//int nReturn;
DWORD dwMasterFreq = 0;
int nFrequencyOffset = 0;
int jj;
int nDerotFrequency;
int nSetFreqTimes = 10;
int nTimingLockFlag = FALSE;
//int nDerotMax = 0;
//int nDerotMin = 0;
//int nFirstDerotFrequency = 0;
//BYTE bUpperFlag = FALSE;
//BYTE bDownFlag = FALSE;
int nPll_lock=0;
int nfull_lock=0;
DWORD tunfreq_Khz=0;
int nTuner_freq_offset;
signed short s_cfrm_value;
int kt,scan_mode;
BYTE bValue[20];
CSQPSK_Error_t error=CSQPSK_SUCCESS;
int timeout,timing;
long tdata;
DWORD dwSymbolRate_k,dwSymbolRate_coarse_k,dwResult_sr,dwSymTmp;
int coarseOffset_Khz;
int nFuhao, i;
//sfg int DerotFreq;
// sfg int DerotStep;
nFuhao = 1;
if(pCSCHANNEL==NULL)
{
CSTRACE( ERROR_LEVEL, "[HDIQPSK] Err CSLock channel is NULL\n");
CSTRACE( ERROR_LEVEL, "Position:file = %s,line = %s\n", __FILE__, __LINE__);
return CSQPSK_FAILURE;
}
CSTRACE( INFO_LEVEL, "\nSTV0288ChannelLock Freq:%d, SymbolRate: %d, Offset: %d, IQ:%d", pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency,
pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate,
pCSCHANNEL->m_nFrequencyOffset, pCSCHANNEL->m_bIQ);
nOffset = pCSCHANNEL->m_nFrequencyOffset;
if( ABS(nOffset) > 5000 )
{
nOffset = 0;
}
if ( (pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 1000) ||
(pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate > 60000) ||
(pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency < 900000) ||
(pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency > 2250000) )
{
FTDSetFrequency( bTunerIndex, 950000, 27500, (DWORD *)&nFrequency );
{
CSTRACE( ERROR_LEVEL, "\n[CSLock]Param Error");
CSTRACE( ERROR_LEVEL, "Position:file = %s,line = %s\n", __FILE__, __LINE__);
return CSQPSK_FAILURE;
}
}
dwCHFreq_Khz = (DWORD)pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency ;
dwSymbolRate_k = pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate;
dwSymTmp = pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate;
scan_mode = (dwSymbolRate_k!=0);
//scan_mode = 0;
if ( dwFreqStep == 0 )
{
dwFreqStep = 500;
}
error = CSQPSK_SUCCESS;
error |= FTDSetFrequency ( bTunerIndex, dwCHFreq_Khz , dwSymbolRate_k, (DWORD *)&nFrequency );
do
{
error |= FTDGetTunerStatus ( bTunerIndex, &nPll_lock ) ;
if ( error != CSQPSK_SUCCESS )
{
CSASSERT(error == CSQPSK_SUCCESS);
return error;
}
}
while ( nSetFreqTimes-- > 0 && (TRUE!=nPll_lock)) ;
if(TRUE != nPll_lock)
CSTRACE(ERROR_LEVEL,"[qpsk] stb6000 is unlock \n");
error |= STB6000GetFreq( bTunerIndex, &tunfreq_Khz );
nTuner_freq_offset = (int)(dwCHFreq_Khz - tunfreq_Khz);
s_cfrm_value=(signed short)(nTuner_freq_offset/(g_dwMaster_Clock_Khz*1000/65536));
//s_cfrm_value=(signed short)(dwCHFreq_Khz/(g_dwMaster_Clock_Khz*1000/65536));
CSTRACE(ERROR_LEVEL,"*****TP freq =%d, Tuner freq =%d,s_cfrm_value = %d , \n",dwCHFreq_Khz, tunfreq_Khz,s_cfrm_value);
/* liuyegang */
#if 0
kt = 42;
#else
kt = 60;
#endif
#if 0
do
{
dwSymbolRate_k = dwSymTmp;
CSTRACE(INFO_LEVEL, "############### kt = %d\r\n", kt);
/* reset derotator frequency */
bValue[0]=(BYTE)(s_cfrm_value>>8)&0xff;
bValue[1]=(BYTE)(s_cfrm_value)&0xff;
error |= STV0288WrtReg ( bTunerIndex, R288_CFRM, bValue, 2 );
//error |=STV0288SetTunerBWD(bTunerIndex,50000);
/* Setup of non-modified parameters */
/* ALPHA and BETA are in the same register ==> this I2C access update both */
error |= STV0288Set_RTC( bTunerIndex, 0x7a);
error |= STV0288SetCarrierRecoveryCtl_ABCLC(bTunerIndex,7,28);
error |= STV0288Set_CFD(bTunerIndex, 1 );
bValue[0] = (BYTE)kt&0x7f;
//bValue[1] = 0x12; // ks=2,kc=2
error |= STV0288WrtReg ( bTunerIndex, R288_COARP1, bValue,1);
bValue[0] = F288_IND1_ACC;
bValue[1] = F288_IND2_ACC;
error |= STV0288WrtReg ( bTunerIndex, R288_ACCU1VAL, bValue,2);
error |= STV0288Set_Froze_Lock( bTunerIndex, 1);
//error |= STV0288SetSymbolRate ( bTunerIndex, 1001 );
//error |= STV0288_Coarse_Scan( bTunerIndex,&coarseOffset_Khz,&dwSymbolRate_coarse_k);
if (0)//scan_mode)
{
#if 0
STV0288Get_RegMap_Val(R288_COARP2,bValue,1);
bValue[0] &=0xf8; // KS=0; //0--> froze symbol rate
error |= STV0288WrtReg ( bTunerIndex, R288_COARP2, bValue,1);
#endif
error |= STV0288SetSymbolRate ( bTunerIndex, dwSymbolRate_k );
}
else
{
error |= STV0288SetSymbolRate ( bTunerIndex, dwSymbolRate_k );
error |= STV0288_Coarse_Scan( bTunerIndex,&coarseOffset_Khz,&dwSymbolRate_coarse_k);
dwSymbolRate_k= dwSymbolRate_coarse_k;
}
error |=STV0288SetTunerBWD(bTunerIndex,dwSymbolRate_k*3);
error |= STV0288Set_Froze_Lock( bTunerIndex, 0);
CSTRACE(ERROR_LEVEL,"***** coarseOffset_Khz freq = %d, dwSymbolRate_k = %d, scan_mode = %d\r\n",coarseOffset_Khz, dwSymbolRate_k, scan_mode);
if((dwSymbolRate_k > 1000) /* Check symbolrate value */
//&& (ABS(coarseOffset_Khz)>=250) /* Check minimum derotator offset criteria */
//&& (coarseOffset_Khz<25000) //10000/2 /* Check maximum derotator offset criteria */
&& (g_dwMaster_Clock_Khz/dwSymbolRate_k)>2
) /* Check shannon criteria */
{
/* Adjust carrier loop setting */
if(dwSymbolRate_k< 5000)
{
error |= STV0288SetCarrierRecoveryCtl_ABCLC(bTunerIndex,8,17);
}
else if(dwSymbolRate_k > 35000)
{
error |= STV0288SetCarrierRecoveryCtl_ABCLC(bTunerIndex,8,36);
}
if ( error != CSQPSK_SUCCESS )
{
CSASSERT(error == CSQPSK_SUCCESS);
CSTRACE(INFO_LEVEL, "#################################### 1\r\n");
return error;
}
pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate = dwSymbolRate_k;
error |= STV0288_Fine_Scan( bTunerIndex, pCSCHANNEL,scan_mode );
error |= STV0288Set_CFD(bTunerIndex, 0 );
//CSSleep(100);
CSTRACE(INFO_LEVEL, "####################################\r\n");
if (bSTV0288CheckCarrierLock(bTunerIndex) && bSTV0288CheckTimeLock(bTunerIndex))
{
error |= STV0288Set_Autocenter( bTunerIndex, 1 );
error |= STV0288RdReg( bTunerIndex, R288_VITPROG, bValue, 1);
bValue[0] |=0x10; // enable swap
error |= STV0288WrtReg( bTunerIndex, R288_VITPROG, bValue, 1);
timeout=0;
do
{
#if 0
CSSleep(5);
#else
error |= CSQPSKSleep(bTunerIndex,5);
if ( CSQPSK_DROPPED == error )
{
CSTRACE( INFO_LEVEL, "\n QUICKEXIT Carrier ");
return CSQPSK_DROPPED;
}
#endif
timeout++;
error |= STV0288RdReg( bTunerIndex, R288_RTFM, bValue, 2);
timing = MAKEWORD( bValue[1] , bValue[0] );
// CSTRACE( INFO_LEVEL, "\nOffset timing=%d \n ",timing);
}while((ABS(timing)>200) && (timeout<100));
error |= STV0288Set_Autocenter( bTunerIndex, 0 );
/* Restore timing loop parameters */
error |= STV0288Set_RTC( bTunerIndex, 0x44);/* ALPHA and BETA are in the same register ==> this I2C access update both */
error |= STV0288Get_SymbolRate(bTunerIndex, &dwResult_sr );
if ( error != CSQPSK_SUCCESS )
{
CSASSERT(error == CSQPSK_SUCCESS);
return error;
}
tdata = 2*STV0288_CalcDataTimeConstant(bTunerIndex, dwResult_sr);
CSASSERT( 0 != tdata ) ;
timeout=0;
//CSTRACE(ERROR_LEVEL, "[hdi] calc data =%d\n",tdata);
if(tdata>200) tdata =200; //reduce time unlock ---> lock
do{
nfull_lock = bSTV0288CheckTPLock(bTunerIndex);
CSTRACE(ERROR_LEVEL, "[hdi] nfull_lock =%d\n",nfull_lock);
if ( nfull_lock )
//return CSQPSK_SUCCESS;
break;
error |= CSQPSKSleep(bTunerIndex,10);
if ( CSQPSK_DROPPED == error )
{
CSTRACE( INFO_LEVEL, "\n QUICKEXIT Tp Lock ");
return CSQPSK_DROPPED;
}
}while(timeout++<tdata);
}
else
{
CSTRACE( INFO_LEVEL, "\n[qpsk] carrier lock and timing lock fail \n ");
/* Restore timing loop parameters */
error |= STV0288Set_RTC( bTunerIndex, 0x44);/* ALPHA and BETA are in the same register ==> this I2C access update both */
}
}
if ( error != CSQPSK_SUCCESS )
{
CSASSERT(error == CSQPSK_SUCCESS);
return error;
}
kt -=6;
//kt/=2;
// CSSleep(10);
//error |= STV0288GetLockStatus (bTunerIndex , &nLockState );
// STV0288SwapIQ(bTunerIndex);
// CSTRACE(ERROR_LEVEL, "[hdi] kt =%d\n",kt);
}while((nfull_lock != 1) && (kt>=36));
#else
while(0)
{
STV0288SetSymbolRate(0, 4420);
STV0288Get_SymbolRate(0, &dwSymTmp);
CSSleep(500);
}
for (kt=60;kt>6; kt-=6)
{
dwSymbolRate_k = dwSymTmp;//+i*50*(nFuhao);
if (dwSymbolRate_k == 4420)
{
//dwSymbolRate_k = 4344;
}
CSTRACE(INFO_LEVEL, "####dwSymTmp = %d, dwSymbolRate_k = %d, freq = %d\r\n", dwSymTmp, dwSymbolRate_k, dwCHFreq_Khz);
CSTRACE(INFO_LEVEL, "############### kt = %d\r\n", kt);
/* reset derotator frequency */
bValue[0]=(BYTE)(s_cfrm_value>>8)&0xff;
bValue[1]=(BYTE)(s_cfrm_value)&0xff;
error |= STV0288WrtReg ( bTunerIndex, R288_CFRM, bValue, 2 );
//error |=STV0288SetTunerBWD(bTunerIndex,50000);
/* Setup of non-modified parameters */
/* ALPHA and BETA are in the same register ==> this I2C access update both */
error |= STV0288Set_RTC( bTunerIndex, 0x7a);
error |= STV0288SetCarrierRecoveryCtl_ABCLC(bTunerIndex,7,28);
error |= STV0288Set_CFD(bTunerIndex, 1 );
//kt = 60;
bValue[0] = (BYTE)kt&0x7f;
//bValue[1] = 0x12; // ks=2,kc=2
error |= STV0288WrtReg ( bTunerIndex, R288_COARP1, bValue,1);
bValue[0] = F288_IND1_ACC;
bValue[1] = F288_IND2_ACC;
error |= STV0288WrtReg ( bTunerIndex, R288_ACCU1VAL, bValue,2);
error |= STV0288Set_Froze_Lock( bTunerIndex, 1);
//error |= STV0288SetSymbolRate ( bTunerIndex, 1001 );
//error |= STV0288_Coarse_Scan( bTunerIndex,&coarseOffset_Khz,&dwSymbolRate_coarse_k);
if (0)//scan_mode)
{
#if 0
STV0288Get_RegMap_Val(R288_COARP2,bValue,1);
bValue[0] &=0xf8; // KS=0; //0--> froze symbol rate
error |= STV0288WrtReg ( bTunerIndex, R288_COARP2, bValue,1);
#endif
error |= STV0288SetSymbolRate ( bTunerIndex, dwSymbolRate_k );
}
else
{
int nStartSym;
if ((dwSymbolRate_k - 1000)>1011)
{
nStartSym = (dwSymbolRate_k - 1000);
}
else
{
nStartSym = 1011;
}
error |= STV0288SetSymbolRate ( bTunerIndex, nStartSym);
error |= STV0288_Coarse_Scan( bTunerIndex,&coarseOffset_Khz,&dwSymbolRate_coarse_k);
//dwSymbolRate_k= dwSymbolRate_coarse_k;
}
error |=STV0288SetTunerBWD(bTunerIndex,dwSymbolRate_k*3);
error |= STV0288Set_Froze_Lock( bTunerIndex, 0);
CSTRACE(ERROR_LEVEL,"***** coarseOffset_Khz freq = %d, dwSymbolRate_k = %d, scan_mode = %d\r\n",coarseOffset_Khz, dwSymbolRate_k, scan_mode);
if((dwSymbolRate_k > 1000) /* Check symbolrate value */
//&& (ABS(coarseOffset_Khz)>=250) /* Check minimum derotator offset criteria */
//&& (coarseOffset_Khz<25000) //10000/2 /* Check maximum derotator offset criteria */
//&& (g_dwMaster_Clock_Khz/dwSymbolRate_k)>2
) /* Check shannon criteria */
{
/* Adjust carrier loop setting */
if(dwSymbolRate_k< 5000)
{
error |= STV0288SetCarrierRecoveryCtl_ABCLC(bTunerIndex,8,17);
}
else if(dwSymbolRate_k > 30000)
{
//error |= STV0288SetCarrierRecoveryCtl_ABCLC(bTunerIndex,8,36);
}
if ( error != CSQPSK_SUCCESS )
{
CSASSERT(error == CSQPSK_SUCCESS);
CSTRACE(INFO_LEVEL, "#################################### 1\r\n");
return error;
}
pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate = dwSymbolRate_k;
error |= STV0288_Fine_Scan( bTunerIndex, pCSCHANNEL,scan_mode );
error |= STV0288Set_CFD(bTunerIndex, 0 );
//CSSleep(100);
CSTRACE(INFO_LEVEL, "####################################\r\n");
if (bSTV0288CheckCarrierLock(bTunerIndex) && bSTV0288CheckTimeLock(bTunerIndex))
{
error |= STV0288Set_Autocenter( bTunerIndex, 1 );
error |= STV0288RdReg( bTunerIndex, R288_VITPROG, bValue, 1);
bValue[0] |=0x10; // enable swap
error |= STV0288WrtReg( bTunerIndex, R288_VITPROG, bValue, 1);
timeout=0;
do
{
#if 0
CSSleep(5);
#else
error |= CSQPSKSleep(bTunerIndex,5);
if ( CSQPSK_DROPPED == error )
{
CSTRACE( INFO_LEVEL, "\n QUICKEXIT Carrier ");
return CSQPSK_DROPPED;
}
#endif
timeout++;
error |= STV0288RdReg( bTunerIndex, R288_RTFM, bValue, 2);
timing = MAKEWORD( bValue[1] , bValue[0] );
// CSTRACE( INFO_LEVEL, "\nOffset timing=%d \n ",timing);
}while((ABS(timing)>200) && (timeout<100));
error |= STV0288Set_Autocenter( bTunerIndex, 0 );
/* Restore timing loop parameters */
error |= STV0288Set_RTC( bTunerIndex, 0x44);/* ALPHA and BETA are in the same register ==> this I2C access update both */
error |= STV0288Get_SymbolRate(bTunerIndex, &dwResult_sr );
CSTRACE(INFO_LEVEL, "@@@@@@@@@@@dwResult_sr = %d\r\n", dwResult_sr);
if ( error != CSQPSK_SUCCESS )
{
CSASSERT(error == CSQPSK_SUCCESS);
return error;
}
tdata = 2*STV0
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?