cx24116.c

来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 936 行 · 第 1/2 页

C
936
字号
#include "CS_I2c.h"
#include "phantom.h"
#include "cs_frnpublic.h"
#include "cs_qpsk.h" 
#include "CSHDI_typedef.h"
#include "cs_typedef.h"
#include "CS_assert.h"
#ifdef LSI_PLATFORM
#include "osp.h"
#define LOAD_LENGTH   63
#else
#define LOAD_LENGTH   255
#endif

PHANTOM_NIM 		nim1;
PHANTOM_TUNER_REF_CLOCKOUT_DIV tuner_ref_clkout_div ;
PHANTOM_CHANOBJ  myChanObj ;
PHANTOM_MPEG_OUT	m_Mpeg;
ULONG 			demodHandle;
ULONG			m_CrystalFreq;
ULONG  			m_Pll_multiplier;
CSHDITunerIndex  g_TunerIndex;

static HCSHANDLE hCX24116I2C[MAX_TUNER_NUM];

#ifdef SOFT_LIGHT_CONTROL
int LockStatus = FALSE ;
#endif

void SBWrite( ULONG demod_handle, BYTE reg_addr, BYTE data, PULONG status );
void SBMultiWrite(ULONG demod_handle, ULONG data_length, BYTE reg_addr, PBYTE p_data, PULONG status );
BYTE SBRead( ULONG demod_handle, BYTE reg_addr, PULONG status );
CSQPSK_Error_t  PHANTOMGetSignalBER( CSHDITunerIndex bTunerIndex, DWORD *pdwBer );
PHANTOM_RX_OPER_MODE Get_rx_operation_mode(BYTE ucStandard, BYTE ucFEC_Rate, BYTE ucModulation);

void SBWrite( ULONG demod_handle, BYTE reg_addr, BYTE data, PULONG status )
{	
	BYTE 	ucValue[2];
	ULONG  	ulSerialBusAddr;

	ucValue[0] = reg_addr;
	ucValue[1] = data;

	/* get serial bus address from demod handle: */
	#ifdef LSI_PLATFORM
  	ulSerialBusAddr = (ULONG)(hCX24116I2C[g_TunerIndex] & 0x000000FF);
	#else
	ulSerialBusAddr=(ULONG)hCX24116I2C[g_TunerIndex];
	#endif
	
	if ( CSI2CRequestBus_inner(g_TunerIndex, CSHDI_TIMEOUT_INFINITY) == CSQPSK_SUCCESS )
	{
		
		/* perform the write:  set *status = 0 if there is NO ERROR */
		*status = CSI2CWriteWithStop ( ulSerialBusAddr, ucValue, 2) ; 
		//CSTRACE( ERROR_LEVEL,"status=%d\r\n",*status);
		CSI2CReleaseBus_inner(g_TunerIndex);
	}
	else
		*status=-1;

}	

