tda10086drv.c

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

C
1,716
字号
	TDA10086SetOneRegister(bTunerIndex,0x57,0x00);
	/*	TDA10085_ADC_C1	*/
	TDA10086SetOneRegister(bTunerIndex,0x58,0x61);
	CSSleep(5);
	TDA10086SetOneRegister(bTunerIndex,0x58,0x60);

	TDA10086SetPLL(bTunerIndex);

	return CSQPSK_SUCCESS;
}

CSQPSK_Error_t TDA10086CheckChipID ( CSHDITunerIndex bTunerIndex, BYTE bTSOutputMode)
{
	BYTE bValue;
	int nRet;
	int i;

        g_hdlTDA10086I2C[bTunerIndex] = 0;
    	if (CSI2COpen(bTunerIndex,TDA10086ADDRESS,&g_hdlTDA10086I2C[bTunerIndex]) != CSI2C_SUCCESS)
	{
		CSTRACE( ERROR_LEVEL, "\n[HDI][CS_QPSK][TDA10086CheckChipID]:\n******** TDA10086 Open I2C Error ********");
		CSI2CClose( g_hdlTDA10086I2C[bTunerIndex]);
     		return CSQPSK_I2C_ERROR;
	}  

        g_hdlTDA8263I2C[bTunerIndex] = 0;
    	if (CSI2COpen(bTunerIndex,TDA8263ADDRESS,&g_hdlTDA8263I2C[bTunerIndex]) != CSI2C_SUCCESS)
	{
		CSI2CClose( g_hdlTDA8263I2C[bTunerIndex]);
		CSTRACE( ERROR_LEVEL, "\n[HDI][CS_QPSK][TDA10086CheckChipID]:\n******** PLL TDA8263 Open I2C Error ********");
     		return CSQPSK_I2C_ERROR;
	}  

	for ( i=0; i<5; i++ )
	{
		nRet = TDA10086GetOneRegister (bTunerIndex, TDA10086REG_IDENTITY, &bValue );
		if ( nRet == CSQPSK_SUCCESS )
			break;
	}

	if (nRet != CSQPSK_SUCCESS)
	{
		CSI2CClose( g_hdlTDA8263I2C[bTunerIndex]);
		return nRet;
	}
	else if (TDA10086_ID == bValue)
	{
		return TDA10086Initialize(bTunerIndex,bTSOutputMode);			
	}
	else 
	{
		CSI2CClose( g_hdlTDA8263I2C[bTunerIndex]);
		return CSQPSK_FAILURE;
	}
}

void TDA8263GainControl( CSHDITunerIndex bTunerIndex )
{
	BYTE bVAGCA;
				
	TDA10086GetOneRegister(bTunerIndex, 0x43, &bVAGCA );

	if( bVAGCA < 45 && g_bChanged[bTunerIndex] == 0 )
    {
        g_bAMPoff[bTunerIndex] = 1;
		g_bChanged[bTunerIndex] = 1;	
		TDA10086SetOneRegister(bTunerIndex,0x37, 0x63);
		TDA10086SetOneRegister(bTunerIndex,0x42, 0x4F);
		TDA8263SetFrequency( bTunerIndex, g_dwCurrFreq[bTunerIndex] );
    }
	else if ( bVAGCA <90 && g_bChanged[bTunerIndex] == 2 )
	{
   		g_bAMPoff[bTunerIndex] = 0;
		g_bChanged[bTunerIndex] = 0;	
		TDA8263SetFrequency( bTunerIndex, g_dwCurrFreq[bTunerIndex] );
	}	
	else if ( bVAGCA >110 && g_bChanged[bTunerIndex] == 0 )
	{
   		g_bAMPoff[bTunerIndex] = 2;
		g_bChanged[bTunerIndex] = 2;	
		TDA8263SetFrequency( bTunerIndex, g_dwCurrFreq[bTunerIndex] );
	}
	else if ( bVAGCA >100 && g_bChanged[bTunerIndex] == 1 )
	{
	   	g_bAMPoff[bTunerIndex] = 0;
		g_bChanged[bTunerIndex] = 0;	
		TDA10086SetOneRegister(bTunerIndex,0x37, 0x43);
		TDA10086SetOneRegister(bTunerIndex,0x42, 0x43);
		TDA8263SetFrequency( bTunerIndex, g_dwCurrFreq[bTunerIndex] );
	}

}

