stv0288drv.c
来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 2,124 行 · 第 1/5 页
C
2,124 行
if (CSQPSK_DROPPED == CSQPSKSleep(bTunerIndex, 15))
{
return CSQPSK_DROPPED;
}
error |= STV0288Get_SymbolRate( bTunerIndex, dwSymbolRate_k); /* Get result of coarse algorithm */
/* Read derotator offset */
error |= STV0288GetDerotFreq ( bTunerIndex, Offset_Khz);
bValue[0] &= 0x3e;
error |= STV0288WrtReg ( bTunerIndex, R288_ASCTRL, bValue, 1 ); /* stop coarse algorithm */
//return symbolrate_Bds;
return error;
}
CSQPSK_Error_t STV0288_Fine_Scan(CSHDITunerIndex bTunerIndex,CSQPSKCHANNEL *pCSCHANNEL, int scan_mode)
{
DWORD dwSymRate_k, fmin = 0, fmax = 0;
BYTE bValue[10];
CSQPSK_Error_t error=CSQPSK_SUCCESS;
int i=0;
/* fine initialisation */
CSASSERT (0 != g_dwMaster_Clock_Khz );
dwSymRate_k =pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate;
#if 0
if(scan_mode)
{
fmin = ( (dwSymRate_k*((70*32768)/100)) / g_dwMaster_Clock_Khz ); /* 2^15=32768*/
fmax = ( (dwSymRate_k*((155*32768)/100)) / g_dwMaster_Clock_Khz );
error |= STV0288SetSymbolRate ( bTunerIndex, (dwSymRate_k*14/10) );
}
else
{
if(dwSymRate_k<=6000)
{
fmin = ( ((dwSymRate_k*70/100)*32768) / g_dwMaster_Clock_Khz ); /* 2^15=32768*/
fmax = ( ((dwSymRate_k*150/100)*32768) / g_dwMaster_Clock_Khz );
error |= STV0288SetSymbolRate ( bTunerIndex, (dwSymRate_k*14/10) );
}
else
{
fmin = ( ((dwSymRate_k*95/100)*32768) / g_dwMaster_Clock_Khz ); /* 2^15=32768*/
fmax = ( ((dwSymRate_k*105/100)*32768) / g_dwMaster_Clock_Khz );
error |= STV0288SetSymbolRate ( bTunerIndex, (dwSymRate_k) );
}
}
#else
fmin = ( (dwSymRate_k*((90*32768)/100)) / g_dwMaster_Clock_Khz ); /* 2^15=32768*/
fmax = ( (dwSymRate_k*((110*32768)/100)) / g_dwMaster_Clock_Khz );
error |= STV0288SetSymbolRate ( bTunerIndex, (dwSymRate_k*11/10) );
#endif
// for auto scan //error |= STV0288SetSymbolRate ( bTunerIndex, (dwSymRate_k*12/10) );
//bValue[0] = ( BYTE_MSB( fmin )&(~F288_STOPON_FMIN) );
bValue[0] = ( BYTE_MSB( fmin )|F288_STOPON_FMIN );
bValue[1] = BYTE_LSB( fmin );
bValue[2] = BYTE_MSB( fmax );
bValue[3] = BYTE_LSB( fmax );
bValue[4] = MAX( dwSymRate_k/500,1 );
error |= STV0288WrtReg( bTunerIndex, R288_FMINM, bValue, 5 );
/* start fine algorithm */
STV0288Get_RegMap_Val( R288_ASCTRL, bValue, 1 );
//CSTRACE(ERROR_LEVEL,"R288_ASCTRL map value=%x\n",bValue[0]);
//error |= STV0288RdReg( bTunerIndex, R288_ASCTRL, bValue, 1 );
//CSTRACE(ERROR_LEVEL,"R288_ASCTRL value=%x\n",bValue[0]);
bValue[0] = bValue[0] | F288_FINE ;
error |= STV0288WrtReg( bTunerIndex, R288_ASCTRL, bValue, 1 ); /* start fine algorithm */
// Waring !!!!!, it will lock carrier frequenc fail if time is short ,
i=0;
while(i++<50){
#if 1
error |= STV0288RdReg( bTunerIndex, R288_ASCTRL, &bValue[1], 1 );
if(bValue[1] &F288_FINE==0)
break;
#else // error
if(bSTV0288CheckTimeLock( bTunerIndex))
break;
#endif
CSSleep(10);
CSASSERT (error == CSQPSK_SUCCESS );
if( error != CSQPSK_SUCCESS )
{
return error;
}
}
STV0288Get_RegMap_Val( R288_ASCTRL, bValue, 1 );
//CSTRACE(ERROR_LEVEL,"R288_ASCTRL value=%x\n",bValue[0]);
bValue[0] = bValue[0] & (~F288_FINE) ;
error |= STV0288WrtReg( bTunerIndex, R288_ASCTRL, bValue, 1 );/* stop fine algorithm */
return error;
}
CSQPSK_Error_t STV0288Set_CFD(CSHDITunerIndex bTunerIndex, int cfdOn)
{
BYTE bValue[2];
STV0288Get_RegMap_Val(R288_CFD, bValue, 1);
if ( 1== cfdOn )
bValue[0] = 0xc5;//|=F288_CFD_ON;/*carrier frequency offset detector enable*/
else
bValue[0] = 0x45;//&=(~F288_CFD_ON);
return STV0288WrtReg ( bTunerIndex, R288_CFD, bValue,1);/*Carrier lock control register*/
}
CSQPSK_Error_t STV0288Set_RTC(CSHDITunerIndex bTunerIndex, BYTE bRtc)
{
BYTE bValue[2];
bValue[0]=bRtc;
return STV0288WrtReg ( bTunerIndex, R288_RTC, bValue,1 );/*Timing recovery control register[7:4] ALPHA_TMG[3:0] BETA_TMG*/
}
CSQPSK_Error_t STV0288Set_Autocenter(CSHDITunerIndex bTunerIndex, int center_on)
{
BYTE bValue[2];
STV0288Get_RegMap_Val(R288_ASCTRL, bValue, 1);
if(1 == center_on)
bValue[0] |= F288_AUTOCENTER;/*control, when high, reduce residual offse of Fs..*/
else
bValue[0] &= (~F288_AUTOCENTER);
return STV0288WrtReg ( bTunerIndex, R288_ASCTRL, bValue,1);
}
CSQPSK_Error_t STV0288Set_Froze_Lock(CSHDITunerIndex bTunerIndex, int lock)
{
BYTE bValue[2];
STV0288Get_RegMap_Val(R288_ASCTRL, bValue, 1);
if (1 == lock )
bValue[0] |= F288_FROZE_LOCK;/*FROZE_LOCK: control, when high, froze accu1 and accu2 (see ACCU1VAL and ACCU2VAL registers)*/
else
bValue[0] &= (~F288_FROZE_LOCK);
return STV0288WrtReg ( bTunerIndex, R288_ASCTRL, bValue,1);
}
/*设置TUNER LPF CUT-OFF frequency*/
CSQPSK_Error_t STV0288SetTunerBWD ( CSHDITunerIndex bTunerIndex, DWORD dwBWd )
{
BYTE bValue[5],bF,bFcl;
int error;
BYTE ucDLB = 0;
//DWORD dwBandWidth;
#if 0 // SR 2 BW
dwBWd =dwBWd *128 /100;
#endif
if(dwBWd != 0)
{
if((dwBWd/2) > 26000)
bF = 31;
else
bF = (dwBWd/2)/1000 + 5;
bFcl=0;
bValue[0]= 0x80|bF;
bValue[1]= 0xc0|bFcl|(ucDLB<<3);;
error = STB6000WrtReg( bTunerIndex,0x07,&bValue[1],1);
error = STB6000WrtReg( bTunerIndex,0x06,bValue,1);
CSSleep(15);
bFcl=7;
bValue[1]= 0xc0|bFcl|(ucDLB<<3);
error |= STB6000WrtReg( bTunerIndex,0x07,&bValue[1],1);
}
else
{
bF = 0x0f;
bFcl =0;
bValue[0]= 0xd8 |bFcl;
error = STB6000WrtReg( bTunerIndex,0x07,bValue,1);
}
return error;
}
CSQPSK_Error_t STV0288SetCarrierRecoveryCtl_ABCLC ( CSHDITunerIndex bTunerIndex, BYTE bAclc,BYTE bBclc)
{
CSQPSK_Error_t error=CSQPSK_SUCCESS;
BYTE bValue[2];
//STV0288Get_RegMap_Val(R288_ACLC, bValue, 2);
error |= STV0288RdReg ( bTunerIndex, R288_ACLC, bValue,2 );
bValue[0] &= (~F288_ALPHS_MASK);;
bValue[0] |= bAclc&F288_ALPHS_MASK;/*carrier recovery b coefficient [3:0] for alpha = (2 +a) x 2^b x 2^14*/
bValue[1] &= (~F288_BETA_MASK);
bValue[1] |= bBclc&F288_BETA_MASK;/*carrier recovery*/
error |= STV0288WrtReg ( bTunerIndex, R288_ACLC, bValue,2 );
return error;
}
CSQPSK_Error_t STV0288ChannelLockOld ( 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;
int coarseOffset_Khz;
//sfg int DerotFreq;
// sfg int DerotStep;
if(pCSCHANNEL==NULL)
{
CSTRACE( ERROR_LEVEL, "[HDIQPSK] Err CSLock channel is NULL\n");
CSTRACE( ERROR_LEVEL, "Position:file = %s,line = %d\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 = %d\n", __FILE__, __LINE__);
return CSQPSK_FAILURE;
}
}
dwCHFreq_Khz = (DWORD)pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency ;
dwSymbolRate_k = pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate;
scan_mode = (dwSymbolRate_k!=0);// =1
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);/*get the Tuner Frequency offset*/
s_cfrm_value=(signed short)(nTuner_freq_offset/(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);
kt = 42;
do
{
/* 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 );/*freq offset*/
//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);/*timing recover*/
error |= STV0288SetCarrierRecoveryCtl_ABCLC(bTunerIndex,7,28);
error |= STV0288Set_CFD(bTunerIndex, 1 );/*open offset detector*/
bValue[0] = (BYTE)kt&0x7f;
//bValue[1] = 0x12; // ks=2,kc=2
error |= STV0288WrtReg (bTunerIndex, R288_COARP1, bValue,1);/*coarse scan parameter*/
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 (scan_mode)
{
#if 0 /*normal search*/
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 );
error |= STV0288_Coarse_Scan( bTunerIndex,&coarseOffset_Khz,&dwSymbolRate_coarse_k);//add by th
}
else /*blind scan */
{
error |= STV0288SetSymbolRate ( bTunerIndex, 1001 );
error |= STV0288_Coarse_Scan( bTunerIndex,&coarseOffset_Khz,&dwSymbolRate_coarse_k);/*same freq ,same phase*/
//dwSymbolRate_k= dwSymbolRate_coarse_k;
}
error |=STV0288SetTunerBWD(bTunerIndex,dwSymbolRate_k*3);
error |= STV0288Set_Froze_Lock( bTunerIndex, 0);
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);//36,24
}
if ( error != CSQPSK_SUCCESS )
{
CSASSERT(error == CSQPSK_SUCCESS);
return error;
}
error |= STV0288_Fine_Scan( bTunerIndex, pCSCHANNEL,scan_mode );/*symbol rate fine scan*/
error |= STV0288Set_CFD(bTunerIndex, 0 );
//CSSleep(100);
if (bSTV0288CheckCarrierLock(bTunerIndex) && bSTV0288CheckTimeLock(bTunerIndex))
{
error |= STV0288Set_Autocenter( bTunerIndex, 1 );
error |= STV0288RdReg( bTunerIndex, R288_VITPROG, bValue, 1);
bValue[0] |=0x10; // enable swap for auto search
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;
// CSSleep(10);
//error |= STV0288GetLockStatus (bTunerIndex , &nLockState );
// STV0288SwapIQ(bTunerIndex);
// CSTRACE(ERROR_LEVEL, "[hdi] kt =%d\n",kt);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?