📄 stv0299drv.c
字号:
//sttbx_Print("\ndwCurSymbolRate = %d", g_ppdwSegSymbR[ii][0]);
if(dwCurSymbolRate < g_ppdwSegSymbR[ii][0])
break;
}
*pdwSearchTime=g_ppdwSegSymbR[ii][1];
*pdwFreqStep=g_ppdwSegSymbR[ii][2];
return CSQPSK_SUCCESS;
}
void CSSetConfigASIInSel ( CSHDITunerIndex bTunerIndex, int nASIInSel, int nASIStatusPin)
{
g_nASIInSelect[bTunerIndex] = nASIInSel ;
g_nASIStatusPin[bTunerIndex] = nASIStatusPin ;
// STV0299RegInit() ;
}
CSQPSK_Error_t STV0299_Optimize(CSHDITunerIndex bTunerIndex, DWORD dwSymbolRate, int nTunerType)
{
BYTE bValue[3];
int ErrorCode;
//
//[July 08, 2005]Modify by yuxibo in Istanbul.
//
if( nTunerType != STB6K)
{
if ( dwSymbolRate <= 5000 ) bValue[0] = 0x89;
else if ( dwSymbolRate <= 10000 ) bValue[0] = 0x8F;
else if ( dwSymbolRate <= 45000 ) bValue[0] = 0x95;
return ( STV0299WrtReg ( bTunerIndex,STV0299REG_BCLC, bValue, 1 ) );
}
else
{
//sttbx_Print("[STV0299_Optimize]STB6K optimize\n");
if((dwSymbolRate>=5000))
{
bValue[0] = 0x99;
bValue[1] = 0x97;
}
else
{
bValue[0] = 0x9B;
bValue[1] = 0x93;
}
if ( STV0299WrtReg ( bTunerIndex,STV0299REG_ACLC, bValue, 2 ) != CSQPSK_SUCCESS )
{
ErrorCode++;
}
if(dwSymbolRate < 2000)
{
bValue[0] = 0x90;
}
else
{
bValue[0] = 0x94;
}
if ( STV0299WrtReg ( bTunerIndex,STV0299REG_AGC1R, bValue, 1 ) != CSQPSK_SUCCESS )
{
ErrorCode++;
}
}
if ( ErrorCode != 0 )
{
return CSQPSK_FAILURE;
}
else
{
return CSQPSK_SUCCESS;
}
}
/* +==========================================================================+ */
/* | Function: 5C5=DiSEqC FIFO W4L, | */
/* +==========================================================================+ */
static CSQPSK_Error_t CSDSCGetStatus ( CSHDITunerIndex bTunerIndex, int *pnDSCStatus )
{
BYTE bValue[4];
int ErrorCode;
ErrorCode = STV0299ReadReg ( bTunerIndex, STV0299REG_DiSEqCSTATUS, bValue, 1 );
if(ErrorCode != CSQPSK_SUCCESS)
return ErrorCode;
if (( bValue[0] & FIFO_FULL_MASK) == FIFO_FULL_MASK)
*pnDSCStatus = 1;
else
*pnDSCStatus = 0;
return CSQPSK_SUCCESS;
}
static CSQPSK_Error_t STV0299WaitDiSEqCFree (CSHDITunerIndex bTunerIndex)
{
int i=0;
int nDSCStatus;
do
{
CSSleep(1);
CSDSCGetStatus(bTunerIndex,&nDSCStatus);
i++;
} while ( nDSCStatus && (i < 50)); // 5H5=FIFO?U!#
if(i>=45)
{
CSTRACE( ERROR_LEVEL, "[HDIQPSK] Err STV0299WaitDiSEqCFree TimeOut\n");
CSTRACE( ERROR_LEVEL, "Position:file = %s,line = %d\n", __FILE__, __LINE__);
return CSQPSK_FAILURE;
}
else
return CSQPSK_SUCCESS;
}
CSQPSK_Error_t STV0299SendOptionCommand(CSHDITunerIndex bTunerIndex, BYTE ucOptionSwitch)
{
int nOptionSwitch;
BYTE aucDiseqcCommand[4];
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][STV0299SendOptionCommand]:\n ucOptionSwitch= %d",ucOptionSwitch);
if (ucOptionSwitch == 1)
{
aucDiseqcCommand[0] = 0xE0;
aucDiseqcCommand[1] = 0x15;
aucDiseqcCommand[2] = 0x23;
}
else if (ucOptionSwitch == 2)
{
aucDiseqcCommand[0] = 0xE0;
aucDiseqcCommand[1] = 0x15;
aucDiseqcCommand[2] = 0x27;
}
if (nOptionSwitch != 0)
{
STV0299SendDiSEqCCommand(bTunerIndex, aucDiseqcCommand, 3);
CSSleep(100);
}
}
CSQPSK_Error_t STV0299SendDiSEqCCommand (CSHDITunerIndex bTunerIndex, PBYTE pbValue, int nCommandNum)
{
BYTE bPreF22KStatus;
BYTE bValue;
int ii;
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][STV0299SendDiSEqCCommand]:\n=========Enter STV0299SendDiSEqCCommand=============");
if ( CSI2CRequestBus_inner(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
{
STV0299WaitDiSEqCFree(bTunerIndex);
if ( STV0299ReadReg ( bTunerIndex,STV0299REG_DiSEqC, &bValue, 1 ) != CSQPSK_SUCCESS )
{
CSI2CReleaseBus_inner(bTunerIndex);
return CSQPSK_FAILURE;
}
bPreF22KStatus = bValue & DiSEqCMODE_MASK; // 5C5=22KW4L,#,1cSZRT:s;V84!#
if ( DiSEqCF22KSwitch ( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS ) // 9X22KJd3v!#
{
CSI2CReleaseBus_inner(bTunerIndex);
return CSQPSK_FAILURE;
}
CSSleep(25);
if ( CSDSCActive (bTunerIndex) != CSQPSK_SUCCESS) // =xHkDiSEqCD#J=
{
CSI2CReleaseBus_inner(bTunerIndex);
return CSQPSK_FAILURE;
}
for ( ii = 0; ii < nCommandNum; ii++ )
{
STV0299WaitDiSEqCFree(bTunerIndex);
bValue = *pbValue++;
STV0299WriteReg ( bTunerIndex,STV0299REG_DiSEqCFIFO, &bValue, 1 );
}
STV0299WaitDiSEqCFree(bTunerIndex);
CSSleep(40);
if (STV0299WriteReg ( bTunerIndex,STV0299REG_DiSEqC, &bPreF22KStatus, 1 ) != CSQPSK_SUCCESS)
{
CSI2CReleaseBus_inner(bTunerIndex);
return CSQPSK_FAILURE;
}
CSI2CReleaseBus_inner(bTunerIndex);
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][STV0299SendDiSEqCCommand]:\n========================================\n");
return CSQPSK_SUCCESS;
}
else
return CSQPSK_FAILURE;
}
CSQPSK_Error_t STV0299SendDiSEqC10Command (CSHDITunerIndex bTunerIndex, BYTE bSwitchType, BYTE bCommittedByte, BYTE bToneBurstSel, BYTE bRepeat)
{
BYTE bPreF22KStatus;
BYTE bRepeatTimes;
BYTE pbValue[4];
BYTE bToneburst;
BYTE bValue;
int ii;
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][STV0299SendDiSEqC10Command]:\n=========Enter STV0299SendDiSEqC10Command=============");
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][STV0299SendDiSEqC10Command]:\n bSwitchType = %d, bCommittedByte = 0x%x, bToneBurstSel = %d",bSwitchType,bCommittedByte,bToneBurstSel);
if ( CSI2CRequestBus_inner(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
{
bRepeatTimes = bRepeat;
pbValue[0] = 0xE0;
pbValue[1] = 0x10;
pbValue[2] = 0x38;
pbValue[3] = bCommittedByte;
/*bToneburst = (bCommittedByte >> 2) & 0x01;
if (1 == bSwitchType)
{
pbValue[2] = 0x39;
}*/
STV0299WaitDiSEqCFree(bTunerIndex);
if ( STV0299ReadReg ( bTunerIndex,STV0299REG_DiSEqC, &bValue, 1 ) != CSQPSK_SUCCESS )
{
CSI2CReleaseBus_inner(bTunerIndex);
return CSQPSK_FAILURE;
}
bPreF22KStatus = bValue & DiSEqCMODE_MASK; // 5C5=22KW4L,#,1cSZRT:s;V84!#
if ( DiSEqCF22KSwitch ( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS ) // 9X22KJd3v!#
{
CSI2CReleaseBus_inner(bTunerIndex);
return CSQPSK_FAILURE;
}
CSSleep(25);
if ( CSDSCActive (bTunerIndex) != CSQPSK_SUCCESS) // =xHkDiSEqCD#J=
{
CSI2CReleaseBus_inner(bTunerIndex);
return CSQPSK_FAILURE;
}
while ( TRUE )
{
for ( ii = 0; ii < 4; ii++ )
{
STV0299WaitDiSEqCFree(bTunerIndex);
bValue = pbValue[ii];
STV0299WriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );
}
STV0299WaitDiSEqCFree(bTunerIndex);
if (bRepeatTimes == 0)
{
CSSleep(40);
break;
}
else
{
CSSleep(130);
pbValue[0] = 0xE1;
bRepeatTimes--;
}
}
/*
if (0 == bSwitchType)
{
if ( CSDSCTBCommand ( bTunerIndex, bToneburst ) != CSQPSK_SUCCESS ) // 7"KMTone BurstC|An
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
}
else if ((bToneBurstSel == 1) || (bToneBurstSel == 2))
{
if ( CSDSCTBCommand ( bTunerIndex, bToneburst-1 ) != CSQPSK_SUCCESS ) // 7"KMTone BurstC|An
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
}*/
STV0299WaitDiSEqCFree(bTunerIndex);
CSSleep(40);
// sttbx_Print("\nF22KStatus = 0x%x", bPreF22KStatus);
if (STV0299WriteReg ( bTunerIndex, STV0299REG_DiSEqC, &bPreF22KStatus, 1 ) != CSQPSK_SUCCESS)
{
CSI2CReleaseBus_inner(bTunerIndex);
return CSQPSK_FAILURE;
}
CSI2CReleaseBus_inner(bTunerIndex);
// delay to ensure the signal is stable
CSSleep(20);
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][STV0299SendDiSEqC10Command]:\n=================================================\n");
return CSQPSK_SUCCESS;
}
else
return CSQPSK_FAILURE;
}
CSQPSK_Error_t STV0299SendDiSEqC11Command (CSHDITunerIndex bTunerIndex, BYTE bCommittedByte, BYTE bUnCommittedByte, BYTE bRepeat)
{
BYTE bPreF22KStatus;
BYTE bRepeatTimes;
BYTE pbCommittedCommand[4];
BYTE pbUnCommittedCommand[4];
BYTE bToneburst;
BYTE bValue;
int ii;
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][STV0299SendDiSEqC11Command]:\n=========Enter STV0299SendDiSEqC11Command=============");
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][STV0299SendDiSEqC11Command]:\nbCommittedByte = 0x%x, bUnCommittedByte = 0x%x, bRepeat = %d",bCommittedByte,bUnCommittedByte,bRepeat);
if ( CSI2CRequestBus_inner(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
{
bRepeatTimes = bRepeat;
/*
pbCommittedCommand[0] = 0xE0;
pbCommittedCommand[1] = 0x10;
pbCommittedCommand[2] = 0x38;
pbCommittedCommand[3] = bCommittedByte;
bToneburst = (bCommittedByte >> 2) & 0x01;*/
pbUnCommittedCommand[0] = 0xE0;
pbUnCommittedCommand[1] = 0x10;
pbUnCommittedCommand[2] = 0x39;
pbUnCommittedCommand[3] = bUnCommittedByte;
STV0299WaitDiSEqCFree(bTunerIndex);
if ( STV0299ReadReg ( bTunerIndex,STV0299REG_DiSEqC, &bValue, 1 ) != CSQPSK_SUCCESS )
{
CSI2CReleaseBus_inner(bTunerIndex);
return CSQPSK_FAILURE;
}
bPreF22KStatus = bValue & DiSEqCMODE_MASK; // 5C5=22KW4L,#,1cSZRT:s;V84!#
if ( DiSEqCF22KSwitch ( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS ) // 9X22KJd3v!#
{
CSI2CReleaseBus_inner(bTunerIndex);
return CSQPSK_FAILURE;
}
CSSleep(40);
if ( CSDSCActive (bTunerIndex) != CSQPSK_SUCCESS) // =xHkDiSEqCD#J=
{
CSI2CReleaseBus_inner(bTunerIndex);
return CSQPSK_FAILURE;
}
while ( TRUE )
{
/*
for ( ii = 0; ii < 4; ii++ )
{
STV0299WaitDiSEqCFree(bTunerIndex);
bValue = pbCommittedCommand[ii];
STV0299WriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );
}
STV0299WaitDiSEqCFree(bTunerIndex) ;*/
for ( ii = 0; ii < 4; ii++ )
{
STV0299WaitDiSEqCFree(bTunerIndex);
bValue = pbUnCommittedCommand[ii];
STV0299WriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );
}
STV0299WaitDiSEqCFree(bTunerIndex);
if ((bRepeatTimes == 0))
{
CSSleep(40);
break;
}
else
{
//pbCommittedCommand[0] = 0xE1;
pbUnCommittedCommand[0] = 0xE1;
CSSleep(90);
bRepeatTimes--;
}
}
/*if ( CSDSCTBCommand ( bTunerIndex, bToneburst ) != CSQPSK_SUCCESS ) // 7"KMTone BurstC|An
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}*/
STV0299WaitDiSEqCFree(bTunerIndex);
CSSleep(40);
if (STV0299WriteReg ( bTunerIndex, STV0299REG_DiSEqC, &bPreF22KStatus, 1 ) != CSQPSK_SUCCESS)
{
CSI2CReleaseBus_inner(bTunerIndex);
return CSQPSK_FAILURE;
}
CSI2CReleaseBus_inner(bTunerIndex);
// delay to ensure the signal is stable
CSSleep(20);
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][STV0299SendDiSEqC11Command]:\n========================================\n");
return CSQPSK_SUCCESS;
}
else
return CSQPSK_FAILURE;
}
long CalcDataTimeConstant(int errorrate, int sn, int to, int hy, long BAUD)
{
long Tviterbi = 0 ,
TimeOut = 0 ,
THysteresis = 0 ,
PhaseNumber[5] = {2,6,4,6,8} ,
averaging[4] = {1024L , 4096L , 16384L , 65536L} ,
InnerCode = 1000 ,
HigherRate = 1000 ;
int i ;
if(BAUD == 0)
return 100;
/* Data capture time (msec)*/
/*This time is due to the Viterbi synchronisation .*/
for(i=0 ; i<5 ; i++)
{
if(((errorrate>>i)&0x01) == 0x01)
{
switch(i)
{
case 0 :/*inner code = 1/2*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -