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

📄 cx24143drv.c

📁 QPSK Tuner details, for conexant chipset.
💻 C
📖 第 1 页 / 共 5 页
字号:
	//int lock_flag=0;
	
	//ret_err=CX2414xCheckLockStatus(bTunerIndex,&lock_flag);
	//if(lock_flag==TRUE)
		ret_err = CX2414X_get_signal_stats( (ULONG)bTunerIndex, &signal_stats,0 );
	//else
	//	*pnSignalQuality	=0;
	CSASSERT(ret_err==CSQPSK_SUCCESS);
		
	*pnSignalQuality	=signal_stats.signal_quality;
	*pnSignalQuality	=(*pnSignalQuality*100)/0xff	;
	#ifdef QPSK_DEBUG
	//CSTRACE( QPSK_DEBUG_LEVEL, "\n[HDI][CS_QPSK][CX2414xSignalQuality] = %d\n ",*pnSignalQuality);
	#endif
	return ret_err;

}
/*****************************************************************************/
/*  FUNCTION:    CX2414xSignalStrength                                                 */

/*  PARAMETERS:  bTunerIndex - tuner index
				pnSignalQuality - the current Signal Strength.     
*/
/*  DESCRIPTION: This function  Check tuner Signal Strength.  */

/*  RETURNS:     suceess or failure           */
/*****************************************************************************/
CSQPSK_Error_t CX2414xSignalStrength(CSHDITunerIndex bTunerIndex, int *pnSignalQuality )
{
	CSQPSK_Error_t ret_err;
	SIGNAL_STATS signal_stats;
	//int lock_flag=0;
	
	//ret_err=CX2414xCheckLockStatus(bTunerIndex,&lock_flag);
	//if(lock_flag==TRUE)
		ret_err = CX2414X_get_signal_stats( (ULONG)bTunerIndex, &signal_stats ,1);
	//else
	//	*pnSignalQuality	=0;
	CSASSERT(ret_err==CSQPSK_SUCCESS);
	
	*pnSignalQuality	=signal_stats.signal_strength;
	*pnSignalQuality	=(*pnSignalQuality*100)/0xff	;
	#ifdef QPSK_DEBUG
	 //CSTRACE( QPSK_DEBUG_LEVEL, "\n[HDI][CS_QPSK][CX2414xSignalStrength] = %d\n ",*pnSignalQuality);
	#endif
	 return ret_err;

}
/*****************************************************************************/
/*  FUNCTION:    CX2414xSet_LNBPower                                                 */

/*  PARAMETERS:  bTunerIndex - tuner index
				bGPIOValue - 1:on ,0:off     
*/
/*  DESCRIPTION: This function  Set LNB Power on or off.  */

/*  RETURNS:     suceess or failure           */
/*****************************************************************************/
CSQPSK_Error_t CX2414xSet_LNBPower ( CSHDITunerIndex bTunerIndex, UCHAR  bGPIOValue )
{
	T_CSGPIOStatus ret_err;
	//ret_err=CSGPIOWrite(PIO_LNB_ENABLE,  bGPIOValue); 
	ret_err=CSGPIOWrite(PIO_LNB_ENABLE,  !bGPIOValue); // for polarity inverse, beause conexant has it's default sets, which control by 0x80000000.
	//CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][CX2414xSet_LNBPower] = %d\n ",bGPIOValue);
	return (!ret_err?CSQPSK_SUCCESS:CSQPSK_FAILURE); 
}
/*****************************************************************************/
/*  FUNCTION:    CX2414x13_18VSwitch                                                 */

/*  PARAMETERS:  bTunerIndex - tuner index
				nch_p - 1:V ,0:H 
*/
/*  DESCRIPTION: This function  Set LNB Power 13V,18V.  */

/*  RETURNS:     suceess or failure           */
/*****************************************************************************/
CSQPSK_Error_t CX2414x13_18VSwitch ( CSHDITunerIndex bTunerIndex, Channel_Polarisation nch_p )
{
	ULONG  ulRegVal;
	BOOL ret_err;
		
	ulRegVal = (nch_p == CSHDI_ON ? 0x01UL : 0x00UL);
     	ret_err=RegisterWrite(&NIMs[bTunerIndex],CX24130_LNBDC,ulRegVal) ;
     #ifdef QPSK_DEBUG	
	CSTRACE( QPSK_DEBUG_LEVEL, "[HDI][CS_QPSK][CX2414x13_18VSwitch] = %d\n ",ulRegVal);
	#endif
	
	return (ret_err?CSQPSK_SUCCESS:CSQPSK_FAILURE); 
}