void SBMultiWrite(ULONG demod_handle, ULONG data_length, BYTE reg_addr, PBYTE p_data, PULONG status )
{
	DWORD 	ii;
	BYTE 	ucValue[LOAD_LENGTH+1];
	ULONG 	ulSerialBusAddr;
	ULONG 	ulLength=0;
	ULONG 	ulCount;

#if 0      
	bValue[0] = reg_addr;
	if( data_length>63)
		count=64;
	else
		count=data_length+1;
	for ( ii = 1; ii < count; ii++ )
		bValue[ii] = *p_data++;
	/* get serial bus address from demod handle: */
	#ifdef LSI_PLATFORM
   	serial_bus_addr =(ULONG)(demod_handle & 0x000000FF);
	#else
	serial_bus_addr=demod_handle;
	#endif
  
	if ( CSI2CRequestBus_inner(Tuner_0, CSHDI_TIMEOUT_INFINITY) == CSQPSK_SUCCESS )
	{
		/* perform the write:  set *status = 0 if there is NO ERROR */
		*status= CSI2CWriteWithStop ( serial_bus_addr, bValue,count) ;  
		CSI2CReleaseBus_inner(Tuner_0);
	}
	else
	{
		*status =-1;
		return;
	}
	
	if(data_length>63)
	{
		length=63;
		while(length<data_length)
       	{
       		if(length+64<=data_length)
			{
				count = 64;
			}
			else
			{
				count = data_length-length;
			}

			for ( ii = 0; ii < count; ii++ )
				bValue[ii] = *p_data++;

			if ( CSI2CRequestBus_inner(Tuner_0, CSHDI_TIMEOUT_INFINITY) == CSQPSK_SUCCESS )
			{
				/* perform the write:  set *status = 0 if there is NO ERROR */
				*status= CSI2CWriteWithStop ( serial_bus_addr, bValue,count) ;  
				CSI2CReleaseBus_inner(Tuner_0);
			}
			else
			{
				*status =-1;
				return;
			}
			length=length+count;
		}
	}
#endif
	/* get serial bus address from demod handle: */
	#ifdef LSI_PLATFORM
   	ulSerialBusAddr =(ULONG)(hCX24116I2C[g_TunerIndex] & 0x000000FF);
	#else
	ulSerialBusAddr=(ULONG)hCX24116I2C[g_TunerIndex];
	#endif
	ulLength=0;
	while(ulLength<data_length)
	{		
		if( (ulLength+LOAD_LENGTH<data_length))
			ulCount=LOAD_LENGTH+1;
		else
			ulCount=data_length+1-ulLength;
		
		ucValue[0] = reg_addr;
		for ( ii = 1; ii < ulCount; ii++ )
			ucValue[ii] = *p_data++;
		
		if ( CSI2CRequestBus_inner(g_TunerIndex, CSHDI_TIMEOUT_INFINITY) == CSQPSK_SUCCESS )
		{
			/* perform the write:  set *status = 0 if there is NO ERROR */
			*status= CSI2CWriteWithStop ( ulSerialBusAddr, ucValue,ulCount) ;  
			CSI2CReleaseBus_inner(g_TunerIndex);
		}
		else
		{
			*status =-1;
			return;
		}
		ulLength=ulLength+ulCount-1;
	}
}


BYTE SBRead( ULONG demod_handle, BYTE reg_addr, PULONG status )
{
	BYTE 	ucValue;
	BYTE 	ucRegValue = 0;
   	ULONG 	ulSerialBusAddr ;

	#ifdef LSI_PLATFORM
   	ulSerialBusAddr =(ULONG)(hCX24116I2C[g_TunerIndex] & 0x000000FF);
	#else
	ulSerialBusAddr=(ULONG)hCX24116I2C[g_TunerIndex];
	#endif

	if ( CSI2CRequestBus_inner(g_TunerIndex, CSHDI_TIMEOUT_INFINITY) == CSQPSK_SUCCESS )
	{
		ucValue = reg_addr;
		*status= CSI2CWriteWithoutStop ( ulSerialBusAddr, &ucValue, 1 ) ;
		//CSSleep(2000);
		*status+=CSI2CReadWithStop (ulSerialBusAddr, &ucRegValue, 1 ) ;
		CSI2CReleaseBus_inner(g_TunerIndex);
	}
	else
		*status =-1;
   	return ucRegValue;
}

/*******************************************************************************************************
 * PHANTOM_CheckChipID() 
 * function to read the chipID 
 *******************************************************************************************************/

CSQPSK_Error_t  PHANTOM_CheckChipID(CSHDITunerIndex bTunerIndex )
 {
	BYTE  	ucRegAddr = 0xFF;	// reg 0xFF 	  
	ULONG	status;
	BYTE  	ucChipID;
	int		ii=10;
	
	CSI2COpen(bTunerIndex,0x0000000a,&hCX24116I2C[bTunerIndex]);
       /*software reset*/
	SBWrite(hCX24116I2C[bTunerIndex], 0xf0, 0x03, &status);
	
	do
	{
		ucChipID = SBRead(hCX24116I2C[bTunerIndex], ucRegAddr, &status);
		CSTRACE( ERROR_LEVEL, "Demod chipID=0x%2.2X  status=%d\r\n", ucChipID, status);
		if(status==0&&ucChipID==0x05) 
		{
			return CSQPSK_SUCCESS;
		}
		else 
		{
			CSQPSKReset(bTunerIndex);
			SBWrite(hCX24116I2C[bTunerIndex], 0xf0, 0x03, &status);
		}
		ii--;
	}while(ii>0);
	
	return CSQPSK_FAILURE;
	
 }
