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 + -
显示快捷键?