stv0288drv.c

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

C
2,124
字号

CSQPSK_Error_t STV0288ConfigTSOutMode (CSHDITunerIndex bTunerIndex, int nTSOutMode)
{
	if ((TS_PARALLEL == nTSOutMode) || (TS_SERIAL == nTSOutMode))
	{
		g_nTSOutputMode[bTunerIndex] = nTSOutMode;
                
		return CSQPSK_SUCCESS;
	}
	else
		return CSQPSK_INVALID_PARAM;
}

static CSQPSK_Error_t STV0288Init(CSHDITunerIndex bTunerIndex)
{
	int ErrorCode;	
	
	g_hSTV0288I2C[bTunerIndex] = 0;
	ErrorCode = CSI2COpen(bTunerIndex,STV0288_CHIP_ADDR,&g_hSTV0288I2C[bTunerIndex]);
	CSASSERT(ErrorCode == CSI2C_SUCCESS);
	if ( ErrorCode != CSI2C_SUCCESS)
	{
		return CSQPSK_I2C_ERROR;
	}
	
	return CSQPSK_SUCCESS;
}
/* +==========================================================================+ */
/* | Function:	OrSTV0288P4J}>]												  |	*/		
/* | Input:		FpJ<<D4fFwKwR}:E											  |	*/
/* | 			V8OrJ}>]5DV8Uk												  |	*/
/* | 			4}P4HkJ}>]8vJ}												  |	*/
/* | Output:	N^															  |	*/
/* | Return:	P4Hk3I9&1jV>												  |	*/
/* +==========================================================================+ */
CSQPSK_Error_t STV0288WrtReg ( CSHDITunerIndex bTunerIndex, BYTE StartReg, BYTE *pbValue, DWORD dwLength )
{
	DWORD ii;
	int ErrorCode;
	BYTE bValue[0x80];

	if(dwLength>=0x80)
	{
		CSTRACE(ERROR_LEVEL,"[hdi][qpsk]STV0288WrtReg input param error \n");
		return CSQPSK_INVALID_PARAM;
	}
	if ( NULL ==pbValue )
	{
		CSASSERT ( NULL !=pbValue );
		return CSQPSK_INVALID_PARAM;
	}
	bValue[0] = StartReg;

	for ( ii = 1; ii < dwLength+1; ii++ )
		bValue[ii] = *pbValue++;

	if ( CSI2CRequestBus_inner(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
	{
		ErrorCode = CSI2CWriteWithStop ( g_hSTV0288I2C[bTunerIndex], bValue, dwLength+1) ;  
		if (ErrorCode == CSI2C_SUCCESS)
			STV0288Set_RegMap_Val( StartReg, &bValue[1],  dwLength);
		CSI2CReleaseBus_inner(bTunerIndex);
		if (ErrorCode == CSI2C_SUCCESS)
		{
			return CSQPSK_SUCCESS;
		}
	}

	return CSQPSK_I2C_ERROR;
}	


CSQPSK_Error_t STV0288WriteReg ( CSHDITunerIndex bTunerIndex, BYTE StartReg, BYTE *pbValue, DWORD dwLength )
{
	DWORD ii;
	int ErrorCode;
	BYTE bValue[0x80];

	if(dwLength>=0x80)
	{
		CSTRACE(ERROR_LEVEL,"[hdi][qpsk]STV0288WrtReg input param error \n");
		return CSQPSK_INVALID_PARAM;
	}

	bValue[0] = StartReg;

	for ( ii = 1; ii < dwLength+1; ii++ )
		bValue[ii] = *pbValue++;

	ErrorCode = CSI2CWriteWithStop ( g_hSTV0288I2C[bTunerIndex], bValue, dwLength+1) ;  
	if (ErrorCode!=CSI2C_SUCCESS)
	{
		return CSQPSK_I2C_ERROR;
	}
	STV0288Set_RegMap_Val( StartReg, &bValue[1],  dwLength);
	return CSQPSK_SUCCESS;
}	


/* +==========================================================================+ */
/* | Function:	4SSTV02886AR;4.J}>]											  |	*/		
/* | Input:		FpJ<<D4fFwKwR}:E											  |	*/
/* | 			V8OrJ}>]5DV8Uk												  |	*/
/* | 			4}6AHkJ}>]8vJ}												  |	*/
/* | Output:	6A3v5DJ}>]													  |	*/
/* | Return:	P4Hk3I9&1jV>												  |	*/
/* +==========================================================================+ */

CSQPSK_Error_t STV0288RdReg(CSHDITunerIndex bTunerIndex, BYTE bStartReg, BYTE *pbValue, DWORD dwLength )
{
	int nResult= CSQPSK_SUCCESS;
	BYTE bValue;

	if ( NULL ==pbValue )
	{
		CSASSERT ( NULL != pbValue );
		return CSQPSK_INVALID_PARAM;
	}
	if ( CSI2CRequestBus_inner(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
	{
		bValue = bStartReg;

		if ( CSI2CWriteWithStop ( g_hSTV0288I2C[bTunerIndex], &bValue, 1 ) != CSI2C_SUCCESS ) 
			nResult = CSQPSK_I2C_ERROR;

		if ( CSI2CReadWithStop (g_hSTV0288I2C[bTunerIndex], pbValue, dwLength ) !=CSI2C_SUCCESS )
			nResult = CSQPSK_I2C_ERROR;

		CSI2CReleaseBus_inner(bTunerIndex);
	}
	else
		nResult = CSQPSK_I2C_ERROR;

	return nResult;
}	
// end STV0288RdReg()
CSQPSK_Error_t STV0288ReadReg(CSHDITunerIndex bTunerIndex, BYTE bStartReg, BYTE *pbValue, DWORD dwLength )
{
	int nResult= CSQPSK_SUCCESS ;
	BYTE bValue;

	bValue = bStartReg;
	if ( CSI2CWriteWithStop ( g_hSTV0288I2C[bTunerIndex], &bValue, 1 ) != CSI2C_SUCCESS ) 
		nResult = CSQPSK_I2C_ERROR;

	if ( CSI2CReadWithStop (g_hSTV0288I2C[bTunerIndex], pbValue, dwLength ) !=CSI2C_SUCCESS )
		nResult = CSQPSK_I2C_ERROR;

	return nResult;
}	


/* +==========================================================================+ */
/* | Function:	?XVFF22R}=EJd3v22KV\FZPE:E									  |	*/		
/* | Input:		?XVFJdHk ( F22KON / F22KOFF )								  |	*/
/* | Output:	N^															  |	*/
/* | Return:	P4Hk3I9&1jV>												  |	*/
/* +==========================================================================+ */

CSQPSK_Error_t STV0288F22KSwitch ( CSHDITunerIndex bTunerIndex, CSHDISwitch nF22KCtrl )
{
	BYTE bValue;
	//CSTRACE( INFO_LEVEL, "\n[F22KSwitch]F22KSwitch enter!!!!\r\n");

	STV0288RdReg( bTunerIndex,R288_DISEQC, &bValue, 1 );
	bValue &= 0xfc;

	if ( nF22KCtrl == CSHDI_ON)
	{
		bValue |=  0x00 ;
	}
	else 
	{
		bValue |=  0x03 ;
	}
	STV0288WrtReg (bTunerIndex,R288_DISEQC, &bValue, 1);
	return CSQPSK_SUCCESS;
}

static CSQPSK_Error_t DiSEqCF22KSwitch ( CSHDITunerIndex bTunerIndex, CSHDISwitch nF22KCtrl )
{
	BYTE bValue;

       // CSTRACE( INFO_LEVEL, "\n=========Enter DiSEqCF22KSwitch=============");
	// CSTRACE( INFO_LEVEL, "\nnF22KCtrl = %d",nF22KCtrl);
#if 0		
	if ( nF22KCtrl == CSHDI_ON )
		bValue = F22K_CONTINUOUS ;
	else 
		bValue = F22K_LOW ;


      // CSTRACE( INFO_LEVEL, "\n========================================\n");
	return ( STV0288WriteReg ( bTunerIndex,STV0288REG_DiSEqC, &bValue, 1 ) );
#else
	return CSQPSK_SUCCESS;
#endif
}

CSQPSK_Error_t STV0288GetMasterClock ( void )
{
	BYTE bPLL_Rate,bPLL_Selration, bpll_bypass, bValue;
	DWORD dExt_clk=STV0288_EXT_REF_CLOCK;  //xtal
	
	STV0288Get_RegMap_Val(R288_PLLCTRL,&bPLL_Rate,1);
	STV0288Get_RegMap_Val(R288_SYNTCTRL,&bValue,1);
	bpll_bypass=bValue&0x01;
	bValue &=0x04;
	bPLL_Selration =  (bValue) ? 4 : 6;
	if(bpll_bypass)
	{
		g_dwMaster_Clock_Khz=dExt_clk;
	}
	else
	{
		g_dwMaster_Clock_Khz=(dExt_clk*(bPLL_Rate+1))/bPLL_Selration;
	}
	CSTRACE(INFO_LEVEL,"\n [STV0288GetMasterClock]Master clock =%d khz\n",g_dwMaster_Clock_Khz);
	CSASSERT( 0 !=g_dwMaster_Clock_Khz);
	return CSQPSK_SUCCESS;
}
/* +==========================================================================+ */
/* | Function:	STV0288KySP<D4fFw3uJ<;/										  |	*/		
/* | Input:		N^														      |	*/
/* | Output:	N^															  |	*/
/* | Return:	P4Hk3I9&1jV>												  |	*/
/* +==========================================================================+ */
void vDebug_Regisger_Value(CSHDITunerIndex bTunerIndex)
{
	BYTE bValue[0x80];
	int i;
	STV0288RdReg( bTunerIndex, 0,bValue, 0x7f);
	 CSTRACE(ERROR_LEVEL,"\n");
	for (i=0;i<0x80;i++)
	{
		CSTRACE(ERROR_LEVEL,"[0x%02x]=0x%02x ",i, bValue[i]);
		if ((i+1)%10==0) CSTRACE(ERROR_LEVEL,"\n");
	}
	 CSTRACE(ERROR_LEVEL,"\n     \n");
	
	for (i=0;i<0x80;i++)
	{
		CSTRACE(ERROR_LEVEL,"[Mx%02x]=0x%02x ",i, g_Stv0288RegMapVal[i]);
		if ((i+1)%10==0) CSTRACE(ERROR_LEVEL,"\n");
	}
	
}
CSQPSK_Error_t STV0288RegInit ( CSHDITunerIndex bTunerIndex )
{
	// sfg DWORD dwDataLen = 0x35;
	BYTE b22KStatus ;
	BYTE bValue[STV0288_NUM_REGS];
	int ErrorCode = CSQPSK_SUCCESS;

	STV0288RegMap_DefaultVal();
	ErrorCode |=STV0288STDBY (  bTunerIndex,0 );
	ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_ID, 		&g_Stv0288DefVal[0], 29 ) ;
       ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_TLIRM, 		&g_Stv0288DefVal[29], 42 ) ;
       ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_SYMBCTRL, 	&g_Stv0288DefVal[71], 3 ) ;
	ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_ASCTRL, 	&g_Stv0288DefVal[74], 29 ) ;   
	ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_FREEDIS, 	&g_Stv0288DefVal[103], 3 ) ; 
	ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_FREEVIT, 	&g_Stv0288DefVal[106], 3 ) ; 
	ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_TAGC1,	 	&g_Stv0288DefVal[109], 5 ) ;
	ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_TSTRM1, 	&g_Stv0288DefVal[114], 5 ) ;
	ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_TSTCK, 	&g_Stv0288DefVal[119], 5 ) ;
	ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_TSTNR2, 	&g_Stv0288DefVal[124], 1 ) ;
	ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_TSTDIS, 	&g_Stv0288DefVal[125], 2 ) ;
	ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_IOPSDAT, 	&g_Stv0288DefVal[127], 10 ) ;
	ErrorCode |=STV0288WrtReg ( bTunerIndex,R288_TCOMP1, 	&g_Stv0288DefVal[137], 3 ) ;
	ErrorCode |=STV0288STDBY (  bTunerIndex,0 );
	
	if (TS_SERIAL == g_nTSOutputMode[bTunerIndex])
	{
		g_Stv0288RegMapVal[R288_RS] = g_Stv0288RegMapVal[R288_RS]|0x40;	
	}
	else 
		g_Stv0288RegMapVal[R288_RS] =  g_Stv0288RegMapVal[R288_RS]&0xbf;	
	#ifdef 	CLOCK_HIGH2LOW
		g_Stv0288RegMapVal[R288_RS] =  g_Stv0288RegMapVal[R288_RS]|0x02;	
	#else
		g_Stv0288RegMapVal[R288_RS] =  g_Stv0288RegMapVal[R288_RS]&0xfd;	
	#endif
	bValue[0] = g_Stv0288RegMapVal[R288_RS];
	//CSTRACE(ERROR_LEVEL," [qpsk]g_nTSOutputMode=0x%x  \n",g_nTSOutputMode[bTunerIndex]);
	//CSTRACE(ERROR_LEVEL," [qpsk]stv0288 R288_RS=0x%x  \n",g_Stv0288RegMapVal[R288_RS]);
	ErrorCode |= STV0288WrtReg ( bTunerIndex, R288_RS, bValue, 1 );	
	STV0288GetMasterClock();////get master clock
	CSASSERT(ErrorCode == CSQPSK_SUCCESS);
	if(  ErrorCode != CSQPSK_SUCCESS )
		return ErrorCode;
