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 + -
显示快捷键?