CSQPSK_Error_t TDA10086GetLockStatus ( CSHDITunerIndex bTunerIndex, int *pnLockStatus)
{
	BYTE bRegValue;
       BYTE bVAGCA;
	int ErrorCode;
	int i;
	
	if((g_dwCurrFreq[bTunerIndex] > 900000) && (g_dwCurrFreq[bTunerIndex] < 2250000))
	{	
		TDA8263GainControl(bTunerIndex);
	}

	for ( i=0; i<5; i++ )
	{
		ErrorCode = TDA10086GetOneRegister(bTunerIndex,TDA10086REG_SYNC, &bRegValue);	
		if (ErrorCode == CSQPSK_SUCCESS)
			break;
	}
	
	if ( ErrorCode != CSQPSK_SUCCESS)
	{
		return ErrorCode;
	}
	//printf("\nTDA10086REG_SYNC = 0x%x", bRegValue);
	if ((bRegValue & 0x1E) == 0x1E)
	{                
		*pnLockStatus = TRUE;
	}
	else
	{
		*pnLockStatus = FALSE;
	}

	return CSQPSK_SUCCESS;
}


BYTE TDA10086GetNEST( CSHDITunerIndex bTunerIndex )
{
	BYTE bNESTbyte, bNESTprevious;
	BYTE bMaxAttempt = 5;

	do
	{
		bMaxAttempt --;

		TDA10086GetOneRegister(bTunerIndex,TDA10086REG_NEST, &bNESTprevious);
		TDA10086GetOneRegister(bTunerIndex,TDA10086REG_NEST, &bNESTbyte);
	} while((bNESTprevious != bNESTbyte) && bMaxAttempt);

	return(bNESTbyte);
}

BYTE TDA10086GetAGCA( CSHDITunerIndex bTunerIndex )
{
	BYTE bAGCbyte, bAGCprevious;
	BYTE bMaxAttempt = 5;

	do
	{
		bMaxAttempt --;

		TDA10086GetOneRegister(bTunerIndex,TDA10086REG_VAGCA, &bAGCprevious);
		TDA10086GetOneRegister(bTunerIndex,TDA10086REG_VAGCA, &bAGCbyte);
		
	} while((bAGCprevious != bAGCbyte) && bMaxAttempt);

	return(bAGCbyte);
}

CSQPSK_Error_t TDA10086SignalStrength ( CSHDITunerIndex bTunerIndex, int *pnSignalStrength )
{
        BYTE bAGCAValue;
	DWORD dwSiglevel;
        int nStrength;
	int nLockStatus;
	int ErrorCode;

	ErrorCode = TDA10086GetLockStatus(bTunerIndex, &nLockStatus);
	if ( ErrorCode != CSQPSK_SUCCESS )
	{
		return ErrorCode;
	}
	
	if ( nLockStatus != TRUE )
	{
		nStrength = 5 + (int)(rand()%5);
	}
	else
	{
		dwSiglevel = (DWORD)TDA10086GetAGCA(bTunerIndex);
		dwSiglevel = 256 - dwSiglevel;
		dwSiglevel = (dwSiglevel * 100 ) / 255;
		nStrength = (int)dwSiglevel + (int)(rand()%5);
	    	if(nStrength > 100)
				nStrength = 99;
	}

	*pnSignalStrength = nStrength;
	
        return CSQPSK_SUCCESS;
}


CSQPSK_Error_t TDA10086GetSignalQuality ( CSHDITunerIndex bTunerIndex, int *pnSignalQuality )
{
        BYTE bAGCAValue;
        int nQuality;
	int nLockStatus;
	int ErrorCode;

	ErrorCode = TDA10086GetLockStatus(bTunerIndex, &nLockStatus);
	if ( ErrorCode != CSQPSK_SUCCESS )
	{
		return ErrorCode;
	}
	
	if ( nLockStatus != TRUE )
	{
		nQuality = 5 + (int)(rand()%5);
	}
	else
	{
    		nQuality = TDA10086GetNEST(bTunerIndex);
		if ( nQuality > 165 )
			nQuality = 165;
    		nQuality = 165 - nQuality;
		nQuality = (nQuality * 100 ) / 165;
	}

       *pnSignalQuality = nQuality;

	return CSQPSK_SUCCESS;
}