/*****************************************************************************/
/*  FUNCTION:    CX2414xF22KSwitch                                                 */

/*  PARAMETERS:  bTunerIndex - tuner index
				nF22KCtrl - 1:ON ,0:OFF 
*/
/*  DESCRIPTION: This function  Set 22K signal wave on or off.   */

/*  RETURNS:     suceess or failure           */
/*****************************************************************************/
CSQPSK_Error_t CX2414xF22KSwitch ( CSHDITunerIndex bTunerIndex, CSHDISwitch nF22KCtrl ){
	BOOL ret_err;
	
	if ( nF22KCtrl == CSHDI_ON)
		ret_err=API_SetLNBTone(&NIMs[bTunerIndex],LNBTONE_ON);
	else 
		ret_err=API_SetLNBTone(&NIMs[bTunerIndex],LNBTONE_OFF);
	//CSTRACE( ERROR_LEVEL,(nF22KCtrl == CSHDI_ON )?"[HDIQPSK] CX2414xF22KSwitch on \n":"[HDIQPSK] CX2414xF22KSwitch off \n");
	return (ret_err?CSQPSK_SUCCESS:CSQPSK_FAILURE);
}
/*****************************************************************************/
/*  FUNCTION:    CX2414xSCheckChipID                                                 */

/*  PARAMETERS:  bTunerIndex - tuner index, NO use
				bTSOutMode - NO use
*/
/*  DESCRIPTION: This function  read chip ID.   */

/*  RETURNS:     suceess - the chip ID is right
			     failure  - the chip ID is wrong        */
/*****************************************************************************/
CSQPSK_Error_t CX2414xSCheckChipID ( CSHDITunerIndex bTunerIndex, UCHAR  bTSOutMode )
{
	UCHAR data[4];
	
	 if ( CS_CNXT_REGMAP_GET( CS_PLL_TEST_REG, CS_PLL_TEST_DEMOD_DISABLE_MASK ) ==
                CS_PLL_TEST_DEMOD_DISABLED )
        {
           CSTRACE( ERROR_LEVEL, "[HDIQPSK] DEMOD_NO_HARDWARE\n");
            return CSQPSK_DEVICE_UNKNOWN;//DEMOD_NO_HARDWARE;
        }
	if(CX2414x_I2C_Handle_Init(bTunerIndex)!=CSQPSK_SUCCESS)
	{
		CSTRACE( ERROR_LEVEL, "[HDIQPSK] CX2414x open i2c fail \n");
		 return CSQPSK_FAILURE;
	}
	
	if(CX2414XReadReg( bTunerIndex, 0, data)!=CSQPSK_SUCCESS)
	{
		CSTRACE( ERROR_LEVEL, "[HDIQPSK] CX2414xSCheckChipID read  fail \n");
		return CSQPSK_FAILURE;
	}
	if ( data[0] == CX2414x_ID )
	{
		CSTRACE(INFO_LEVEL, "[HDIQPSK] CX2414xSCheckChipID=0x%x  ok!!!\n",data[0]);
		return CSQPSK_SUCCESS;
	}
	else 
	{
		CSTRACE(ERROR_LEVEL, "[HDIQPSK] CX2414xSCheckChipID Error???\n");
		return CSQPSK_DEVICE_UNKNOWN;
	}
	
}
/*****************************************************************************/
/*  FUNCTION:    CX2414xReadReg                                                 */

/*  PARAMETERS:  bTunerIndex - tuner index
				reg - the register index
				data -The register content.     */

/*  DESCRIPTION: This function read chip register unit .  */

/*  RETURNS:     suceess or failure.              */
/*****************************************************************************/
/*
CSQPSK_Error_t CX2414xReadReg ( CSHDITunerIndex bTunerIndex, int reg,UCHAR *data )
{
	BOOL ret_err;
	
	ret_err= API_ReadReg(&NIMs[bTunerIndex]  ,Register[reg].addr   ,data);  
	CSTRACE( INFO_LEVEL, "[HDIQPSK] CX2414x Reg%d=0x%x \n",Register[reg].addr,data[0]);
	CSASSERT(ret_err);
	if (ret_err )
	{
		return CSQPSK_SUCCESS;
	}
	else 
	{
		return CSQPSK_FAILURE;
	}
}
*/
/*****************************************************************************/
/*  FUNCTION:    CX2414xSetStandby                                                 */

/*  PARAMETERS:  bTunerIndex - tuner index
				nStandby-1:standby ,0:normal.     */