/*******************************************************************************************************
 * PHANTOM__Init()
 * function to initialize the NIM 
 *******************************************************************************************************/ 

CSQPSK_Error_t  PHANTOM_Init(CSHDITunerIndex bTunerIndex,CSHDITsMode TSOutMode)
{
  BOOL	bResult = FALSE;

  g_TunerIndex			= bTunerIndex;
  m_CrystalFreq        		= 40444000; // 40.444MHz for CX24116/CX24118 design 
  m_Pll_multiplier    	 	= PHANTOM_DEFAULT_VIPER_PLL_MULT;	
  demodHandle 	  	 	= 0x0000000a;//(ULONG)hCX24116I2C[bTunerIndex];
  tuner_ref_clkout_div 	= PHANTOM_TUNER_REF_CLKOUT_DIV1;
  
  m_Mpeg.output_mode 				= PHANTOM_PARALLEL_OUT;
  m_Mpeg.clk_parity_mode 				= PHANTOM_CLK_CONTINUOUS;
  m_Mpeg.insert_sync_byte 				= PHANTOM_SYNC_BYTE_INSERT;
  m_Mpeg.tei_bit	 					= PHANTOM_TEI_BIT_SET;
  m_Mpeg.invert_clk 					= PHANTOM_CHANGING_ON_FALLING;
  m_Mpeg.null_data_mode 				= PHANTOM_FIXED_NULL_DATA_DISABLED;
  m_Mpeg.null_data_value 				= PHANTOM_FIXED_NULL_DATA_LOW;
  m_Mpeg.start_signal_polarity 			= PHANTOM_ACTIVE_HIGH;//change polarity
  m_Mpeg.start_signal_width 			= PHANTOM_BYTE_WIDE;//change mode according to CI specification 
  m_Mpeg.valid_signal_polarity 			= PHANTOM_ACTIVE_HIGH;
  m_Mpeg.valid_signal_active_mode 		= PHANTOM_ENTIRE_PACKET;
  m_Mpeg.fail_signal_polarity 			= PHANTOM_ACTIVE_LOW;
  m_Mpeg.fail_signal_active_mode 		= PHANTOM_FIRST_BYTE;
  m_Mpeg.clk_out_edge 				= PHANTOM_CLKOUT_EDGE;
  m_Mpeg.tristate_config 				= PHANTOM_TSTATE_MPEG_OFF;
  m_Mpeg.extra_clocks_between_packets  = 0;
  
  if(TSOutMode==TS_SERIAL)
  { 
  	m_Mpeg.output_mode 				= PHANTOM_SERIAL_OUT_DATA0;
  }	
 #ifdef QPSK_DEBUG
	CSTRACE( ERROR_LEVEL,"demodHandle=0x%x",demodHandle);
	CSTRACE( ERROR_LEVEL,"m_Mpeg.output_mode=%d",m_Mpeg.output_mode);
 	CSTRACE( ERROR_LEVEL,"begintime=%d\r\n",CSGetTickCount());
 #endif
   bResult = PHANTOM_InitEnvironment(&nim1, demodHandle, SBMultiWrite, SBWrite, SBRead, m_CrystalFreq, tuner_ref_clkout_div, m_Pll_multiplier, &m_Mpeg);
   if (bResult == TRUE)
  {
    	#ifdef QPSK_DEBUG
		CSTRACE( ERROR_LEVEL,"endtime=%d\r\n",CSGetTickCount());
		CSTRACE( ERROR_LEVEL,"[PHANTOM_InitEnvironment]succed!\r\n");
	#endif
  }
  else 
  {
   	#ifdef QPSK_DEBUG
		CSTRACE( ERROR_LEVEL,"[PHANTOM_InitEnvironment]failed!\r\n");
	#endif
	return (CSQPSK_FAILURE);
   }
  
   if( PHANTOM_BERControl(&nim1,PHANTOM_BER_WINDOW_TWO_POWER_8,PHANTOM_BER_WINDOW_TWO_POWER_8)!=True)
   {
	#ifdef QPSK_DEBUG
		CSTRACE( ERROR_LEVEL,"PHANTOM_BERControl failed!\r\n");
	#endif
	return(CSQPSK_FAILURE);
   }

  return CSQPSK_SUCCESS;

}

