⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stv0299drv.c

📁 QPSK Tuner details, for conexant chipset.
💻 C
📖 第 1 页 / 共 5 页
字号:
					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 + -