stv0288drv.c

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

C
2,124
字号
		{
			*pnLockStatus = TRUE;
		}
		else 
		{
			*pnLockStatus = FALSE;
		}		
	}
	return nReturn;
#else
	if( bSTV0288CheckTPLock (  bTunerIndex))
		*pnLockStatus = TRUE;
	else
		*pnLockStatus = FALSE;
#endif
	return CSQPSK_SUCCESS;
}


/* +==========================================================================+ */
/* | Function:	IhVC(I,Q) / (I,-Q)											  |	*/		
/* | Input:		IQW4L,	0: I, Q		IQ Normal								  |	*/
/* |					1: I,-Q		IQ Invert								  |	*/
/* | Output:	N^															  |	*/
/* | Return:	3I9&1jV>													  |	*/
/* +==========================================================================+ */
/*set IQ for FEC use,I,Q 一路表示一个BIT*/
CSQPSK_Error_t STV0288SetIQ ( CSHDITunerIndex bTunerIndex, BYTE bIQStatus )
{
	BYTE bValue;
	CSQPSK_Error_t error=CSQPSK_SUCCESS;

	//STV0288Get_RegMap_Val(R288_FECM, &bValue, 1);
	error |= STV0288RdReg ( bTunerIndex,R288_FECM, &bValue, 1 );
	if (bIQStatus)
		bValue |= F288_IQ_INVERT;
	else
		bValue &= (~F288_IQ_INVERT);
	
	 error |= STV0288WrtReg ( bTunerIndex,R288_FECM, &bValue, 1 );
	return error;
}

/* +==========================================================================+ */
/* | Function:	IQ;%;;														  |	*/		
/* | Input:		N^
* | Output:	N^															  |	*/
/* | Return:	3I9&1jV>													  |	*/
/* +==========================================================================+ */
CSQPSK_Error_t STV0288SwapIQ ( CSHDITunerIndex bTunerIndex )
{
	BYTE bValue;
	CSQPSK_Error_t error=CSQPSK_SUCCESS;
	//STV0288Get_RegMap_Val(R288_FECM, &bValue, 1);
	error |= STV0288RdReg ( bTunerIndex,R288_FECM, &bValue, 1 );
	bValue ^=0x01;
	error |=   STV0288WrtReg ( bTunerIndex,R288_FECM, &bValue, 1 );
	  return error;

}

/* +==========================================================================+ */
/* | Function:	4r?*I2CM(5@													  |	*/		
/* | Return:	3I9&1jV>													  |	*/
/* +==========================================================================+ */
CSQPSK_Error_t STV0288EnableTunerI2C ( CSHDITunerIndex bTunerIndex )
{
	BYTE bValue;

	STV0288Get_RegMap_Val(R288_I2CRPT, &bValue, 1);
	//CSTRACE(ERROR_LEVEL," enable tuner value =%d",bValue);
	bValue |= 0x80 ;
	return ( STV0288WriteReg ( bTunerIndex,R288_I2CRPT, &bValue, 1 ) );
	//return ( STV0288WrtReg ( bTunerIndex,R288_I2CRPT, &bValue, 1 ) );
}


/* +==========================================================================+ */
/* | Function:	9X1UI2CM(5@													  |	*/		
/* | Return:	3I9&1jV>													  |	*/
/* +==========================================================================+ */
CSQPSK_Error_t STV0288DisableTunerI2C (CSHDITunerIndex bTunerIndex)
{
	BYTE bValue;
	STV0288Get_RegMap_Val(R288_I2CRPT, &bValue, 1);
	//CSTRACE(ERROR_LEVEL," disable tuner value =%d",bValue);
	bValue &= 0x7f ;
	return ( STV0288WriteReg ( bTunerIndex,R288_I2CRPT, &bValue, 1 ) );
	//return ( STV0288WrtReg ( bTunerIndex,R288_I2CRPT, &bValue, 1 ) );
}

