mt313drv.c

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

C
2,160
字号
	    	return CSQPSK_FAILURE;
	#if USE_MAX_BANDWIDTH
	    ucBuffer = ZL1031X_UNLOCKED_BANDWIDTH;
	#else
	    ucBuffer = pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate/1000;
	#endif
	    if(ZL1003zSetBandwidth(bTunerIndex,ucBuffer)!=CSQPSK_SUCCESS)
	    	return CSQPSK_FAILURE;



    /*Select LNB band according to frequency and LNB data*/
    /*Polarisation */
    /*Satellite*/
    
    /* set code rate search start*/    
    ucBuffer = 0xff;  // IQ SWAP
    if(ZL1031XWrtReg(bTunerIndex, ZL1031X_VIT_MODE,&ucBuffer,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
    ucBuffer = 0x14;
    if(ZL1031XWrtReg(bTunerIndex, ZL1031X_VIT_SETUP,&ucBuffer,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	//ZL1031XSwapIQ(bTunerIndex);
    /* program symbol rate */
    if(ZL1031XSetSRate(bTunerIndex,pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate,CHANNEL_ACQUIRE)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;


	 if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 5000) //5Msps
    	{
    		// ZL10039 Datasheet said no freq offset allowed when SR less than 10MSps
		ucFreqLimit = 20; // 2.5M BW
	}
	else if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 10000) //10Msps
	{
		ucFreqLimit = 28;  // 3.5M BW
	}
	else
	{
		ucFreqLimit =ZL1031X_FR_LIM_ACQ; // 6M BW
	}
/* set frequency search range and centralise it*/
    
    if(ZL1031XWrtReg(bTunerIndex,  ZL1031X_FR_LIM, &ucFreqLimit,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
    ucBuffer = ZL1031X_FR_OFF_CENTRED;
    if (ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_OFF, &ucBuffer,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;

LOOP:
   if( !ZL1031x_SetFsmGo(bTunerIndex)) return CSQPSK_FAILURE;
   	
	if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 12000)
	{
		nSearchCnt = 10;
	}
	else
	{
		nSearchCnt = 8;
	}
		
	do 
	{
		if ( CSQPSK_DROPPED ==  CSQPSKSleep(bTunerIndex,100) )
	   	{
	   		CSTRACE(ERROR_LEVEL,"[qpsk] CSQPSK_DROPPED\n");
		 	return CSQPSK_DROPPED;
	       }

		ZL1031XRdReg(bTunerIndex, ZL1031X_STATUS,szBuffer,3);
		if(((szBuffer[0]&0x17)==0x17) &&( (szBuffer[2]&0x0c)==0x0c)) 
		{
			return CSQPSK_SUCCESS;
		}
		
	}while (--nSearchCnt);

	if ((pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 10000) && (nLoopCnt == 0))
	{	
		ucAdjFreqLimit = ucFreqLimit + 8; // +1M BW 
		ZL1031XWrtReg(bTunerIndex,  ZL1031X_FR_LIM, &ucAdjFreqLimit,1);
		ucBuffer = ZL1031X_FR_OFF_CENTRED;
		ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_OFF, &ucBuffer,1);
		nLoopCnt++;
		//USPPrint(8, "[MT313]### Increase the search range and try again!!!\r\n");
		goto LOOP;		
	}
	return CSQPSK_FAILURE;

}

#if 0
CSQPSK_Error_t ZL1031XLockChannel(CSHDITunerIndex bTunerIndex, CSQPSKCHANNEL *pCHPara)
{
    BYTE ucBuffer;
    BYTE szSymRate[3];
    DWORD dwTemp;
    int lock_flag;
    BYTE szBuffer[3]={0,0,0};
    int search_cnt;
    int nReturn;
    int nFreqLimit;
    int nAdjFreqLimit;
    int nLoopCnt = 0;
    int nAutoFEC = 0;
    BYTE ucFECRate = 0;
    int i;
	
    /* 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);
		return CSQPSK_FAILURE;
	}
	
	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);
        	return CSQPSK_FAILURE;
      }

	if(ZL1031x_ProgramTuner(bTunerIndex,pCHPara->m_CHANNEL.m_dwChannelFrequency, pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate)!=CSQPSK_SUCCESS)
    	return CSQPSK_FAILURE;

#if USE_MAX_BANDWIDTH
    ucBuffer = ZL1031X_UNLOCKED_BANDWIDTH;
#else
    ucBuffer = pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate/1000;
#endif


    if(ZL1003zSetBandwidth(bTunerIndex,ucBuffer)!=CSQPSK_SUCCESS)
    	return CSQPSK_FAILURE;
	
    /*Select LNB band according to frequency and LNB data*/
    /*Polarisation */
    /*Satellite*/
    
    /* set code rate search start*/  
	ucFECRate = 0xC0;  // Automatic spectral inversion	    
	
	USPPrint(8, "[MT313]FEC %d, ",pCHPara->m_bFECRates);
	switch (pCHPara->m_bFECRates)
	{
		case FEC1_2:
			ucFECRate |= 0x01;
			ucBuffer = 0x10;
			USPPrint(8, "FEC1_2\r\n");
			break;
		case FEC2_3:
			ucFECRate |= 0x02;
			ucBuffer = 0x12;
			USPPrint(8, "FEC2_3\r\n");
			break;
		case FEC3_4:
			ucFECRate |= 0x04;
			ucBuffer = 0x14;
			USPPrint(8, "FEC3_4\r\n");
			break;
		case FEC5_6:
			ucFECRate |= 0x08;
			ucBuffer = 0x16;
			USPPrint(8, "FEC5_6\r\n");
			break;
		case FEC7_8:
			ucFECRate |= 0x20;
			ucBuffer = 0x1A;
			USPPrint(8, "FEC7_8\r\n");
			break;
		default:
			ucFECRate = 0xFF;
			ucBuffer = 0x14;
			nAutoFEC = 1;
			USPPrint(8, "FEC AUTO\r\n");
			break;
	}

	if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate > 10000)
	{

		ucFECRate = 0xFF;
		nAutoFEC = 1;
		USPPrint(8, "[MT313]SymbolRate>10MSps, FEC AUTO\r\n");
	}
	
    if(ZL1031XWrtReg(bTunerIndex, ZL1031X_VIT_MODE,&ucFECRate,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	
    if(ZL1031XWrtReg(bTunerIndex, ZL1031X_VIT_SETUP,&ucBuffer,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	//ZL1031XSwapIQ(bTunerIndex);
    /* program symbol rate */
    if(ZL1031XSetSRate(bTunerIndex,pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate,CHANNEL_ACQUIRE)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
	/*设置载波恢复的范围*/
    /* set frequency search range and centralise it*/
    	if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 5000) //5Msps
    	{
    		// ZL10039 Datasheet said no freq offset allowed when SR less than 10MSps
		nFreqLimit = 20; // 2.5M BW
	}
	else if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 10000) //10Msps
	{
		nFreqLimit = 28;  // 3.5M BW
	}
	else
	{
		nFreqLimit =ZL1031X_FR_LIM_ACQ; // 6M BW
	}
   /* [(-FR_LIM + FR_OFF), (FR_LIM + FR_OFF)]*/
    if(ZL1031XWrtReg(bTunerIndex,  ZL1031X_FR_LIM, &nFreqLimit,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
    ucBuffer = ZL1031X_FR_OFF_CENTRED;
    if (ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_OFF, &ucBuffer,1)!=CSQPSK_SUCCESS)
		return CSQPSK_FAILURE;
    
    /* program the tuner , moved to the begining of channel search*/  
#if 0
    if(ZL1031x_ProgramTuner(bTunerIndex,pCHPara->m_CHANNEL.m_dwChannelFrequency, pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate)!=CSQPSK_SUCCESS)
    	return CSQPSK_FAILURE;
    
#if USE_MAX_BANDWIDTH
    ucBuffer = ZL1031X_UNLOCKED_BANDWIDTH;
#else
    ucBuffer = pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate/1000;
#endif
    if(ZL1003zSetBandwidth(bTunerIndex,ucBuffer)!=CSQPSK_SUCCESS)
   	return CSQPSK_FAILURE;
 #endif    

LOOP: 
   if( !ZL1031x_SetFsmGo(bTunerIndex)) return CSQPSK_FAILURE;

	if (nAutoFEC == 0)
	{
		search_cnt = 6;
	}
	else
	{
		if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 12000)
		{
			search_cnt = 10;
		}
		else
		{
			search_cnt = 8;
		}
	}
	
	for (i=0; i<search_cnt; i++)
	{
		int cr;
		if ( CSQPSKSleep(bTunerIndex, 100) == CSQPSK_DROPPED)
   		{
			CSTRACE(3, "QUICKEXIT\n");
		    	return CSQPSK_DROPPED;
       	}
		
		ZL1031XRdReg(bTunerIndex, ZL1031X_STATUS,szBuffer,3);
		if(((szBuffer[0]&0x17)==0x17) &&( (szBuffer[2]&0x0c)==0x0c)) 
		{
			int sr;
			int sr_offset;
			
			//sr = get_sr();
			sr_offset = sr - pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate;
			if (sr_offset < 0)
			{
				sr_offset = -sr_offset;
			}
			
			cr = (szBuffer[2]>>4)&0x07;
			if (cr > 2)
				cr++;
			//USPPrint(8, "[MT313]Signal Locked at i=%d, Status(0x%x, 0x%x, 0x%x)\r\n", i, szBuffer[0],szBuffer[1],szBuffer[2]);
			USPPrint(8, "[MT313]Locked SR=%d, CodeRate=%d/%d\r\n",sr,cr+1,cr+2);

			return CSQPSK_SUCCESS;
		}
		
		else
		{
			USPPrint(8, "[MT313]Not Lock, i=%d, Status(0x%x, 0x%x, 0x%x)\r\n", i,szBuffer[0],szBuffer[1],szBuffer[2]);
		}
		
	}
	USPPrint(8, "[MT313]Not Lock, i=%d, Status(0x%x, 0x%x, 0x%x)\r\n", i,szBuffer[0],szBuffer[1],szBuffer[2]);

	/*如果手动VIT 模式搜索失败,则转为自动模式*/
	if ((nAutoFEC == 0) && (nLoopCnt == 0))
	{
		nAutoFEC = 1;
		ucFECRate = 0xFF;
		ZL1031XWrtReg(bTunerIndex, ZL1031X_VIT_MODE,&ucFECRate,1);
			
		nAdjFreqLimit = nFreqLimit + 8; // +1M BW 
		ZL1031XWrtReg(bTunerIndex,  ZL1031X_FR_LIM, &nAdjFreqLimit,1);
		ucBuffer = ZL1031X_FR_OFF_CENTRED;
		ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_OFF, &ucBuffer,1);
		nLoopCnt++;
		USPPrint(8, "[MT313]### Change FEC_MODE to automatic and try again!!!\r\n");
		goto LOOP;	
	}
	/*若自动VIT搜索模式下的符号率低于10M,则再搜索一次*/
	if ((pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 10000) && (nLoopCnt == 0))
	{	
		nAdjFreqLimit = nFreqLimit + 8; // +1M BW 
		ZL1031XWrtReg(bTunerIndex,  ZL1031X_FR_LIM, &nAdjFreqLimit,1);
		ucBuffer = ZL1031X_FR_OFF_CENTRED;
		ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_OFF, &ucBuffer,1);
		nLoopCnt++;
		USPPrint(8, "[MT313]### Increase the search range and try again!!!\r\n");
		goto LOOP;		
	}
	return CSQPSK_FAILURE;
}
#endif
/* +==========================================================================+ */
/* | Function:  ;qH!PE:ENsBkBJ												  |	*/		
/* +==========================================================================+ */
CSQPSK_Error_t ZL1031XGetBER(CSHDITunerIndex bTunerIndex, DWORD *pdwBer)
{
#if 1

	BYTE bValue[3],bCR;
	int ErrorCode=CSQPSK_SUCCESS;
	int dt=1;
	DWORD dwSR_k,dwError;
	int nLockStatus;
	
	ErrorCode = ZL1031XGetLockStatus(bTunerIndex,&nLockStatus);
	if ( ErrorCode != CSQPSK_SUCCESS )
		return ErrorCode;
	if (  nLockStatus!= TP_LOCK )
	{
		*pdwBer = 10000000;/*add by th*/
		return CSQPSK_SUCCESS;
	}
	
	ErrorCode |= ZL1031XRdReg ( bTunerIndex, ZL1031X_FEC_STATUS, bValue, 1 );
	bCR= (bValue[0]>>4)&0x07;
	ErrorCode |= ZL1031XGetSRate (  bTunerIndex, &dwSR_k );
	ErrorCode |= ZL1031XRdReg ( bTunerIndex, ZL1031X_RS_UBC, bValue, 2 );

	if ( ErrorCode != CSQPSK_SUCCESS )
		return ErrorCode;
	dwError = ((DWORD)bValue[0])<<8 | bValue[1];

	*pdwBer =  dwError *1632 /(dt*2*bCR);
	*pdwBer = *pdwBer*1000 /dwSR_k;
#endif		
	return CSQPSK_SUCCESS;
}
	  

CSQPSK_Error_t ZL1031XGetDerotFreq (CSHDITunerIndex bTunerIndex, int *nDerotFrequency,DWORD dwSymbolRate)
{
	BYTE bDerotFreq[4];
	SHORT dwrequency1,dwrequency2;
	
	int ErrorCode;
	int dwDerotFrequency;
	ErrorCode = ZL1031XRdReg ( bTunerIndex, ZL1031X_FREQ_ERR, bDerotFreq, 2 );
	if ( ErrorCode != CSQPSK_SUCCESS )
		return ErrorCode;
	dwrequency1 = ((SHORT)bDerotFreq[0] << 8 ) + (SHORT)bDerotFreq[1];
	
	ErrorCode = ZL1031XRdReg ( bTunerIndex, ZL1031X_FREQ_ERR+3, bDerotFreq, 2 );
	if ( ErrorCode != CSQPSK_SUCCESS )
		return ErrorCode;
	dwrequency2 = ((SHORT)bDerotFreq[0] << 8 ) + (SHORT)bDerotFreq[1];

	dwDerotFrequency=(int)((dwrequency1*90)/65536+(dwrequency2*(dwSymbolRate/1000))/262144);
	
	*nDerotFrequency = dwDerotFrequency;
	return CSQPSK_SUCCESS;
}

CSQPSK_Error_t ZL1031XSetDerotFrequency (CSHDITunerIndex bTunerIndex, int nFrequency_0ffset)
{
		return CSQPSK_SUCCESS;
}

#if 0
/* +--------------------------------------------------------------------------+ */
/* +==========================================================================+ */
/* |						RTOB:/J}SkDiSEqCSP9X							  |	*/		
/* +==========================================================================+ */
/* +--------------------------------------------------------------------------+ */

/* +==========================================================================+ */
/* | Function:	=xHkDiSEqC W4L,												  |	*/		
/* +==========================================================================+ */
CSQPSK_Error_t CSDSCActive ( CSHDITunerIndex bTunerIndex )
{
	BYTE bValue[4];

	bValue[0] = 0 | DiSEqC_MODE | MODULATED_BURST;

	return ( ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqC, bValue, 1 ) );
}

/* +==========================================================================+ */
/* | Function:	7"KMTONE BURST C|An  										  |	*/		
/* | DiSEqC		bTBSwitch:													  |	*/
/* +==========================================================================+ */
static CSQPSK_Error_t CSDSCTBCommand ( CSHDITunerIndex bTunerIndex, BYTE bTBSwitch )
{
	BYTE bValue;
	int ErrorCode;

	bValue = 0;

	bValue &= ~( DiSEqCMODE_MASK | TONEBURST_MASK );

	if ( bTBSwitch == 0 )
	{
		bValue |= DiSEqC_MODE ;

		ErrorCode = ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqC, &bValue, 1 );
		if ( ErrorCode != CSQPSK_SUCCESS )
			return ErrorCode;
		
		bValue = 0x00;

		return ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );		
	}
	else //if ( bTBSwitch == 1 )
	{
		bValue |= DiSEqC_MODE ;

⌨️ 快捷键说明

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