📄 stv0299drv.c
字号:
InnerCode = 2000 ;
break ;
case 1 :/*inner code = 2/3*/
InnerCode = 1500 ;
break ;
case 2 :/*inner code = 3/4*/
InnerCode = 1333 ;
break ;
case 3 :/*inner code = 5/6*/
InnerCode = 1200 ;
break ;
case 4 :/*inner code = 7/8*/
InnerCode = 1143 ;
break ;
}//switch(i)
Tviterbi += (int)((PhaseNumber[i]*averaging[sn]*InnerCode)/(BAUD*1000)) ;
if(HigherRate < InnerCode)
HigherRate = InnerCode ;
}//if er
}//for i=0乣4
/*time out calculation(TimeOut)*/
/*This value indicates the maximum duration of synchro word research .*/
TimeOut = (int)((HigherRate*16386L*(to + 1))/(2*BAUD*1000)) ;
/*Hysteresis duration*/
THysteresis = (int)((HigherRate*26112L*(hy + 1))/(2*BAUD*1000)) ;/*26112 = 16*204*8 bits */
/*a guard time of 1 ms is added*/
return( 1 + Tviterbi + TimeOut + THysteresis ) ;
}
long CalcTimingTimeConstant(long BAUD)
{
long TConstant ;
if (BAUD == 0)
return 20;
TConstant = 400000/BAUD ;//msec 000125:modified
return( TConstant ) ;
}
long CalcDerotTimeConstant(long BAUD)
{
long TConstant ;
if (BAUD == 0)
return 10;
TConstant = 200000/BAUD ;//msec
if(TConstant<10)
TConstant=10;
return( TConstant ) ;
}
CSQPSK_Error_t STV0299SetStandby( CSHDITunerIndex bTunerIndex, int nStandby )
{
BYTE bValue;
STV0299RdReg( bTunerIndex,0x02, &bValue, 1);
bValue &= 0x7f;
bValue |= ( ( nStandby << 7 ) & 0x80 );
return STV0299WrtReg( bTunerIndex,0x02, &bValue, 1);
}
CSQPSK_Error_t STV0299SetClockPolarity( CSHDITunerIndex bTunerIndex, T_ClockPolarity clockPol )
{
BYTE bValue;
if ( clockPol == LOW_TO_HIGH )
{
bValue = 0xfc;
}
else
{
bValue = 0xfe;
}
return STV0299WrtReg ( bTunerIndex, 0x33, &bValue, 1);
}
CSQPSK_Error_t STV0299SetFECRates(CSHDITunerIndex bTunerIndex, BYTE FECRates)
{
BYTE Data = 0;
BYTE bValue;
BYTE Data1;
//sttbx_Print("\n[STV0299SetFECRates]FEC = %d\n",FECRates);
/*
** uData1 - FEC Mode Register
** 0 - DVB QPSK, 1 - DVB BPSK, 4 = DSS
*/
STV0299RdReg(bTunerIndex, STV0299REG_FECM, &bValue, 1);
Data1 = (bValue>>4)&0x0f;
/*
** For each STTUNER FEC rates (see sttuner.h)
** Set specific bit of enable puncture rate register
** Bit 0 - 1/2, 1 - 2/3, 2 - 3/4, 3 - 5/6, 4 - 7/8(DVB) or 6/7(DSS)
*/
if (FECRates==FEC1_2) // 1/2
Data |= STV0299_VENRATE_E0_MSK;
if (FECRates==FEC2_3) // 2/3
Data |= STV0299_VENRATE_E1_MSK;
if (FECRates==FEC3_4) // 3/4
Data |= STV0299_VENRATE_E2_MSK;
if (FECRates==FEC5_6) // 5/6
Data |= STV0299_VENRATE_E3_MSK;
if (((FECRates==FEC7_8) && (Data1 == 4)) ||
((FECRates==FEC7_8) && (Data1 != 4))) // 7/8(DVB) or 6/7(DSS)
{
Data |= STV0299_VENRATE_E4_MSK;
}
/* return if no FECs match */
if ( Data == 0 )
{
Data = 0x1f;
}
//sttbx_Print("[STV0299SetFECRates]Data = 0x%x\n",Data);
return STV0299WrtReg(bTunerIndex, STV0299REG_PR, &Data, 1);
}
CSQPSK_Error_t CSLock ( CSHDITunerIndex bTunerIndex, CSQPSKCHANNEL *pCSCHANNEL )
{
int nFreq, nOffset;
DWORD dwSearchTime;
DWORD dwCHFreq, dwFreqStep;
int nLockState;
long nFrequency;
int nReturn;
int nFrequencyOffset = 0;
int jj;
int nDerotFrequency;
int nSetFreqTimes = 3;
int nTimingLockFlag = FALSE;
int nDerotMax = 0;
int nDerotMin = 0;
int nFirstDerotFrequency = 0;
BYTE bUpperFlag = FALSE;
BYTE bDownFlag = FALSE;
int nLoopCnt = 0;
extern int g_nLoopCnt[];
extern int g_nSRThreshInKsps[];
if(pCSCHANNEL==NULL)
{
#ifdef QPSK_DEBUG
CSTRACE( ERROR_LEVEL, "[HDIQPSK] Err CSLock channel is NULL\n");
CSTRACE( ERROR_LEVEL, "Position:file = %s,line = %d\n", __FILE__, __LINE__);
#endif
return CSQPSK_FAILURE;
}
#ifdef QPSK_DEBUG
/*
CSTRACE( INFO_LEVEL, "\nCSLock 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);
*/
#endif
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 > 50000) ||
(pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency < 900000) ||
(pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency > 2250000) )
{
FTDSetFrequency( bTunerIndex, 950000, 27500, (DWORD *)&nFrequency );
{
#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;
}
}
LOOP:
dwCHFreq = (DWORD)pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency ;
if ( dwFreqStep == 0 )
{
dwFreqStep = 500;
}
nFreq = ( int )dwCHFreq + nOffset;
nSetFreqTimes = 3;
nReturn = CSQPSK_FAILURE;
//[Jul 20 2005]Modify by Jacky
FTDSetSymbolRate(bTunerIndex, pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate) ;
STV0299SetFECRates(bTunerIndex, pCSCHANNEL->m_bFECRates);
FTDRegOptimize(bTunerIndex, pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate) ;
while ( (nSetFreqTimes-- > 0) && (nReturn != CSQPSK_SUCCESS) )
{
nReturn = FTDSetFrequency ( bTunerIndex, nFreq, pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate, (DWORD *)&nFrequency );
}
STV0299SetIQ(bTunerIndex, pCSCHANNEL->m_bIQ);
dwFreqStep = pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate / 4;
if ( dwFreqStep > 1000 )
{
dwFreqStep = 1000;
}
nTimingLockFlag = FALSE;
for ( jj=0; jj<=((TUNEROFFSETLIMIT / dwFreqStep)*2 + 1); jj++ )
{
nDerotFrequency = jj * dwFreqStep / 2;
if ( jj % 2 )
{
nDerotFrequency *= (-1);
}
nDerotFrequency += nFreq - nFrequency;
STV0299SetDerotFrequency(bTunerIndex, nDerotFrequency);
if(abs(nDerotFrequency) > 5000)
{
nDerotFrequency = 0;
}
dwSearchTime = 40 + CalcDerotTimeConstant(pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate) + CalcDataTimeConstant(0x1f, 1, 2, 1, pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate);
nReturn = CSQPSKSleep(bTunerIndex,dwSearchTime);
if ( CSQPSK_DROPPED == nReturn )
{
#ifdef QPSK_DEBUG
//CSTRACE( INFO_LEVEL, "\nQUICKEXIT");
#endif
return CSQPSK_DROPPED;
}
STV0299GetLockStatus(bTunerIndex,&nLockState);
if ( (nLockState != ALLLOST) && (nLockState != CSQPSK_FAILURE) )
{
nTimingLockFlag = TRUE;
STV0299GetDerotFreq(bTunerIndex,&nFirstDerotFrequency);
break;
}
}
if ( TRUE != nTimingLockFlag )
{
#ifdef QPSK_DEBUG
//CSTRACE( ERROR_LEVEL, "\nNo Timing");
#endif
return CSQPSK_FAILURE;
}
{
dwFreqStep = pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate / 8;
if(dwFreqStep > 1000)
{
dwFreqStep = 1000;
}
nDerotMin = -2500;
nDerotMax = 2500;
}
nLoopCnt++;
jj = 0;
bUpperFlag = FALSE;
bDownFlag = FALSE;
do
{
if ( nLockState == TP_LOCK )
{
#ifdef QPSK_DEBUG
//CSTRACE( INFO_LEVEL, "\n>>DATA OK");
#endif
STV0299GetDerotFreq(bTunerIndex,&nFrequencyOffset);
g_nFrequencyOffset[bTunerIndex] = nFrequencyOffset + nFrequency - dwCHFreq;
if ( abs(g_nFrequencyOffset[bTunerIndex]) > 5000 )
{
#ifdef QPSK_DEBUG
//CSTRACE( ERROR_LEVEL, "\n>>RANGE NG");
CSTRACE( ERROR_LEVEL, "[HDIQPSK] Err CSLock offset is too big failed\n");
CSTRACE( ERROR_LEVEL, "Position:file = %s,line = %d\n", __FILE__, __LINE__);
#endif
return CSQPSK_FAILURE;
}
else
{
pCSCHANNEL->m_nFrequencyOffset = g_nFrequencyOffset[bTunerIndex];
return CSQPSK_SUCCESS;
}
}
else if ( nLockState == CFOUND )
{
#ifdef QPSK_DEBUG
//CSTRACE( INFO_LEVEL, "\n>>CARRIER OK");
#endif
STV0299SetIQ(bTunerIndex,pCSCHANNEL->m_bIQ ^ 0x01);
nReturn = CSQPSKSleep(bTunerIndex,40);
if (CSQPSK_DROPPED == nReturn)
{
#ifdef QPSK_DEBUG
//CSTRACE( WARN_LEVEL, "\nQUICKEXIT");
#endif
return CSQPSK_DROPPED;
}
STV0299GetLockStatus(bTunerIndex,&nLockState);
if(nLockState == TP_LOCK)
{
STV0299GetDerotFreq(bTunerIndex,&nFrequencyOffset);
g_nFrequencyOffset[bTunerIndex] = nFrequencyOffset + nFrequency - dwCHFreq;
if(abs(g_nFrequencyOffset[bTunerIndex]) > 5000)
{
#ifdef QPSK_DEBUG
//CSTRACE( ERROR_LEVEL, "\n>>RANGE NG");
CSTRACE( ERROR_LEVEL, "[HDIQPSK] Err CSLock offset is too big failed\n");
CSTRACE( ERROR_LEVEL, "Position:file = %s,line = %d\n", __FILE__, __LINE__);
#endif
return CSQPSK_FAILURE;
}
else
{
pCSCHANNEL->m_nFrequencyOffset = g_nFrequencyOffset[bTunerIndex];
return CSQPSK_SUCCESS;
}
}
else
{
STV0299SetIQ(bTunerIndex,pCSCHANNEL->m_bIQ);
}
}
nDerotFrequency = jj * dwFreqStep / 2;
if ( jj % 2)
{
nDerotFrequency *= (-1);
}
nDerotFrequency += nFirstDerotFrequency;
if ( nDerotFrequency > nDerotMax )
{
bUpperFlag = TRUE;
}
if ( nDerotFrequency < nDerotMin )
{
bDownFlag = TRUE;
}
STV0299SetDerotFrequency( bTunerIndex, nDerotFrequency );
dwSearchTime = CalcDerotTimeConstant(pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate) + CalcDataTimeConstant(0x1f, 1, 2, 1, pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate);
nReturn = CSQPSKSleep(bTunerIndex,dwSearchTime);
if ( CSQPSK_DROPPED == nReturn )
{
return CSQPSK_DROPPED;
}
STV0299GetLockStatus(bTunerIndex, &nLockState);
jj++;
}while( !( bUpperFlag && bDownFlag ) );
if ((nLoopCnt < g_nLoopCnt[bTunerIndex]) && (pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < g_nSRThreshInKsps[bTunerIndex]))
{
//CSTRACE( INFO_LEVEL, "\nLoop again!!!============================================\n");
goto LOOP;
}
#ifdef QPSK_DEBUG
//CSTRACE( INFO_LEVEL, "\nSignal not found!!!============================================\n");
#endif
return CSQPSK_FAILURE;
}
void FTDRegOptimize(CSHDITunerIndex bTunerIndex, DWORD dwSymbolRate)
{
if(g_bLinkICType[bTunerIndex] == STV_0299)
{
if ( g_bPLLICType[bTunerIndex] == IX2450 )
STV0299_Optimize(bTunerIndex, dwSymbolRate, SHARP0194) ;
else if( g_bPLLICType[bTunerIndex] == IX2360 )
STV0299_Optimize(bTunerIndex, dwSymbolRate, SHARP0184) ;
else if( g_bPLLICType[bTunerIndex] == IX2273)
STV0299_Optimize(bTunerIndex, dwSymbolRate, SHARP0184) ;
else if( g_bPLLICType[bTunerIndex] == LGTUNERIC)
STV0299_Optimize(bTunerIndex, dwSymbolRate, LGF001F) ;
else if( g_bPLLICType[bTunerIndex] == LGS002F)
STV0299_Optimize(bTunerIndex, dwSymbolRate, LG_S002F) ;
else if( g_bPLLICType[bTunerIndex] == STB6000)
STV0299_Optimize(bTunerIndex, dwSymbolRate, STB6K) ;
else
STV0299_Optimize(bTunerIndex, dwSymbolRate, SHARP0184) ;
}
}
CSQPSK_Error_t FTDSetSymbolRate(CSHDITunerIndex bTunerIndex, DWORD dwSymbolRate)
{
int nReturn=CSQPSK_FAILURE;
if ( g_bLinkICType[bTunerIndex] == STV_0299 )
{
if ( g_bPLLICType[bTunerIndex] == IX2450 )
STV0299RegInit (bTunerIndex, SHARP0194);
else if( g_bPLLICType[bTunerIndex] == IX2360 )
STV0299RegInit(bTunerIndex, SHARP0184);
else if( g_bPLLICType[bTunerIndex] == IX2273)
STV0299RegInit(bTunerIndex, SHARP0184);
else if( g_bPLLICType[bTunerIndex] == LGTUNERIC)
STV0299RegInit(bTunerIndex, LGF001F);
else if( g_bPLLICType[bTunerIndex] == LGS002F)
STV0299RegInit(bTunerIndex, LG_S002F);
else if( g_bPLLICType[bTunerIndex] == STB6000)
STV0299RegInit(bTunerIndex, STB6K);
else
STV0299RegInit(bTunerIndex, SHARP0184);
nReturn = STV0299SetSRate ( bTunerIndex, dwSymbolRate ) ;
}
return nReturn;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -