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

📄 cx24143drv.c

📁 QPSK Tuner details, for conexant chipset.
💻 C
📖 第 1 页 / 共 5 页
字号:
		chan.symbrate =Stuning.nim_satellite_tune.symbol_rate ;
		chan.frequency =  Stuning.nim_satellite_tune.frequency*1000;
	  }
	  */
	
		if(i%2)
	  	{
		//chan.symbrate =Stuning.nim_satellite_tune.symbol_rate-50*(i/2+1);
		chan.frequency =  Stuning.nim_satellite_tune.frequency*1000-250000*(i/2+1);
		nFrequencyOffset = (-1)*250000*(i/2+1);
	  	}
	  	else
	  	{
	  	//chan.symbrate =Stuning.nim_satellite_tune.symbol_rate +50*(i/2+1);
		chan.frequency =  Stuning.nim_satellite_tune.frequency*1000+250000*(i/2+1);
		nFrequencyOffset = 250000*(i/2+1);
	  	}
	
	
	  CSTRACE(QPSK_DEBUG_LEVEL,"[HDIQPSK] Sym: %d, Freq: %d\n",chan.symbrate, chan.frequency);
	  
//	  if(LockStatus)
//		return CSQPSK_SUCCESS; //full  locked
	}

	CSTRACE(QPSK_DEBUG_LEVEL,"[HDIQPSK] CX2414x not locked!!!\n");
	return CSQPSK_FAILURE;
#else
		API_AcqBegin( &NIMs[bTunerIndex] );
	    API_ClearPendingInterrupts( &NIMs[bTunerIndex] );
	   // acq_failure_countdown[unit] = DEMOD_CONNECT_COUNTDOWN;
	 
	    APIresult = API_ChangeChannel( &NIMs[bTunerIndex], &chan );
	    
	    if ( !APIresult )
		{
			CSASSERT(APIresult);
			 API_SetInterruptOptions( &NIMs[bTunerIndex], COBRA_NO_INTERRUPTS );
			return CSQPSK_FAILURE;
	    	}
	   API_SetInterruptOptions( &NIMs[bTunerIndex], COBRA_CONNECTING_INTERRUPTS );	
	   //CSSleep(100);//800
	  nReturn = CSQPSKSleep(bTunerIndex,500);
	  if ( CSQPSK_DROPPED == nReturn )
   		{
			CSTRACE( INFO_LEVEL, "\nQUICKEXIT\n");
		    	return CSQPSK_DROPPED;
       	}
		  /* Make sure it locked on */
	    CSSleep(800);
	    API_GetPendingInterrupts( &NIMs[bTunerIndex], &pending );
	    API_Monitor( &NIMs[bTunerIndex], &NewAcqState[0], &NewLock[0] );
		if(LockStatus[0]) 
			mwpp_parse_pat_start();
	   	
	    /* Clear interrupts */
	    API_ClearPendingInterrupts( &NIMs[bTunerIndex] );
	    API_SetInterruptOptions( &NIMs[bTunerIndex], COBRA_NO_INTERRUPTS );

	    if ( (pending & INTR_ACQ_SYNC) &&
             ((NewAcqState[0] == ACQ_LOCKED_AND_TRACKING) || (NewAcqState[0] == ACQ_FADE)) )
    		{
	       return CSQPSK_SUCCESS;
    		}
    	    else
    		{
 		return CSQPSK_FAILURE;
    		}
#endif
}
  