/* +==========================================================================+ */
/* | Function:	<l2bCHIP IDJG7qU}H7 ( SCSZLink ICWT6/J61p )					  |	*/		
/* | Input:		N^															  |	*/
/* | Output:	N^															  |	*/
/* | Return:	U}H7, 75;XSUCCESS, 7qTr75;XFAILURE							  |	*/
/* +==========================================================================+ */
CSQPSK_Error_t STV0288CheckChipID ( CSHDITunerIndex bTunerIndex )
{
	BYTE bValue ;
	int ErrorCode;

	g_hSTV0288I2C[bTunerIndex] = 0;
	if (CSI2COpen(bTunerIndex,STV0288_CHIP_ADDR,&g_hSTV0288I2C[bTunerIndex]) != CSI2C_SUCCESS)
	{
		CSTRACE( ERROR_LEVEL, "\n[HDI][CS_QPSK][STV0288CheckChipID]:\n******** STV0288 Open I2C Error ********");
     		return CSQPSK_I2C_ERROR;
	}  

	 ErrorCode = STV0288RdReg ( bTunerIndex,R288_ID, &bValue, 1 );
	if ( ErrorCode != CSQPSK_SUCCESS )
		return ErrorCode;
	CSTRACE( ERROR_LEVEL, "\n[HDI][CS_QPSK][STV0288CheckChipID]:%d",bValue);
	
	if ( bValue == STV0288_CHIP_ID )
	{
		return CSQPSK_SUCCESS;
	}
	else 
	{
		return CSQPSK_FAILURE;
	}
}

/* +==========================================================================+ */
/* | Function:	STV0288=xHk/MK3vJ!5gD#J=									  |	*/		
/* | Input:		Power Down D#J= ( 0: U}3#.  1: J!5g	)						  |	*/
/* | Output:	N^															  |	*/
/* | Return:	2YWw3I9&1jV>												  |	*/
/* +==========================================================================+ */
CSQPSK_Error_t STV0288STDBY ( CSHDITunerIndex bTunerIndex, int  bPDownFlag )
{
	BYTE bValue ;
	STV0288Get_RegMap_Val(R288_SYNTCTRL,&bValue,1);
	bValue &=0x7f;
	bValue |= ((BYTE)bPDownFlag) << 7;

	return ( STV0288WrtReg ( bTunerIndex,R288_SYNTCTRL, &bValue, 1 ) );
}


/* +==========================================================================+ */
/* | Function:	IhVC Link IC 5D7{:EBJ<D4fFw									  |	*/		
/* | Input:		7{:EBJ(KbpsN*5%N;)											  |	*/
/* | Output:	N^															  |	*/
/* | Return:	2YWw3I9&1jV>												  |	*/
/* +==========================================================================+ */
CSQPSK_Error_t STV0288SetSymbolRate ( CSHDITunerIndex bTunerIndex, DWORD dwSymbolRate )
{
	DWORD dMasterClk;
	BYTE bValue[4];
	int ErrorCode=0;
	DWORD  dwSRate;

#if 0	
	bValue[0] = 0x80;
	bValue[1] = 0x00;
	bValue[2] = 0x00;
	if ( STV0288WrtReg ( bTunerIndex,R288_SFRH, bValue, 3 ) != CSQPSK_SUCCESS )
	{
		ErrorCode++;
	}	
#endif	
	dMasterClk =g_dwMaster_Clock_Khz*1000;  //khz to hz
	//dwSRate=dwSymbolRate*1000;
	dwSRate=dwSymbolRate*1000 ;
	dwSRate=(DWORD)BinFloatDiv(dwSRate,dMasterClk,20);
	//CSTRACE(INFO_LEVEL,"[SetSRate]set symbol rate 0x%x, ture symbol =%d\n",dwSRate,dwSymbolRate);
	bValue[0] = (BYTE)((dwSRate >> 12) & 0xff);
	bValue[1] = (BYTE)((dwSRate >> 4) & 0xff);
	bValue[2] = (BYTE)(dwSRate&0x0f)<<4;
	
	if ( STV0288WrtReg ( bTunerIndex,R288_SFRH, bValue, 3 ) != CSQPSK_SUCCESS )
	{
		ErrorCode++;
	}	
	
	if ( ErrorCode != 0 )
	{
		CSTRACE(INFO_LEVEL,"[qpsk]SetSRate error \n");
		return CSQPSK_FAILURE;
	}
	else
	{
		return CSQPSK_SUCCESS;
	}	

}