CSQPSK_Error_t TDA10086GetSignalPowerAndQuality ( CSHDITunerIndex bTunerIndex, int *nPower, int *nQuality)
{
	int ErrorCode = CSQPSK_SUCCESS;
	ErrorCode |= TDA10086GetSignalQuality( bTunerIndex, nQuality );
	ErrorCode |= TDA10086SignalStrength ( bTunerIndex, nPower );

	return ErrorCode;
}	

CSQPSK_Error_t TDA10086OpenTunerI2C (CSHDITunerIndex bTunerIndex)
{
	BYTE bValue;
	int ErrorCode;

	ErrorCode = TDA10086GetOneRegister (bTunerIndex,TDA10086REG_CLEAR, &bValue);
	if (ErrorCode != CSQPSK_SUCCESS)
		return ErrorCode;
	bValue |= 0x10;
	return TDA10086SetOneRegister (bTunerIndex, TDA10086REG_CLEAR, bValue);
}

CSQPSK_Error_t TDA10086CloseTunerI2C (CSHDITunerIndex bTunerIndex)
{
	BYTE bValue;
	int ErrorCode;

	ErrorCode = TDA10086GetOneRegister (bTunerIndex,TDA10086REG_CLEAR, &bValue);
	if (ErrorCode != CSQPSK_SUCCESS)
		return ErrorCode;
	bValue &= ~0x10;
	return TDA10086SetOneRegister (bTunerIndex, TDA10086REG_CLEAR, bValue);
}

CSQPSK_Error_t TDA10086SearchingSignal( CSHDITunerIndex bTunerIndex, CSQPSKCHANNEL *pCSCHANNEL )
{	 
       DWORD dwFrequency;
       DWORD dwSymbolRate;
	int nFreqOffset;
	BYTE bValue;
	BYTE bReturnValue;
	int AlgoStartNumber = 0;
	int nReturn;
	int nLockStatus;
	int ii;
	
	if(pCSCHANNEL==NULL)
		return CSQPSK_INVALID_PARAM;

	nFreqOffset = pCSCHANNEL->m_nFrequencyOffset;
	
	if(abs(nFreqOffset) > 5000)
		nFreqOffset = 0;
	
	if((pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 1000) ||
		(pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate > 50000) ||
		(pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency < 900000) ||
		(pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency > 2250000))
	{
		TDA8263SetFrequency(bTunerIndex,900000);
		CSTRACE( ERROR_LEVEL, "\n[HDI][CS_QPSK][TDA10086SearchingSignal]:\n[TDA10086SearchingSignal]Param Error");
		return CSQPSK_INVALID_PARAM;
	}
	
       dwFrequency = pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency+nFreqOffset;
       dwSymbolRate = pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate;

	g_dwCurrFreq[bTunerIndex] = dwFrequency;
	g_dwSymRate[bTunerIndex] = dwSymbolRate*1000;

        TDA10086Regiterset(bTunerIndex);

	TDA10086InitDemod(bTunerIndex);	
		
    	do
	{
		TDA10086AlgoStart(bTunerIndex);
		bReturnValue = TDA10086AlgoMain(bTunerIndex,&g_nAlgoTimer[bTunerIndex], &g_dwCurrFreq[bTunerIndex], g_dwSymRate[bTunerIndex]);
		AlgoStartNumber++;
	} while((AlgoStartNumber<12) && (bReturnValue!=AS_ALGOSUCCESS_RET)  && (bReturnValue!=AS_ALGOFAILED_RET) && (bReturnValue != AS_ALGOQUICKEXIT_RET));	/* KDEAN */

  	if ( bReturnValue == AS_ALGOQUICKEXIT_RET )
  	{
		return CSQPSK_DROPPED;
	}
	else if ( bReturnValue==AS_ALGOSUCCESS_RET )
 	{
		nReturn = CSQPSKSleep(bTunerIndex, 120);
		if ( nReturn == CSQPSK_DROPPED )
		{
			return CSQPSK_DROPPED;
		}
	}

	for ( ii=0; ii<5; ii++ )
	{
		nReturn = TDA10086CheckLockStatus( bTunerIndex, &nLockStatus );
		if ( nReturn == CSQPSK_SUCCESS )
			break;
	}
	
	if ( (nReturn == CSQPSK_SUCCESS) && (nLockStatus == TRUE))
	{		
//		printf("\n-----TUNER LOCK >>> ");	
		pCSCHANNEL->m_nFrequencyOffset = g_dwCurrFreq[bTunerIndex] - pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency;
		return CSQPSK_SUCCESS;
	}
	else 
	{
//       	printf("\n-----TUNER UN LOCK >>> \n");	
       	return CSQPSK_FAILURE;	
	}	
}

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