/*  DESCRIPTION: This function set chip standby or not .  */

/*  RETURNS:     suceess or failure.              */
/*****************************************************************************/
CSQPSK_Error_t CX2414xSetStandby( CSHDITunerIndex bTunerIndex, int nStandby )
{
	
	if(API_SetSleepMode(&NIMs[bTunerIndex], nStandby))
		return CSQPSK_SUCCESS;  
	return(CSQPSK_FAILURE);
}
CSQPSK_Error_t CX2414xSetClockPolarity( CSHDITunerIndex bTunerIndex, T_ClockPolarity clockPol )
{
	
	ULONG ulRegVal;
	// internal demodulator clock polarity
	//*((ULPREG) HSDP_TSB_PORT_CNTL_REG) = 1;

	if (RegisterRead(&NIMs[bTunerIndex],CX24130_TUNBURSTCLKPOL,&ulRegVal) == False)
		return(CSQPSK_FAILURE);
	if(clockPol==LOW_TO_HIGH)
		ulRegVal &= (~0x40);  //bit 6
	else 
		ulRegVal |= 0x40;
      if (RegisterWrite(&NIMs[bTunerIndex],CX24130_TUNBURSTCLKPOL,ulRegVal) == False) 
	  	return(CSQPSK_FAILURE);
	return CSQPSK_SUCCESS;
}

  void vFillOutTune(CSQPSKCHANNEL *pCSCHANNEL)
   {
	    /* fill out the tuning spec... */
            Stuning.type = DEMOD_NIM_SATELLITE;
	     //m_dwChannelFrequency is TP Fre or Down Fre  ?
            Stuning.nim_satellite_tune.frequency = pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency; //m_dwChannelFrequency is TP Fre or Down Fre  ?
            Stuning.nim_satellite_tune.symbol_rate = pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate;
           // Stuning.tune.nim_satellite_tune.orbital_position = pConfig->orbital_position;
            Stuning.nim_satellite_tune.orbital_position = 0;
            Stuning.nim_satellite_tune.spectrum = SAT_SPECTRUM_AUTO;
            Stuning.nim_satellite_tune.polarisation= 0;
            Stuning.nim_satellite_tune.fec = M_RATE_AUTO;   

   }

  /*****************************************************************************/
/*  FUNCTION:    CX2414xCSLock                                                 */

/*  PARAMETERS:  bTunerIndex - tuner index
				pCSCHANNEL-Channel para.     */

/*  DESCRIPTION: This function search signal .  */