/* +==========================================================================+ */
/* | Function:	;qH!PE:EVJA?												  |	*/		
/* | Input:		N^															  |	*/
/* | Output:	N^															  |	*/
/* | Return:	PE:EVJA?0-255V.<d (J}V5T=4s, PE:EVJA?T=:C)					  |	*/
/* +==========================================================================+ */
/*Noise indicator*/
CSQPSK_Error_t STV0288SignalQuality(CSHDITunerIndex bTunerIndex, int *pnSignalQuality )
{
	BYTE bSNR[4];
	WORD wTmp;
	DWORD dwQPSK_EbNo;
	int nLockStatus;
	int ErrorCode;

	ErrorCode = STV0288GetLockStatus(bTunerIndex,&nLockStatus);
	if ( ErrorCode != CSQPSK_SUCCESS )
		return ErrorCode;
	
	if (  nLockStatus!= TP_LOCK )
	{
		dwQPSK_EbNo = 0;
	}
	else
	{
		ErrorCode = STV0288RdReg ( bTunerIndex,R288_NIRM, bSNR, 2 );
		if ( ErrorCode != CSQPSK_SUCCESS )
			return ErrorCode;

		wTmp = bSNR[0];
		wTmp = ((wTmp<<8)&0xff00)|bSNR[1];
		
		dwQPSK_EbNo = wTmp;
		if( dwQPSK_EbNo > 0x3100)	// SPP'76N'Ih6(N*(0x1200 - 0x3000)
			dwQPSK_EbNo = 0x3100;
		if( dwQPSK_EbNo < 0x1600) 
			dwQPSK_EbNo = 0x1600;

		dwQPSK_EbNo = ( 0x3100 - dwQPSK_EbNo ) * 100 / (0x3100-0x1600);
	}
	*pnSignalQuality = dwQPSK_EbNo;
//	*pnSignalQuality = 60;
	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)					  |	*/
/* +==========================================================================+ */
/*通过RF AGC 的大小来确定信号强度*/
CSQPSK_Error_t STV0288SignalStrength ( CSHDITunerIndex bTunerIndex, int *pnSignalStrength )
{
	BYTE bSPOWER;
	int nLevel;
	int ErrorCode;
	int nLockStatus;

	#if 0/*获取信号强度不需要判断锁定的状态*/
	ErrorCode = STV0288GetLockStatus(bTunerIndex,&nLockStatus);
	if ( ErrorCode != CSQPSK_SUCCESS )
		return ErrorCode;
	
	if (  nLockStatus== ALLLOST)
	{
		*pnSignalStrength = 0;
	}
	else
	#endif
	{		
		ErrorCode = STV0288RdReg ( bTunerIndex, R288_AGC1IN, &bSPOWER, 1 );
		if ( ErrorCode != CSQPSK_SUCCESS )
			return ErrorCode;

	
		if ( bSPOWER >= 0x80 )
		{
			nLevel = (255-bSPOWER)*(-1);
		}
		else
		{
			nLevel = bSPOWER;
		}
		

		if (nLevel > 90)
			nLevel = 90 ;

		*pnSignalStrength = 100*( nLevel + 128 ) / 218;
	}
		
	return CSQPSK_SUCCESS;
}

CSQPSK_Error_t STV0288Get_SymbolRate(CSHDITunerIndex bTunerIndex, DWORD *pdwSymb)
{
	BYTE bValue[3];
	DWORD dwMClk;
	CSQPSK_Error_t error= CSQPSK_SUCCESS;
	if ( NULL == pdwSymb )
	{
		CSASSERT ( NULL != pdwSymb );
		return CSQPSK_FAILURE;
	}
	 error |=STV0288RdReg( bTunerIndex, R288_SFRH, bValue, 3);
	 if ( CSQPSK_SUCCESS != error )
	 	return CSQPSK_FAILURE;
	*pdwSymb = STV0288_CalcSymbolRate(g_dwMaster_Clock_Khz,bValue[0],bValue[1],bValue[2]>>4) ;
	return CSQPSK_SUCCESS;
}


/* +==========================================================================+ */
/* | Function:  ;qH!PE:ENsBkBJ												  |	*/		
/* +==========================================================================+ */
/*通过VITERBI 寄存器得到*/
CSQPSK_Error_t STV0288BER(CSHDITunerIndex bTunerIndex, DWORD *pdwBer)
{

	BYTE pbBER[4], bERR;
	DWORD dwErrCNT;
	int ErrorCode=CSQPSK_FAILURE;
	int nLockStatus;
	
	ErrorCode = STV0288GetLockStatus(bTunerIndex,&nLockStatus);
	if ( ErrorCode != CSQPSK_SUCCESS )
		return ErrorCode;
	
	if (  nLockStatus!= TP_LOCK )
	{
		*pdwBer = 10000000;
		return CSQPSK_SUCCESS;
	}
	ErrorCode |= STV0288RdReg ( bTunerIndex, R288_ECNTL, &bERR, 1 );
	dwErrCNT =  (DWORD)pbBER[0]  ;

	ErrorCode |= STV0288RdReg ( bTunerIndex, R288_ECNTM, &bERR, 1 );
		
	dwErrCNT |= ( ((DWORD)bERR) << 8 ) ;
		
	*pdwBer = dwErrCNT;
	
	return ErrorCode;
}
  