//	vDebug_Regisger_Value( bTunerIndex);
	//CSTRACE(ERROR_LEVEL," [qpsk]stv0288 reg init suceess \n");
	return CSQPSK_SUCCESS;
	
}
//carrier lock after timing lock
BOOL bSTV0288CheckCarrierLock ( CSHDITunerIndex bTunerIndex)
{
	BYTE bValue;
	int ErrorCode;
	int i;
	
	for(i=0;i<5;i++)
	{
		ErrorCode = STV0288RdReg ( bTunerIndex,R288_VSTATUS, &bValue, 1 ) ;
		if(ErrorCode != CSQPSK_SUCCESS)
			return 0;
		bValue &=CFOUND_FLAG;
		if(bValue )  //CF lock
			return 1;
		else 
			CSSleep(5);
	}
		//CSTRACE( ERROR_LEVEL, "carrier not OK!!\r\n");
		return 0;

}
//time recovery lock
BOOL bSTV0288CheckTimeLock ( CSHDITunerIndex bTunerIndex)
{
	BYTE bValue;
	int ErrorCode;
	
	int i;
	
	for(i=0;i<5;i++)
	{
		ErrorCode = STV0288RdReg ( bTunerIndex,R288_TLIRM, &bValue, 1 ) ;
		if(ErrorCode != CSQPSK_SUCCESS)
			return 0;
		bValue &=TIMING_FLAG;
		
		if(bValue )  //time lock
			return 1;
		else 
			CSSleep(5);
	}
		//CSTRACE( ERROR_LEVEL, "timing not OK!!\r\n");
		return 0;

}
BOOL bSTV0288CheckTPLock ( CSHDITunerIndex bTunerIndex)
{
	BYTE bValue=0;
	int ErrorCode;
	
	int i;
	
	for(i=0;i<5;i++)
	{
		ErrorCode = STV0288RdReg ( bTunerIndex,R288_VSTATUS, &bValue, 1 ) ;
		if(ErrorCode != CSQPSK_SUCCESS)
			return 0;
		
		bValue &=TPLOCK_FLAG;
		
		if(bValue )  //tp lock//sync word found
			return 1;
		else 
		{
			if (CSQPSK_DROPPED == CSQPSKSleep(bTunerIndex, 2))
			{
				return CSQPSK_DROPPED;
			}
		}
	}
	return 0;

}