//	CSTRACE( INFO_LEVEL, "\n---------Enter TDA10086F22KSwitch----------");
//	CSTRACE( INFO_LEVEL, "\nnF22KCtrl =  %d",nF22KCtrl);
	
       TDA10086GetOneRegister(bTunerIndex,0x36, &bValue);
	if ( nF22KCtrl == CSHDI_ON)
	{		
		bValue|=0x01;
	}
	else
	{
		bValue&=0xFE;
	}

      CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][TDA10086F22KSwitch]:\n---------Exit TDA10086F22KSwitch----------");  
	
	return ( TDA10086SetOneRegister ( bTunerIndex, 0x36, bValue ) );
	
}

CSQPSK_Error_t TDA10086WaitDiSEqCFree (CSHDITunerIndex bTunerIndex)
{
	int i=0;
	BYTE bValue;	
    
	TDA10086GetOneRegister(bTunerIndex,0x50, &bValue);
	while( (!(bValue& 0x01)) && (i<50) )
	{
	    TDA10086GetOneRegister(bTunerIndex,0x50, &bValue);
            i++;
	     CSSleep(1);
	}
//        printf("\nDiseqc - i=%d",i);
	if(i>45) 
	{
		#ifdef TDA10086_DEBUG
	      // sttbx_Print("write DiSEqC fifo error!\n");
		#endif
		
	     return CSQPSK_FAILURE;
	}
	else
		return CSQPSK_SUCCESS;
}

CSQPSK_Error_t TDA10086SendDiSEqC12Command(CSHDITunerIndex bTunerIndex, BYTE *pbValue, int nCommandNum)
{
	BYTE bPreF22KStatus;
        BYTE bRegVal;
	int ii;

       CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][TDA10086SendDiSEqC12Command]:\n---------Enter TDA10086SendDiSEqC12Command----------");
		
        TDA10086WaitDiSEqCFree(bTunerIndex);

	TDA10086GetOneRegister(bTunerIndex,0x36, &bPreF22KStatus);
	TDA10086F22KSwitch ( bTunerIndex, CSHDI_OFF); 	// 22k off

	CSSleep(20);		// Delay > 15ms
	
        bRegVal = ( (nCommandNum -1)<<4 ) | 0x08;
         
	for ( ii = 0; ii < nCommandNum; ii++ )
	{
		TDA10086SetOneRegister(bTunerIndex,0x48+ii, *pbValue++);                               	
        }
    
        TDA10086SetOneRegister(bTunerIndex,0x36, bRegVal); 
	
        TDA10086WaitDiSEqCFree(bTunerIndex);
    
	 CSSleep(40);					// Delay > 15ms

	TDA10086SetOneRegister(bTunerIndex,0x36, bPreF22KStatus);

    	CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][TDA10086SendDiSEqC12Command]:\n---------Exit TDA10086SendDiSEqC12Command----------");
	
	return	CSQPSK_SUCCESS;
}

CSQPSK_Error_t TDA10086SendDiSEqC11Command (CSHDITunerIndex bTunerIndex, BYTE bCommittedByte, BYTE bUnCommittedByte, BYTE bRepeat)
{

	BYTE bPreF22KStatus;

⌨️ 快捷键说明

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