/* +==========================================================================+ */
/* | Function:  IhVCCARRIER FREQUENCY REGISTER											  |	*/		
/* | Input:		Derotator Frequency												  |	*/
/* | Output:	N^															  |	*/
/* | Return:	2YWw3I9&1jV>												  |	*/
/* +==========================================================================+ */
CSQPSK_Error_t STV0288DerotFreq (CSHDITunerIndex bTunerIndex, DWORD dwDerotFrequency)
{
	BYTE bDerotFreq[4];
        BYTE bValue;

       // STV0288RdReg ( bTunerIndex, 0x13, &bValue, 1 );
        //bValue |= 0x80;
        //STV0288WrtReg ( bTunerIndex, 0x13, &bValue, 1 );
	bDerotFreq[0] = (BYTE) ( ( dwDerotFrequency >> 8 ) & 0xff );
	bDerotFreq[1] = (BYTE) ( dwDerotFrequency & 0xff );
        
	return ( STV0288WrtReg ( bTunerIndex, R288_CFRM, bDerotFreq, 2 ) );
}			  

CSQPSK_Error_t STV0288GetDerotFreq (CSHDITunerIndex bTunerIndex, int *nDerotFrequency)
{
	BYTE bDerotFreq[4];
	DWORD dwMasterClk;
	int dwDerotFrequency;
	//int nDirect = 1;
	int ErrorCode=0;
	if ( NULL == nDerotFrequency )
	{
		CSASSERT( NULL != nDerotFrequency );
		return CSQPSK_FAILURE;
	}
	ErrorCode |= STV0288RdReg ( bTunerIndex, R288_CFRM, bDerotFreq, 2 );
		
	dwDerotFrequency=CalcDerotFreq(bDerotFreq[0],bDerotFreq[1],g_dwMaster_Clock_Khz);
	
	*nDerotFrequency = dwDerotFrequency;
	return ErrorCode;
}
/*Carrier recovery frequency register*/
CSQPSK_Error_t STV0288SetDerotFrequency (CSHDITunerIndex bTunerIndex, int nFrequency)
{
	int dwDerotFrequency;
	int nDerotFrequency;

	if (nFrequency < 0)
	{
		nDerotFrequency = (-1) * nFrequency;
		dwDerotFrequency = nDerotFrequency * 0x400 / 1375;
		dwDerotFrequency = 0xFFFF - dwDerotFrequency;
	}
	else
	{
		dwDerotFrequency = nFrequency * 0x400 / 1375;
	}	
#if 1
	return STV0288DerotFreq(bTunerIndex, dwDerotFrequency);
#else
	return STV0288DerotFreq(bTunerIndex, 0);
#endif
}

CSQPSK_Error_t STV0288SetClockPolarity( CSHDITunerIndex bTunerIndex, T_ClockPolarity clockPol )
{
	BYTE bValue;
	STV0288Get_RegMap_Val(R288_RS, &bValue, 1);
	if ( clockPol == LOW_TO_HIGH ) 
	{
		bValue &= 0xfd;		
	}
	else 
	{
		bValue |= 0x02;		
	}

	return STV0288WrtReg ( bTunerIndex, R288_RS, &bValue,  1);
}
/*maybe through means of detect the in put signal spectrum */
CSQPSK_Error_t STV0288_Coarse_Scan(CSHDITunerIndex bTunerIndex,int *Offset_Khz,DWORD *dwSymbolRate_k)
{
//	DWORD symbolrate_Bds = 0;
	CSQPSK_Error_t error=CSQPSK_SUCCESS;						
	BYTE bValue[2];
	STV0288Get_RegMap_Val(R288_ASCTRL, bValue, 1);

	bValue[0] |=0x38; /* 1 /16 inte ratio*/
	bValue[0] |= 0x01; /*when high enable coarse mode*/

	error |= STV0288WrtReg (  bTunerIndex,  R288_ASCTRL, bValue, 1 );
	/* run coarse during 15ms */

⌨️ 快捷键说明

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