CSQPSK_Error_t STV0288GetLockStatus ( CSHDITunerIndex bTunerIndex, int *pnLockStatus )
{
	BYTE bValue, bTemp;
	int nStatus = ALLLOST;
	int ErrorCode;
	int ii;
	
	CSASSERT( NULL != pnLockStatus);
	if( NULL == pnLockStatus) 
		return CSQPSK_FAILURE;
	*pnLockStatus = ALLLOST;
	for(ii=0; ii<5; ii++)
	{
		ErrorCode = STV0288RdReg ( bTunerIndex,R288_VSTATUS, &bValue, 1 ) ;
		//CSTRACE(ERROR_LEVEL,"[qpsk] R288_VSTATUS = 0x%x  \n" ,bValue);
		if ( ErrorCode != CSQPSK_SUCCESS )
		{
			continue;
		}
	
		bTemp = bValue & VSTATUS_MASK ;
	
		if ( bTemp == ( CFOUND_FLAG | TPLOCK_FLAG ) )
		{
			nStatus = TP_LOCK;
			break;
		}
		else if ( bTemp == CFOUND_FLAG )
		{
			nStatus = CFOUND;
			//break;
		}
		CSSleep(5);
	}

	*pnLockStatus = nStatus;

	return CSQPSK_SUCCESS;
}

CSQPSK_Error_t STV0288CheckLockStatus ( CSHDITunerIndex bTunerIndex, int *pnLockStatus )
{
	int nReturn;
	int nStatus;

	*pnLockStatus = FALSE;
	CSASSERT( NULL != pnLockStatus);
	if( NULL == pnLockStatus) 
		return CSQPSK_FAILURE;
#if 0
	nReturn = STV0288GetLockStatus (bTunerIndex, &nStatus);

	if ( nReturn == CSQPSK_SUCCESS )
	{
		if (TP_LOCK == nStatus)

⌨️ 快捷键说明

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