mt313drv.c
来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 2,160 行 · 第 1/5 页
C
2,160 行
ErrorCode = ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqC, &bValue, 1 );
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
bValue = 0xFF;
return ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );
}
}
CSQPSK_Error_t CSToneBurstCommandOnly (CSHDITunerIndex bTunerIndex, BYTE bToneBurstSel)
{
//sfg int nReturn = CSQPSK_SUCCESS;
BYTE bValue;
BYTE bPreF22KStatus;
if (bToneBurstSel == 0)
return CSQPSK_SUCCESS;
if ( CSI2CRequestBus(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
{
ZL1031XWaitDiSEqCFree(bTunerIndex);
if ( ZL1031XReadReg ( bTunerIndex,STV0299REG_DiSEqC, &bValue, 1 ) != CSQPSK_SUCCESS )
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
bPreF22KStatus = bValue & DiSEqCMODE_MASK; // 5C5=22KW4L,#,1cSZRT:s;V84!#
if ( DiSEqCF22KSwitch ( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS ) // 9X22KJd3v!#
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
CSSleep(25);
if (CSDSCTBCommand(bTunerIndex, bToneBurstSel-1) != CSQPSK_SUCCESS)
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
ZL1031XWaitDiSEqCFree(bTunerIndex);
CSSleep(40);
if (ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqC, &bPreF22KStatus, 1 ) != CSQPSK_SUCCESS)
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_SUCCESS;
}
else
return CSQPSK_FAILURE;
}
void CSSetConfigASIInSel ( CSHDITunerIndex bTunerIndex, int nASIInSel, int nASIStatusPin)
{
g_nASIInSelect[bTunerIndex] = nASIInSel ;
g_nASIStatusPin[bTunerIndex] = nASIStatusPin ;
// ZL1031XRegInit() ;
}
/* +==========================================================================+ */
/* | Function: 5C5=DiSEqC FIFO W4L, | */
/* +==========================================================================+ */
static CSQPSK_Error_t CSDSCGetStatus ( CSHDITunerIndex bTunerIndex, int *pnDSCStatus )
{
BYTE bValue[4];
int ErrorCode;
ErrorCode = ZL1031XReadReg ( 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 ZL1031XWaitDiSEqCFree (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 ZL1031XWaitDiSEqCFree TimeOut\n");
CSTRACE( ERROR_LEVEL, "Position:file = %s,line = %s\n", __FILE__, __LINE__);
return CSQPSK_FAILURE;
}
else
return CSQPSK_SUCCESS;
}
CSQPSK_Error_t ZL1031XSendDiSEqCCommand (CSHDITunerIndex bTunerIndex, PBYTE pbValue, int nCommandNum)
{
BYTE bPreF22KStatus;
BYTE bValue;
int ii;
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqCCommand]:\n=========Enter ZL1031XSendDiSEqCCommand=============");
if ( CSI2CRequestBus(bTunerIndex, CSHDI_TIMEOUT_INFINITY) == CSI2C_SUCCESS )
{
ZL1031XWaitDiSEqCFree(bTunerIndex);
if ( ZL1031XReadReg ( bTunerIndex,STV0299REG_DiSEqC, &bValue, 1 ) != CSQPSK_SUCCESS )
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
bPreF22KStatus = bValue & DiSEqCMODE_MASK; // 5C5=22KW4L,#,1cSZRT:s;V84!#
if ( DiSEqCF22KSwitch ( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS ) // 9X22KJd3v!#
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
CSSleep(25);
if ( CSDSCActive (bTunerIndex) != CSQPSK_SUCCESS) // =xHkDiSEqCD#J=
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
for ( ii = 0; ii < nCommandNum; ii++ )
{
ZL1031XWaitDiSEqCFree(bTunerIndex);
bValue = *pbValue++;
ZL1031XWriteReg ( bTunerIndex,STV0299REG_DiSEqCFIFO, &bValue, 1 );
}
ZL1031XWaitDiSEqCFree(bTunerIndex);
CSSleep(40);
if (ZL1031XWriteReg ( bTunerIndex,STV0299REG_DiSEqC, &bPreF22KStatus, 1 ) != CSQPSK_SUCCESS)
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
CSI2CReleaseBus(bTunerIndex);
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqCCommand]:\n========================================\n");
return CSQPSK_SUCCESS;
}
else
return CSQPSK_FAILURE;
}
CSQPSK_Error_t ZL1031XSendDiSEqC10Command (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][ZL1031XSendDiSEqC10Command]:\n=========Enter ZL1031XSendDiSEqC10Command=============");
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC10Command]:\n bSwitchType = %d, bCommittedByte = 0x%x, bToneBurstSel = %d",bSwitchType,bCommittedByte,bToneBurstSel);
if ( CSI2CRequestBus(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;
}
ZL1031XWaitDiSEqCFree(bTunerIndex);
if ( ZL1031XReadReg ( bTunerIndex,STV0299REG_DiSEqC, &bValue, 1 ) != CSQPSK_SUCCESS )
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
bPreF22KStatus = bValue & DiSEqCMODE_MASK; // 5C5=22KW4L,#,1cSZRT:s;V84!#
if ( DiSEqCF22KSwitch ( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS ) // 9X22KJd3v!#
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
CSSleep(25);
if ( CSDSCActive (bTunerIndex) != CSQPSK_SUCCESS) // =xHkDiSEqCD#J=
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
while ( TRUE )
{
for ( ii = 0; ii < 4; ii++ )
{
ZL1031XWaitDiSEqCFree(bTunerIndex);
bValue = pbValue[ii];
ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );
}
ZL1031XWaitDiSEqCFree(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;
}
}
ZL1031XWaitDiSEqCFree(bTunerIndex);
CSSleep(40);
// sttbx_Print("\nF22KStatus = 0x%x", bPreF22KStatus);
if (ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqC, &bPreF22KStatus, 1 ) != CSQPSK_SUCCESS)
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
CSI2CReleaseBus(bTunerIndex);
// delay to ensure the signal is stable
CSSleep(20);
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC10Command]:\n=================================================\n");
return CSQPSK_SUCCESS;
}
else
return CSQPSK_FAILURE;
}
CSQPSK_Error_t ZL1031XSendDiSEqC11Command (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][ZL1031XSendDiSEqC11Command]:\n=========Enter ZL1031XSendDiSEqC11Command=============");
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC11Command]:\nbCommittedByte = 0x%x, bUnCommittedByte = 0x%x, bRepeat = %d",bCommittedByte,bUnCommittedByte,bRepeat);
if ( CSI2CRequestBus(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;
ZL1031XWaitDiSEqCFree(bTunerIndex);
if ( ZL1031XReadReg ( bTunerIndex,STV0299REG_DiSEqC, &bValue, 1 ) != CSQPSK_SUCCESS )
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
bPreF22KStatus = bValue & DiSEqCMODE_MASK; // 5C5=22KW4L,#,1cSZRT:s;V84!#
if ( DiSEqCF22KSwitch ( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS ) // 9X22KJd3v!#
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
CSSleep(40);
if ( CSDSCActive (bTunerIndex) != CSQPSK_SUCCESS) // =xHkDiSEqCD#J=
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
while ( TRUE )
{
for ( ii = 0; ii < 4; ii++ )
{
ZL1031XWaitDiSEqCFree(bTunerIndex);
bValue = pbCommittedCommand[ii];
ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );
}
ZL1031XWaitDiSEqCFree(bTunerIndex) ;
if ((bRepeatTimes == 0) && (bRepeat >0))
{
CSSleep(40);
break;
}
CSSleep(50);
for ( ii = 0; ii < 4; ii++ )
{
ZL1031XWaitDiSEqCFree(bTunerIndex);
bValue = pbUnCommittedCommand[ii];
ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );
}
ZL1031XWaitDiSEqCFree(bTunerIndex);
if (bRepeat == 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;
}
ZL1031XWaitDiSEqCFree(bTunerIndex);
CSSleep(40);
if (ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqC, &bPreF22KStatus, 1 ) != CSQPSK_SUCCESS)
{
CSI2CReleaseBus(bTunerIndex);
return CSQPSK_FAILURE;
}
CSI2CReleaseBus(bTunerIndex);
// delay to ensure the signal is stable
CSSleep(20);
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC11Command]:\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*/
InnerCode = 2000 ;
break ;
case 1 :/*inner code = 2/3*/
InnerCode = 1500 ;
break ;
case 2 :/*inner code = 3/4*/
InnerCode = 1333 ;
break ;
case 3 :/*inner code = 5/6*/
InnerCode = 1200 ;
break ;
case 4 :/*inner code = 7/8*/
InnerCode = 1143 ;
break ;
}//switch(i)
Tviterbi += (int)((PhaseNumber[i]*averaging[sn]*InnerCode)/(BAUD*1000)) ;
if(HigherRate < InnerCode)
HigherRate = InnerCode ;
}//if er
}//for i=0乣4
/*time out calculation(TimeOut)*/
/*This value indicates the maximum duration of synchro word research .*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?