mt313drv.c

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

C
2,160
字号
	/* Reset the ADC */
	if (ZL1031XRdReg ( bTunerIndex,ZL1031X_GPP,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	bValue[0] &=~ZL1031X_GPP_ADCRUN;
	if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_GPP,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	//vDelay_time(500);
	CSSleep(10);
	/* release the ADC reset*/
	bValue[0] =ZL1031X_GPP_ADCRUN | ZL1031X_GPP_DEFAULT;
	if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_GPP,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	  /* trim ADC calibration for ZL10312 and ZL10313*/
	bValue[0] =ZL31X_XTRA_ADCBYTEL_DEFAULT;
	if (ZL1031x_WriteExtra ( bTunerIndex,ZL313_CTRL_SELEXTRA_ADCBL,bValue)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;

	/* select the MPEG external clock pin to use*/
        if (ZL1031x_ReadExtra(bTunerIndex, ZL313_CTRL_SELEXTRA_MPEG ,bValue)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
            /* select IRQ for MPEG clock input */
        bValue[0] &= ~ZL313_XTRA_MPEG_USEIRQ ;
       if (ZL1031x_WriteExtra(bTunerIndex,ZL313_CTRL_SELEXTRA_MPEG ,bValue)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
       /* set up the clock speed register= 2 *xtal*pll ratio*/
	#if (ZL1031X_XTAL ==  XTALK10111KHZ)
	  bValue[0]= 0xb6;
	#else
	  bValue[0]= 0xb4;	
	#endif
	 if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_SYS_CLK,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	 /*diseqc ratio = FxtalkHz/88 */
	#if (ZL1031X_XTAL ==  XTALK10111KHZ)
	  bValue[0]= 0x73;
	#else
	  bValue[0]= 0x72;	
	#endif
	 if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_DISEQC_RATIO,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	 /*set up receiver tuner i/q swap and ROLL_20 bits*/
	 if (ZL1031XRdReg ( bTunerIndex,ZL1031X_QPSK_CTRL,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	   bValue[0]&= ~ZL1031X_QPSK_CTRL_ROLL20;	
	 if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_QPSK_CTRL,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;

	 //Zl10039_Initialise(bTunerIndex);

	/* change some defaults  */
   	bValue[0]= ZL1031X_SNR_THS_HIGH_DEFAULT;
	if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_SNR_THS_HIGH,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	
	bValue[0]= ZL1031X_CW_SW_RATE_3_DEFAULT;
	if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_CS_SW_RATE_3,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;

	/* set up the mpeg output control register 0x60 OP_CTRL*/
	 if (ZL1031XRdReg ( bTunerIndex,ZL1031X_OP_CTRL,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	bValue[0] &= ~(ZL1031X_OP_CTRL_BKERRINV|ZL1031X_OP_CTRL_MOCLKINV|ZL1031X_OP_CTRL_TEIMPEG|ZL1031X_OP_CTRL_BSO);
	#if 1//(ZLX_MPEG_SERIAL) 
	if (TS_SERIAL ==(BYTE) nTSOutMode ||g_nTSOutputMode[bTunerIndex]==TS_SERIAL)
	      bValue[0] |= ZL1031X_OP_CTRL_BSO;
	#endif
	    #if (ZLX_TEI_IN_MEG)
	      bValue[0] |= ZL1031X_OP_CTRL_TEIMPEG;
	    #endif
	    #if (ZLX_MOCLK_INV)
	    	bValue[0] |= ZL1031X_OP_CTRL_MOCLKINV;
	    #endif
	    #if (ZLX_BKERR_INV)   
	    	bValue[0] |= ZL1031X_OP_CTRL_BKERRINV;
	    #endif
	 if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_OP_CTRL,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	 
	/* error indicator control b7  in Monitor control*/
	 if (ZL1031XRdReg ( bTunerIndex,ZL1031X_MON_CTRL,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	bValue[0] &=~ZL1031X_MON_CTRL_ERRNOSIG;
    	#if (ZLX_BKERR_NOSIG)
      	bValue[0]  |= ZL1031X_MON_CTRL_ERRNOSIG;  
    	#endif

	bValue[0] |= 0x05;//add by th for test
	 if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_MON_CTRL,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	    /*set coderate & IQ search to auto (all bits =1)*/
	 bValue[0] = 0xBF;
	  if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_VIT_MODE,bValue,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	  
	bValue[0] = 0x44; // IQ swap
	if ( ZL1031XWrtReg ( bTunerIndex,ZL1031X_QPSK_CTRL, bValue, 1 ) !=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	return CSQPSK_SUCCESS;
	
}

CSQPSK_Error_t ZL1031XGetLockStatus ( CSHDITunerIndex bTunerIndex, int *pnLockStatus )
{
	BYTE bValue, bTemp;
	int nStatus = ALLLOST;
	int ErrorCode=CSQPSK_SUCCESS;
	int ii;
	BYTE szBuffer[3]={0,0,0};
	for(ii=0; ii<5; ii++)
	{
		ErrorCode = ZL1031XRdReg(bTunerIndex, ZL1031X_STATUS,szBuffer,3);
		if ( ErrorCode == CSQPSK_SUCCESS )
			break;
		CSSleep(10);
	}
	//CSTRACE(ERROR_LEVEL,"[hdi][qpsk] ZL1031X_STATUS : 0x%x,0x%x, 0x%x \n",szBuffer[0],szBuffer[1],szBuffer[2]);
	
	if(((szBuffer[0]&0x17)==0x17) && ((szBuffer[2]&0x0c)==0x0c)) 
	{
		nStatus = TP_LOCK;
		
	}
	else if(szBuffer[0]&0x04)
		nStatus = CFOUND;
	else if(szBuffer[0]&0x08)
		nStatus = TIMINGOK;
	
	*pnLockStatus = nStatus;

	return ErrorCode;
}
#if 0
CSQPSK_Error_t ZL1031XCheckLockStatus ( CSHDITunerIndex bTunerIndex, int *pnLockStatus )
{
	int nReturn;
	int nStatus;
	
	nReturn = ZL1031XGetLockStatus (bTunerIndex, &nStatus);
	//*pnLockStatus = FALSE;
	if ( nReturn == CSQPSK_SUCCESS )
	{
		if (TP_LOCK == nStatus)
		{
			*pnLockStatus = TRUE;
		}
		else 
		{
			*pnLockStatus = FALSE;
		}
		
	}
//	else 
//		*pnLockStatus = FALSE;
//	CSTRACE(ERROR_LEVEL,"[hdi][qpsk] ZL1031XCheckLockStatus : 0x%x\n",*pnLockStatus);
	return nReturn;
}
#else
CSQPSK_Error_t ZL1031XCheckLockStatus ( CSHDITunerIndex bTunerIndex, int *pnLockStatus )
{
	int nReturn;
	int nStatus;
	BYTE szBuffer[3]={0,0,0};
	int i;
	*pnLockStatus = FALSE;
	//vDisplay_Reg_Value( bTunerIndex);
	for(i=0;i<5;i++)
	{
		nReturn  = ZL1031XRdReg(bTunerIndex, ZL1031X_STATUS,szBuffer,3);
		if ( nReturn == CSQPSK_SUCCESS )
		{
			if(((szBuffer[0]&0x17)==0x17) &&( (szBuffer[2]&0x0c)==0x0c)) 
			{
				*pnLockStatus = TRUE;
				break;
			}
			else 
			{
				//*pnLockStatus = FALSE;
				CSSleep(5);
			}
			
		}
		else 
			//*pnLockStatus = FALSE;
			CSSleep(5);
	}
//	CSTRACE(ERROR_LEVEL,"[hdi][qpsk] ZL1031XCheckLockStatus : 0x%x\n",*pnLockStatus);

	return nReturn;
}
#endif


/* +==========================================================================+ */
/* | Function:	IQ;%;;														  |	*/		
/* | Input:		N^
* | Output:	N^															  |	*/
/* | Return:	3I9&1jV>													  |	*/
/* +==========================================================================+ */
CSQPSK_Error_t ZL1031XSwapIQ ( CSHDITunerIndex bTunerIndex )
{
	BYTE bValue;
	int ErrorCode;
#if 0
	ErrorCode = ZL1031XRdReg ( bTunerIndex, ZL1031X_VIT_MODE, &bValue, 1 );
	if ( ErrorCode != CSQPSK_SUCCESS )
		return ErrorCode;

	bValue |= 0x40;
	return ( ZL1031XWrtReg ( bTunerIndex,ZL1031X_VIT_MODE, &bValue, 1 ) );
#else
	ErrorCode = ZL1031XRdReg ( bTunerIndex, ZL1031X_QPSK_CTRL, &bValue, 1 );
	//if ( ErrorCode != CSQPSK_SUCCESS )
	//	return ErrorCode;

	bValue |= 0x40;
	return ( ZL1031XWrtReg ( bTunerIndex,ZL1031X_QPSK_CTRL, &bValue, 1 ) );
#endif
}


/* +==========================================================================+ */
/* | Function:	IhVC Link IC 5D7{:EBJ<D4fFw									  |	*/		
/* | Input:		7{:EBJ(KbpsN*5%N;)											  |	*/
/* | Output:	N^															  |	*/
/* | Return:	2YWw3I9&1jV>												  |	*/
/* +==========================================================================+ */
CSQPSK_Error_t ZL1031XSetSRate ( CSHDITunerIndex bTunerIndex, DWORD dwSymbolRate,Scan_Mode mode )
{
	DWORD dwSRate;
	BYTE bValue[4];
	int ErrorCode=0;
	
	if(mode==AUTO_BLIND_SCAN)
	{
		bValue[0]=0xcf;
		bValue[1]=0xff;
		if( ZL1031XWrtReg ( bTunerIndex,ZL1031X_SYM_RATE, bValue, 2 ) !=CSQPSK_SUCCESS)
			return CSQPSK_FAILURE;
		return  CSQPSK_SUCCESS;
	}
	else 
	{
		if(dwSymbolRate>45000) 
			dwSymbolRate=45000;
		dwSRate=dwSymbolRate*256+500;
		dwSRate/=1000;
		bValue[0]=(BYTE)(dwSRate>>8)&0xff;
		bValue[1]=(BYTE)dwSRate&0xff;
		
	}
	if( ZL1031XWrtReg ( bTunerIndex,ZL1031X_SYM_RATE, bValue, 2 ) !=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	
	if(ZL1031XRdReg( bTunerIndex, ZL1031X_QPSK_CTRL, bValue, 1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	bValue[0]&= ~(ZL1031X_QPSK_CTRL_AFC | ZL1031X_QPSK_CTRL_FSCAN);
    
    	if (dwSymbolRate < 10000)
    	{ /*Set AFC bit if required*/
        	bValue[0] |= ZL1031X_QPSK_CTRL_AFC; 
   	}
	if(ZL1031XWrtReg( bTunerIndex, ZL1031X_QPSK_CTRL, bValue, 1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;	

	return  CSQPSK_SUCCESS;

}

CSQPSK_Error_t ZL1031XGetSRate ( CSHDITunerIndex bTunerIndex, DWORD *pdwSymbolRate_k )
{
	BYTE bValue[2];
	DWORD dwSRate;
	if( ZL1031XRdReg ( bTunerIndex,ZL1031X_SYM_RATE, bValue, 2 ) !=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	dwSRate=bValue[0];
	dwSRate <<= 8;
	dwSRate |= bValue[1];
	*pdwSymbolRate_k = dwSRate*1000/256;
	return  CSQPSK_SUCCESS;
}
/* +==========================================================================+ */
/* | Function:	;qH!PE:EVJA?												  |	*/		
/* | Input:		N^															  |	*/
/* | Output:	N^															  |	*/
/* | Return:	PE:EVJA?0-255V.<d (J}V5T=4s, PE:EVJA?T=:C)					  |	*/
/* +==========================================================================+ */
CSQPSK_Error_t ZL1031XSignalQuality(CSHDITunerIndex bTunerIndex, int *pnSignalQuality )
{
	BYTE bSNR[2];
	WORD wTmp;
	DWORD dwQPSK_EbNo;
	int nLockStatus;
	int ErrorCode;

	ErrorCode = ZL1031XGetLockStatus(bTunerIndex,&nLockStatus);
	if ( ErrorCode != CSQPSK_SUCCESS )
		return ErrorCode;
	
	if (  nLockStatus!= TP_LOCK )
	{
		dwQPSK_EbNo = 0;
	}
	else
	{
		ErrorCode = ZL1031XRdReg ( bTunerIndex,ZL1031X_M_SNR, bSNR, 2 );
		if ( ErrorCode != CSQPSK_SUCCESS )
			return ErrorCode;

		wTmp = bSNR[0];
		wTmp = ((wTmp<<8)&0x7f00)|bSNR[1];
		dwQPSK_EbNo=(DWORD)((13312-wTmp)*10/683)*10;
		dwQPSK_EbNo/=10;
		if(dwQPSK_EbNo>99)dwQPSK_EbNo=99;
	}
	*pnSignalQuality = dwQPSK_EbNo;
	return CSQPSK_SUCCESS;
}			  
/* +==========================================================================+ */
/* | Function:	;qH!PE:EG?6H ( 4}5wJT )										  |	*/		
/* | Input:		N^															  |	*/
/* | Output:	N^															  |	*/
/* | Return:	PE:EG?6H0-255V.<d (J}V5T=4s, PE:EG?6HT=4s)					  |	*/
/* +==========================================================================+ */
CSQPSK_Error_t ZL1031XSignalStrength ( CSHDITunerIndex bTunerIndex, int *pnSignalStrength )
{
	BYTE bSR[2];
	int nLevel;
	int ErrorCode;
	int nLockStatus;
	int wTmp;

	ErrorCode = ZL1031XGetLockStatus(bTunerIndex,&nLockStatus);
	if ( ErrorCode != CSQPSK_SUCCESS )
		return ErrorCode;
/*	
	if (  nLockStatus!= TP_LOCK )
	{
		*pnSignalStrength = 0;
	}
	else*/ /*del by th 061228*/
	{		
		ErrorCode = ZL1031XRdReg ( bTunerIndex, ZL1031X_AGC, bSR, 2 );
		if ( ErrorCode != CSQPSK_SUCCESS )
			return ErrorCode;
		wTmp = bSR[0];
		wTmp <<= 8;
		wTmp |= bSR[1];
		wTmp >>= 2;
		
		nLevel=100*wTmp/0x3fff;
		
		//*pnSignalStrength = 100*( nLevel + 128 ) / 224;
		*pnSignalStrength = nLevel;
	}
		
	return CSQPSK_SUCCESS;
}

BOOL  ZL1031x_SetFsmGo(CSHDITunerIndex bTunerIndex)
{
    BYTE buffer;
    buffer = 1;
   if( ZL1031XWrtReg(bTunerIndex, ZL1031X_GO, &buffer,1)!=CSQPSK_SUCCESS)
   	return FALSE;
   return TRUE;
    
}

CSQPSK_Error_t ZL1031x_ProgramTuner(CSHDITunerIndex bTunerIndex,DWORD uFreqKhz, DWORD uRsKhz)
{
    	DWORD dwFreqMHz;
	BYTE ucRs;  /* default rs for scanning*/
	BYTE ucExt = 0;

    	dwFreqMHz = uFreqKhz/1000;
	/* trim frequency limits */
	if (uRsKhz)
        ucRs = (BYTE) (uRsKhz/1000);
    	else 
        ucRs = 255; /* scanning */
    
	return  ZL1003zSetFrequency(bTunerIndex,uFreqKhz, ucRs);
	
}

void vDisplay_Reg_Value(CSHDITunerIndex bTunerIndex)
{
	BYTE  i;
	BYTE  szBuffer[4];
	for(i=0;i<0x80;i++)
	{
	if(ZL1031XRdReg(bTunerIndex, i,szBuffer,1)!=CSQPSK_SUCCESS)
		CSTRACE(ERROR_LEVEL,"[qpsk] i2c read error \n");
	CSTRACE(ERROR_LEVEL,"[%02x]%02x  ", i,szBuffer[0]);
	if((i+1)%0x10==0)
		CSTRACE(ERROR_LEVEL,"\n");
	}
	CSTRACE(ERROR_LEVEL,"\n");	

}

CSQPSK_Error_t ZL1031XLockChannel(CSHDITunerIndex bTunerIndex, CSQPSKCHANNEL *pCHPara)
{
	BYTE ucBuffer;
	BYTE szSymRate[3];
	DWORD dwTemp;
	int lock_flag = FALSE;
	BYTE ucFreqLimit;
	int nSearchCnt;
	BYTE szBuffer[3]={0,0,0};
	int nLoopCnt = 0;
	BYTE ucAdjFreqLimit;
	
    /* check symbol rate and frequency are within sensible values (1 to 45 MBd, 950 to lnblo+2150MHz*/
	if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate< 990|| pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate > 45450) 
	{
		CSTRACE(ERROR_LEVEL,"[hdi][qpsk] input channel paramater error \n");
		ZL1031x_ProgramTuner(bTunerIndex, 950000, 27500);/*modify by th on070126*//*去锁一个锁不住的频点*/
		return /*CSQPSK_INVALID_PARAM*/CSQPSK_FAILURE;/*modify by th on070115*/
	}
	
	if (pCHPara->m_CHANNEL.m_dwChannelFrequency< (ZL1031X_MIN_FREQ - 5000) || pCHPara->m_CHANNEL.m_dwChannelFrequency >  (ZL1031X_MAX_FREQ + 5000)) 
      {
    	 	CSTRACE(ERROR_LEVEL,"[hdi][qpsk] input channel paramater error \n");
		ZL1031x_ProgramTuner(bTunerIndex, 950000, 27500);/*modify by th on070126*//*去锁一个锁不住的频点*/
        	return /*CSQPSK_INVALID_PARAM*/CSQPSK_FAILURE;/*modify by th on070115*/
      }

		
	/* program the tuner */  
	    if(ZL1031x_ProgramTuner(bTunerIndex,pCHPara->m_CHANNEL.m_dwChannelFrequency, pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate)!=CSQPSK_SUCCESS)

⌨️ 快捷键说明

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