CSQPSK_Error_t  PHANTOMGetLockStatus ( CSHDITunerIndex bTunerIndex, int *pnLockStatus )
{
	PHANTOM_ACQ_STATE	acqState;
	PHANTOM_LOCKIND	lockInd;
	BOOL 				bResult;

	bResult=PHANTOM_Monitor(&nim1, &acqState, &lockInd);
	#ifdef QPSK_DEBUG
	CSTRACE( ERROR_LEVEL,"[PHANTOM_Monitor]acqState=%d,lockInd=%d,%d,%d,%d\r\n",acqState,lockInd.pll,lockInd.demod_sync,lockInd.ldpc,lockInd.bch);
	#endif
	if(bResult==True)
	{
		if (acqState == PHANTOM_ACQ_LOCKED_AND_TRACKING)
		{
			#ifdef QPSK_DEBUG
				CSTRACE( ERROR_LEVEL,"PHANTOM_ACQ_LOCKED_AND_TRACKING\r\n");	
			#endif
			*pnLockStatus = TRUE;
			#ifdef SOFT_LIGHT_CONTROL
			if( LockStatus!= *pnLockStatus)
			{
				m_Mpeg.fail_signal_polarity = PHANTOM_ACTIVE_LOW;//green
				PHANTOM_SetOutputOptions(&nim1,&m_Mpeg);
				LockStatus=TRUE;
			}
			#endif
		}
		else 
		{		
			#ifdef QPSK_DEBUG
				CSTRACE( ERROR_LEVEL,"NOLOCKING!\r\n");	
			#endif
			*pnLockStatus = FALSE;
			#ifdef SOFT_LIGHT_CONTROL
			if( LockStatus!= *pnLockStatus)
			{
				m_Mpeg.fail_signal_polarity = PHANTOM_ACTIVE_HIGH;//red
				PHANTOM_SetOutputOptions(&nim1,&m_Mpeg);
				LockStatus=FALSE;
			}
			#endif
		}
		return CSQPSK_SUCCESS;

	}
	else 
		return CSQPSK_FAILURE;
}

/*******************************************************************************************************
 * OnChangeChannelNim1(ULONG newFrequency)
 * function to search signal 
 *******************************************************************************************************/ 

CSQPSK_Error_t  PHANTOMSearchingSignal( CSHDITunerIndex bTunerIndex,CSQPSKCHANNEL *pCSCHANNEL )
{
	BOOL bResult;
	int ii=10;
	int nLockStatus = FALSE;
	int nLoopCnt = 1;
	int Mode;
	
	myChanObj.specinv				= PHANTOM_SPEC_INV_ON_BOTH;               		
	myChanObj.lnbdc					= PHANTOM_LNBDC_HIGH;                
	myChanObj.lnbtone				= PHANTOM_LNBTONE_OFF;              
	myChanObj.rolloff					= PHANTOM_ROLLOFF_02;        	          
	myChanObj.requested_search_range	= 5000;	/* kHz */
	myChanObj.viterbicoderates		= 0;
		
	myChanObj.frequency = pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency;
	myChanObj.symbrate=pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate;
	myChanObj.pilot=pCSCHANNEL->m_ucPilot;
	myChanObj.rx_operation_mode=/*Get_rx_operation_mode(DVBS_STANDARD,FEC3_4,CS_QPSK);*/Get_rx_operation_mode(pCSCHANNEL->m_ucstandard,pCSCHANNEL->m_bFECRates,pCSCHANNEL->m_ucModulation);

	myChanObj.acqmode				= PHANTOM_ACQ_MODE_BLIND; 
	myChanObj.lnb_offset				= 0; 


	if (PHANTOM_MODE_DVB_UNDEF == myChanObj.rx_operation_mode)/*add by th on 070514for FEC auto option*/
	{
		CSTRACE(1, "s mode undefine!!\r\n");
		nLoopCnt = 5;
		Mode =  (int)PHANTOM_MODE_DVB_1_2;//46;
		myChanObj.rx_operation_mode = (PHANTOM_RX_OPER_MODE) Mode;
	}
	else if (PHANTOM_S2_QPSK_MODE_UNDEF == myChanObj.rx_operation_mode)
	{
		CSTRACE(1, "s2 mode  QPSK undefine!!\r\n");
		nLoopCnt = 8;
		Mode =  (int)PHANTOM_MODE_3;//4//4;
		myChanObj.rx_operation_mode = (PHANTOM_RX_OPER_MODE) Mode;
	}
	else if (PHANTOM_S2_8PSK_MODE_UNDEF == myChanObj.rx_operation_mode)
	{
		CSTRACE(1, "s2 mode 8PSK undefine!!\r\n");
		nLoopCnt = 6;
		Mode =  (int)PHANTOM_MODE_11;//12;
		myChanObj.rx_operation_mode = (PHANTOM_RX_OPER_MODE) Mode;
	}
	do 
	{
		CSTRACE(1, "mode ==== %d\r\n", myChanObj.rx_operation_mode);
		bResult= PHANTOM_ChangeChannel(&nim1, &myChanObj);

		//#ifdef QPSK_DEBUG
		CSTRACE( ERROR_LEVEL,"[[PHANTOMSearchingSignal]m_ucstandard=%d,m_bFECRates=%d,m_ucModulation=%d\r\n",pCSCHANNEL->m_ucstandard,pCSCHANNEL->m_bFECRates,pCSCHANNEL->m_ucModulation);
		CSTRACE( ERROR_LEVEL,"[PHANTOMSearchingSignal]%d,%d,%d,%d\r\n",myChanObj.frequency, myChanObj.symbrate, myChanObj.pilot,myChanObj.rx_operation_mode);
		//#endif
		if (bResult == FALSE)
		{	
//#ifdef QPSK_DEBUG
			CSTRACE( ERROR_LEVEL,"[PHANTOMSearchingSignal]failed!\r\n");
//#endif
			//return CSQPSK_FAILURE;
			//break;
		}
		else
		{
//#ifdef QPSK_DEBUG
			//CSTRACE( ERROR_LEVEL,"[PHANTOMSearchingSignal]succed!\r\n");
//#endif
			while( ii>0)
			{	
				PHANTOMGetLockStatus(bTunerIndex,&nLockStatus);
				if(nLockStatus==TRUE) 
				{
					break;
				}
				ii--;
				CSQPSKSleep(bTunerIndex, 20);			
			}
			PHANTOMGetLockStatus(bTunerIndex,&nLockStatus);
			if(nLockStatus == TRUE)
			{
				long LNBOffset ;
				PHANTOM_GetLNBOffset(&nim1,&LNBOffset);
				pCSCHANNEL->m_nFrequencyOffset = LNBOffset;
				//CSTRACE(ERROR_LEVEL,"LNBOffset=%d,pCSCHANNEL->m_nFrequencyOffset=%d\r\n",LNBOffset,pCSCHANNEL->m_nFrequencyOffset);
				//return CSQPSK_SUCCESS;
				break;
			}  
			else  
			{		
				ii = 10;/*锁定尝试次数复位*/
				Mode ++;
				myChanObj.rx_operation_mode = (PHANTOM_RX_OPER_MODE) Mode;
				//CSSleep(2000);
			}
		}	
	} while (--nLoopCnt);

	if (TRUE == nLockStatus)
	{
		return CSQPSK_SUCCESS;
	}
	else if (FALSE == nLockStatus)
	{
		return CSQPSK_FAILURE;
	}
}


CSQPSK_Error_t  PHANTOMGetSignalBER( CSHDITunerIndex bTunerIndex, DWORD *pdwBer )
{	
	ULONG      	ulCorrBitErrRate;     
	WORD       	wUncorrFrameErrRate; 
	WORD	  	WBerWindowAdjustment;
	PHANTOM_MSTATUS  mstatus;
	DWORD   	dwCorrectedBitErrorRate;
	int ii;
	int nLockStatus;
 	int nErrorCode;
	BYTE 	ucaRxMode[ ]={		41,  44,   4,       5,       6,       7,       8,       9,       10,      11,    12,      13,     14,     15,      16,     17,     40,   46,    47,    48,   49,  50};
	WORD 	waBitsPerFrame[ ]={1168,1168,32400,38880,43200,48600,51840,54000,57600,58320,38880,43200,48600,54000,57600,58320,1168,1632,1632,1632,1632,1632};
	

⌨️ 快捷键说明

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