/*  RETURNS:     suceess--lock , failure--lost lock.              */
/*****************************************************************************/   	
CSQPSK_Error_t CX2414xCSLock  ( CSHDITunerIndex bTunerIndex, CSQPSKCHANNEL *pCSCHANNEL )
{
    	CHANOBJ chan;
   	BOOL APIresult=0;
	int LockStatus=0;
	
	LOCKIND  lockinds;
	ACQSTATE  state=0;  
	CSQPSK_Error_t nReturn;
	 LONG  effectfrq	;
	 int i,j,k;
	 LONG nFrequencyOffset,tuneroffset;

	nFrequencyOffset = 0;
	CSTRACE( ERROR_LEVEL, "\n[HDIQPSK] CX2414x start Lock\n");
	
	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) )
	{
		if ( g_ucCx2414xTunerType[bTunerIndex] == CX2414X_TUNER_CX24109)
		{
			_TUNER_CX24108_set_freq(&NIMs[bTunerIndex],900*1000);
		}
		else
		{
			//Shart0302aSetFrequency( bTunerIndex, 900*1000, 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);
    	// sfg convet frequency unit from KHZ to HZ
    	/*CSTRACE(INFO_LEVEL, "[HDIQPSK]CX2414xCSLock freq = %d\r\n", pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency);*/
	chan.frequency= pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency*1000; //sfg,unit is hz
	// end
	chan.modtype = MOD_QPSK;
	if(Stuning.nim_satellite_tune.fec != M_RATE_AUTO)
	  {
	          /* Manual mode. */
	          chan.coderate = convert_fec_in( Stuning.nim_satellite_tune.fec );       
	          /* Not sure why we do this but I'll leave it there as it dosent cause much harm! */
	          chan.viterbicoderates = CODERATE_2DIV3 | CODERATE_3DIV4; /* only for testing - should be 0 */
	  }
	 else
	  {
	         /* Automatic mode, try all code rates. */
	         chan.coderate = CODERATE_1DIV2;
	         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;
    
	    /* Make sure all interrupts (including acq_fail) are reset, then call
	       API_ChangeChannel to accomplish the tuning. */

	// added by yuxibo to optimize demod lock
	RegisterWrite(&NIMs[bTunerIndex], CX24130_CTLAFCGAIN, 0x03);
		
#if 1	       

	for(i=0;i<6;i++)
	{
	    API_AcqBegin( &NIMs[bTunerIndex] );
	//    API_ClearPendingInterrupts( &NIMs[bTunerIndex] );
	   // acq_failure_countdown[unit] = DEMOD_CONNECT_COUNTDOWN;

	    
	    //CSSleep(50);
	    APIresult = API_ChangeChannel( &NIMs[bTunerIndex], &chan, bTunerIndex);
	   
	    if ( !APIresult )
		{
			CSASSERT(APIresult);
			// API_SetInterruptOptions( &NIMs[bTunerIndex], COBRA_NO_INTERRUPTS );
			//return CSQPSK_FAILURE;
	    	}
	   //API_SetInterruptOptions( &NIMs[bTunerIndex], COBRA_CONNECTING_INTERRUPTS );	

//	     API_GetAcquisitionOffset(&NIMs[bTunerIndex],&effectfrq);
//	   g_nFrequencyOffset[bTunerIndex]=(int)(effectfrq/1000);
#if 0
		nReturn = CSQPSKSleep(bTunerIndex,200);
		if ( CSQPSK_DROPPED == nReturn )
	   	{
			CSTRACE( INFO_LEVEL, "\n[CS_QPSK] QUICK EXIT\n");
			return CSQPSK_DROPPED;
	       }
#endif
	 //if (API_GetFrequencyOffset(&NIMs[bTunerIndex],&tuneroffset) == False)  return(False);
	//API_SetCentralFreq( &NIMs[bTunerIndex], 0 );
	
	/*CSTRACE( QPSK_DEBUG_LEVEL, "[CS_QPSK] pCSCHANNEL->m_nFrequencyOffset = %d, tuneroffset = %d\n",pCSCHANNEL->m_nFrequencyOffset,tuneroffset);*/
	
	   for (j=0;j<8;j++)  //jeffrey
	   {
//	   	API_Monitor(&NIMs[bTunerIndex],&state,&lockinds);
		API_GetLockIndicators(&NIMs[bTunerIndex],&lockinds);
		if(lockinds.demod)
		{
			for ( k=0; k<5; k++ )
			{
				if ( lockinds.demod != TRUE )
				{
					break;
				}
				if (lockinds.syncbyte)
				{
					/* Get Acq Freq Offset */
					//API_GetAcquisitionOffset(&NIMs[bTunerIndex],&nFrequencyOffset);
					//pCSCHANNEL->m_nFrequencyOffset += nFrequencyOffset;
					CSTRACE( QPSK_DEBUG_LEVEL, "[CS_QPSK] Locked frequency offset = %d\n",nFrequencyOffset);
					pCSCHANNEL->m_nFrequencyOffset = nFrequencyOffset;
					return CSQPSK_SUCCESS; //full  locked
				}
				else
				{
					nReturn = CSQPSKSleep(bTunerIndex,150);
					if ( CSQPSK_DROPPED == nReturn )
				   	{
						CSTRACE( INFO_LEVEL, "\n[CS_QPSK] QUICK EXIT\n");
						return CSQPSK_DROPPED;
				       }
					API_GetLockIndicators(&NIMs[bTunerIndex],&lockinds);
				}
			}
			break;
		}
		 
		nReturn = CSQPSKSleep(bTunerIndex,50);
		if ( CSQPSK_DROPPED == nReturn )
	   	{
			CSTRACE( INFO_LEVEL, "\n[CS_QPSK] QUICK EXIT\n");
			return CSQPSK_DROPPED;
	       }

	   }
	  // chan.frequency+=effectfrq;

	  /*
	  if(i%3==1)
	  	{
		chan.symbrate =Stuning.nim_satellite_tune.symbol_rate -50*(i/3+1);
		chan.frequency =  Stuning.nim_satellite_tune.frequency*1000-100000*(i/3+1);
	  	}
	  else if(i%3==2)
	  	{
	  	chan.symbrate =Stuning.nim_satellite_tune.symbol_rate +50*(i/3+1);
		chan.frequency =  Stuning.nim_satellite_tune.frequency*1000+100000*(i/3+1);
	  	}
	  else
	  	{

⌨️ 快捷键说明

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