CSQPSK_Error_t CX2414xCSLockNew  ( CSHDITunerIndex bTunerIndex, CSQPSKCHANNEL *pCSCHANNEL )
{
	CHANOBJ chan;
	BOOL APIresult=0;
	int LockStatus=0;
	int i,j,k;
	LOCKIND  lockinds;
	CSQPSK_Error_t nReturn;
	DWORD dwFreqStep;
	int nDerotFrequency = 0;
	BYTE bUpperFlag = FALSE;
	BYTE bDownFlag = FALSE;
	DWORD vrates;
	LONG nFrequencyOffset;
	int nDerotMin, nDerotMax;
	ACQSTATE  acqstate;          /* current acq state (i.e. locked/not locked) */
	int specinv=1;
	int nLoopCnt = 0;

#ifdef QPSK_DEBUG
	CSTRACE( QPSK_DEBUG_LEVEL, "[HDIQPSK] CX2414x start Lock,Fec = %d\n",pCSCHANNEL->m_bFECRates);
#endif

	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) )
	{
		_TUNER_CX24108_set_freq(&NIMs[bTunerIndex],900*1000);
		{
#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;
		}
	}
	
	vFillOutTune(pCSCHANNEL);

	chan.frequency= Stuning.nim_satellite_tune.frequency*1000+pCSCHANNEL->m_nFrequencyOffset; 
	chan.modtype = MOD_QPSK;
	
	switch( pCSCHANNEL->m_bFECRates )
	{
	case FEC_AUTO:
		Stuning.nim_satellite_tune.fec = M_RATE_AUTO;
		break;
	case FEC1_2:
		Stuning.nim_satellite_tune.fec = M_RATE_1_2;
		break;
	case FEC2_3:
		Stuning.nim_satellite_tune.fec = M_RATE_2_3;
		break;
	case FEC3_4:
		Stuning.nim_satellite_tune.fec = M_RATE_3_4;
		break;
	case FEC5_6:
		Stuning.nim_satellite_tune.fec = M_RATE_5_6;
		break;
	case FEC7_8:
		Stuning.nim_satellite_tune.fec = M_RATE_7_8;
		break;
	case FEC8_9:
		Stuning.nim_satellite_tune.fec = M_RATE_AUTO;
		break;
	default:
		Stuning.nim_satellite_tune.fec = M_RATE_AUTO;		
		break;
	}

	if(Stuning.nim_satellite_tune.fec != M_RATE_AUTO)
	{
		/* Manual mode. */
		chan.coderate = convert_fec_in( Stuning.nim_satellite_tune.fec );       
		chan.viterbicoderates = viterbicoderates;
	}
	else
	{
		/* Automatic mode, try all code rates. */
		chan.coderate = CODERATE_3DIV4;
		chan.viterbicoderates = viterbicoderates;
	}

	chan.symbrate = Stuning.nim_satellite_tune.symbol_rate;  //sfg,unit is k
	chan.specinv = convert_spectrum_in( Stuning.nim_satellite_tune.spectrum );
	chan.samplerate = SAMPLE_FREQ_NOM;

	dwFreqStep = pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate * 125;
	
	if ( dwFreqStep > 800000 )
	{
		dwFreqStep = 800000;
	}
	#ifdef QPSK_DEBUG
	CSTRACE(QPSK_DEBUG_LEVEL,"[CX2414xCSLockNew]dwFreqStep = %d\n",dwFreqStep);
	#endif

	nDerotMin = -2000000;
	nDerotMax = 2000000;

	// added by yuxibo to optimize demod lock
	RegisterWrite(&NIMs[bTunerIndex], CX24130_CTLAFCGAIN, 0x03);
	
	j = 1;
	do
	{
		nDerotFrequency = (j/2) * dwFreqStep / 2;
		if ( j % 2)
		{
			nDerotFrequency *= (-1);
		}
		
		if ( nDerotFrequency > nDerotMax )
		{
			bUpperFlag = TRUE;
			break;
		}
		if ( nDerotFrequency < nDerotMin )
		{
			bDownFlag = TRUE;
			break;
		}

		#ifdef QPSK_DEBUG
		CSTRACE(QPSK_DEBUG_LEVEL,"[API_SetCentralFreq]nDerotFrequency = %d\n",nDerotFrequency);
		#endif

		if (API_AcqContinue(&NIMs[bTunerIndex],&acqstate) == False)  return(False);

		/* (CR 7957) */
		NIMs[bTunerIndex].CLKSMDIV_flag = CLKSMOOTHDIV_UPDATE;
		NIMs[bTunerIndex].CLKSMDIV_CR = CODERATE_NONE;

		/* if locked to a signal, the acq-offset will be valid, otherwise use 0 */
		NIMs[bTunerIndex].actual_tuner_offset = 0L;  /* (CR 6243) */

		NIMs[bTunerIndex].samplerate = chan.samplerate;

		if (API_SetSymbolRate(&NIMs[bTunerIndex],chan.symbrate) == False)  return(False);

		if (API_SetTunerFrequency(&NIMs[bTunerIndex],chan.frequency+nDerotFrequency) == False)  return(False);

		if (API_AcqBegin(&NIMs[bTunerIndex]) == False)  return(False);

		if (API_GetFrequencyOffset(&NIMs[bTunerIndex],&nFrequencyOffset) == False)  return(False);

		if (API_SetSpectralInversion(&NIMs[bTunerIndex],chan.specinv) == False)  return(False);

		/* set the Viterbi code rate settings  */
		vrates = (chan.viterbicoderates | chan.coderate);
		if (API_AcqSetViterbiCodeRates(&NIMs[bTunerIndex],vrates) == False)  return(False);  /* new style */

		/* (CR7349) 4/23/02 cw */
		if (DRIVER_SWAssistAcq_CR1DIV2(&NIMs[bTunerIndex],vrates) == False)  return(False);

		if (API_SetModulation(&NIMs[bTunerIndex],chan.modtype) == False)  return(False);
		if (API_SetViterbiRate(&NIMs[bTunerIndex],chan.coderate) == False)  return(False);

#ifdef QPSK_DEBUG
		CSTRACE(QPSK_DEBUG_LEVEL,"Cx24143Lock: opt_fs_disable = %d\n",NIMs[bTunerIndex].opt_fs_disable);
#endif

		/* if external sample freq is selected, do not touch the sample freq register */
		if (chan.samplerate != SAMPLE_FREQ_EXT)
		{
#ifdef OPTIMAL_FS_CODE                 /* Fs optimization */
		if (NIMs[bTunerIndex].opt_Fs_pllmult != 0 && NIMs[bTunerIndex].opt_fs_disable == False)
		{
		if (__API_SetSampleFrequency(&NIMs[bTunerIndex],NIMs[bTunerIndex].opt_Fs_chosen) == False)  return(False);
		}
		else
#endif  /* #ifdef OPTIMAL_FS_CODE */
		if (API_SetSampleFrequency(&NIMs[bTunerIndex],chan.samplerate) == False)  return(False);
#ifdef OPTIMAL_FS_CODE                 /* Fs optimization */
		/* set default Fs as one chosen */
		/* (CR 7672) line below commented */
		/* --> if (API_GetAssociatedSampleFrequency(nim,chanobj->samplerate,&nim->opt_Fs_chosen) == False)  return(False); */
		}
		else
		{
		/* Fs is externally set, so get current default Fs from by reading the demod */
		if (API_GetSampleFrequency(&NIMs[bTunerIndex],&NIMs[bTunerIndex].opt_Fs_chosen) == False)  return(False);
#endif  /* #ifdef OPTIMAL_FS_CODE */
		}

		/* cause some serious channel-changing action */
		if (API_AcqTrackingSetup(&NIMs[bTunerIndex]) == False)  return(False);

		/* successful channel change operation, save copy in the nim */
		memcpy(&NIMs[bTunerIndex].chanobj,&chan,sizeof(CHANOBJ));

		/* perform SW assist as required */
		if (DRIVER_SWAssistAcq(&NIMs[bTunerIndex]) == False)
		{
		DRIVER_SetError(&NIMs[bTunerIndex],API_BAD_SWA);
		return(False);
		}

		/* (CR 6243) */
		if(DRIVER_SWAssistTuner(&NIMs[bTunerIndex]) == False)
		{
		DRIVER_SetError(&NIMs[bTunerIndex],API_BAD_SWA);
		return(False);
		}

		/* (CR6838) clear the esno average buffer */
		if (API_GetChannelEsNo(&NIMs[bTunerIndex],ESNOMODE_UNDEF,NULL,NULL) == False)  return(False); 

		/* set the clock smoother freq if required (otherwise, clksmooth freq will be set at API_SetOutputOptions() ) */
		if (NIMs[bTunerIndex].mpeg_out.ClkSmoothSel == DDS_LEGACY_SMOOTHING)
		{
		if (DRIVER_SetSmoothClock(&NIMs[bTunerIndex],NIMs[bTunerIndex].mpeg_out.ClkSmoothSel,True) == False)  return(False);
		}
#ifdef CAMARIC_FEATURES
		else if (NIMs[bTunerIndex].mpeg_out.ClkSmoothSel == PLL_ADVANCED_SMOOTHING)
		{
		if (DRIVER_SetSmoothClock(&NIMs[bTunerIndex],NIMs[bTunerIndex].mpeg_out.ClkSmoothSel,True) == False)  return(False);
		}
#endif /* #ifdef CAMARIC_FEATURES */

		//API_SetCentralFreq( &NIMs[bTunerIndex], nDerotFrequency );

		for (k=0; k<4; k++)
		{
			nReturn = CSQPSKSleep(bTunerIndex,50);
			if (CSQPSK_DROPPED == nReturn)
	   		{
	   			#ifdef QPSK_DEBUG
	   			CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Dropped\n");
				#endif
			    	return CSQPSK_DROPPED;
	       	}
	       	API_GetLockIndicators(&NIMs[bTunerIndex],&lockinds);		

			if ( lockinds.demod )
			{
				#ifdef QPSK_DEBUG
				CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Demod Lock with k=%d\n",k);
				#endif
				break;
			}
			else
			{
				#ifdef QPSK_DEBUG
				//CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Demod not Lock with k=%d\n",k);
				#endif
			}
		}
		
		if ( lockinds.demod )
		{			
			#ifdef QPSK_DEBUG
			//CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Demod Lock\n");
			#endif
			for ( i=0; i<5; i++ )
			{	
				if ( lockinds.demod != TRUE )
				{
					break;
				}
				
				if ( lockinds.syncbyte )
				{
					#ifdef QPSK_DEBUG
					CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Full Sync\n");					
					#endif
					/* Get Acq Freq Offset */
					API_GetAcquisitionOffset(&NIMs[bTunerIndex],&nFrequencyOffset);
					#ifdef QPSK_DEBUG
					CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Locked!nFrequencyOffset = %d\n",nFrequencyOffset);
					#endif
				
					if ( abs(nFrequencyOffset) > 5000000 )
					{
						#ifdef QPSK_DEBUG
						CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Offset overflow!\n");
						#endif
						return CSQPSK_FAILURE;
					}
					else						
					{	
						#ifdef QPSK_DEBUG
						CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Locked!Freq=%d, nLoopCnt=%d\n",chan.frequency,nLoopCnt);
						#endif
		                		pCSCHANNEL->m_nFrequencyOffset += nFrequencyOffset;
						return CSQPSK_SUCCESS;
					}
				}

				nReturn = CSQPSKSleep(bTunerIndex,300);
				if (CSQPSK_DROPPED == nReturn)
	       		{
					#ifdef QPSK_DEBUG
					CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Dropped\n");
					#endif
					
				    	return CSQPSK_DROPPED;
		       	}
		       	
				API_GetLockIndicators(&NIMs[bTunerIndex],&lockinds);
				
				#ifdef QPSK_DEBUG
				CSTRACE( QPSK_DEBUG_LEVEL, "[CX24143Lock]Demod Lock i=%d, IQ=%d\n",i,specinv);
				#endif
			}
		}
		else
		{
			CSTRACE(QPSK_DEBUG_LEVEL,"[CX24143Lock]Demod not lock!!!\n");
		}

		j++;
	}while( !( bUpperFlag && bDownFlag ) );

	//#ifdef QPSK_DEBUG
	CSTRACE(QPSK_DEBUG_LEVEL,"[HDIQPSK] CX2414x not locked!!!%d\n",chan.frequency);
	//#endif
	return CSQPSK_FAILURE;
}

CSQPSK_Error_t CX2414xGetBER(CSHDITunerIndex bTunerIndex, DWORD *pdwBer)
{
	int i;
	CMPLXNO        berest;
	MSTATUS status;
	
	for (i=0;i<CNT_TIMES;i++)
	{
   		if ( API_GetBER(&NIMs[bTunerIndex],BER_WINDOW_SIZE,&berest,&status) )
			break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -