mt313drv.c
来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 2,160 行 · 第 1/5 页
C
2,160 行
TimeOut = (int)((HigherRate*16386L*(to + 1))/(2*BAUD*1000)) ;
/*Hysteresis duration*/
THysteresis = (int)((HigherRate*26112L*(hy + 1))/(2*BAUD*1000)) ;/*26112 = 16*204*8 bits */
/*a guard time of 1 ms is added*/
return( 1 + Tviterbi + TimeOut + THysteresis ) ;
}
long CalcTimingTimeConstant(long BAUD)
{
long TConstant ;
if (BAUD == 0)
return 20;
TConstant = 400000/BAUD ;//msec 000125:modified
return( TConstant ) ;
}
long CalcDerotTimeConstant(long BAUD)
{
long TConstant ;
if (BAUD == 0)
return 10;
TConstant = 200000/BAUD ;//msec
if(TConstant<10)
TConstant=10;
return( TConstant ) ;
}
#endif
static CSQPSK_Error_t CSDSCTBCommand ( CSHDITunerIndex bTunerIndex, BYTE bTBSwitch )
{
BYTE bValue;
int ErrorCode;
bValue = 0;
if ( bTBSwitch == 0 )
{
ErrorCode = ZL1031XRdReg( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 );
bValue &= ~0x07;
bValue |= 2 ;
ErrorCode = ZL1031XWrtReg ( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 );
return ErrorCode;
}
else
{
ErrorCode = ZL1031XRdReg( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 );
bValue &= ~0x07;
bValue |= 3 ;
ErrorCode = ZL1031XWrtReg ( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 );
return ErrorCode;
}
}
CSQPSK_Error_t ZL1031XToneBurstCommandOnly (CSHDITunerIndex bTunerIndex, BYTE bToneBurstSel)
{
BYTE bValue;
BYTE bPreF22KStatus;
if (bToneBurstSel == 0)
return CSQPSK_SUCCESS;
if ( ZL1031XRdReg( bTunerIndex,ZL1031X_DISEQC_MODE, &bValue, 1 ) != CSQPSK_SUCCESS )
{
return CSQPSK_FAILURE;
}
bPreF22KStatus = bValue & 0x01;
if ( ZL1031X_F22K_Switch( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS )
{
return CSQPSK_FAILURE;
}
CSSleep(25);
if (CSDSCTBCommand(bTunerIndex, bToneBurstSel-1) != CSQPSK_SUCCESS)
{
return CSQPSK_FAILURE;
}
CSSleep(40);
if (ZL1031XRdReg ( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 ) != CSQPSK_SUCCESS)
{
return CSQPSK_FAILURE;
}
bValue |= bPreF22KStatus;
if (ZL1031XWrtReg( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 ) != CSQPSK_SUCCESS)
{
return CSQPSK_FAILURE;
}
return CSQPSK_SUCCESS;
}
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;
BYTE temp;
BYTE bpre22k;
//CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqCCommand]:\n=========Enter ZL1031XSendDiSEqCCommand=============");
ZL1031XRdReg(bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
bpre22k = temp & (0x07);
ZL1031X_F22K_Switch (bTunerIndex, CSHDI_OFF);
for ( ii = 0; ii < nCommandNum; ii++ )
{
bValue = *pbValue++;
ZL1031XWrtReg(bTunerIndex, ZL1031X_DISEQC_INSTR, &bValue, 1);
}
ZL1031XRdReg(bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
temp |= 4;
temp |= (nCommandNum - 1) << 3;
ZL1031XWrtReg ( bTunerIndex,ZL1031X_DISEQC_MODE, &temp, 1);
CSSleep(200);
ZL1031XRdReg(bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
temp &= ~0x07;
temp |= bpre22k;
ZL1031XWrtReg ( bTunerIndex,ZL1031X_DISEQC_MODE, &temp, 1);
// CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqCCommand]:\n========================================\n");
return CSQPSK_SUCCESS;
}
CSQPSK_Error_t ZL1031XSendOptionCommand(CSHDITunerIndex bTunerIndex, BYTE ucOptionSwitch)
{
int nOptionSwitch;
BYTE aucDiseqcCommand[4];
CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendOptionCommand]:\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)
{
ZL1031XSendDiSEqCCommand(bTunerIndex, aucDiseqcCommand, 3);
CSSleep(100);
}
}
CSQPSK_Error_t ZL1031XSendDiSEqC10Command (CSHDITunerIndex bTunerIndex, BYTE bSwitchType, BYTE bCommittedByte, BYTE bToneBurstSel, BYTE bRepeat)
{
BYTE bPreF22KStatus;
BYTE bRepeatTimes;
BYTE pbcommited[4];
BYTE pbUncommited[4];
BYTE pbUnCommittedCommand[4];
BYTE bToneburst;
BYTE bValue;
BYTE temp;
int ii;
BYTE bpre22k;
//USPPrint(ERROR_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC10Command]:\n=========Enter ZL1031XSendDiSEqC10Command=============");
//USPPrint( ERROR_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC10Command]:\n bSwitchType = %d, bCommittedByte = 0x%x, bToneBurstSel = %d",bSwitchType,bCommittedByte,bToneBurstSel);
/*1.0*/
bRepeatTimes = bRepeat;
pbcommited[0] = 0xE0;
pbcommited[1] = 0x10;
pbcommited[2] = 0x38;
pbcommited[3] = bCommittedByte;
/*for 1.1*/
/*
pbUncommited [0] = 0xE0;
pbUncommited[1] = 0x10;
pbUncommited[2] = 0x39;
pbUncommited[3] = bUnCommittedByte;*/
/*
if ((1 == bSwitchType) || (4 == bSwitchType))
{
pbcommited[2] = 0x39;
}*/
ZL1031XRdReg(bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
bpre22k = temp & (0x07);
//CSTRACE(ERROR_LEVEL,"[hdi][qpsk] temp bpre22k 1111111111111= %d, %d\n", temp, bpre22k);
ZL1031X_F22K_Switch (bTunerIndex, CSHDI_OFF);
while ( TRUE )
{
for ( ii = 0; ii < 4; ii++ )
{
bValue = pbcommited[ii];
ZL1031XWrtReg ( bTunerIndex, ZL1031X_DISEQC_INSTR, &bValue, 1 );
}
temp &= (~0x3f);/*clear*/
temp |= 0x1c;/*set mode and length after data send in fifo*/
ZL1031XWrtReg ( bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
CSSleep(50);
/*
if ((3 == bSwitchType) || (4 == bSwitchType))
{
// USPPrint(ERROR_LEVEL, "\n&&&&&&&&&&&&&&&&\r\n");
ZL1031XToneBurstCommandOnly (bTunerIndex, bToneBurstSel);
}*/
if (bRepeatTimes == 0)
{
CSSleep(100);/*延时不够会导致22k 切换的时候出现切换不了的现象*/
break;
}
else
{
CSSleep(130);
pbcommited[0] = 0xE1;
bRepeatTimes--;
}
}
ZL1031XRdReg(bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
temp &= ~0x07;
temp |= bpre22k;
ZL1031XWrtReg ( bTunerIndex,ZL1031X_DISEQC_MODE, &temp, 1);
CSSleep(20);
// CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC10Command]:\n=================================================\n");
return CSQPSK_SUCCESS;
}
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;
BYTE temp;
int ii;
// USPPrint( ERROR_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC11Command]:\n=========Enter ZL1031XSendDiSEqC11Command=============");
// USPPrint( ERROR_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC11Command]:\nbCommittedByte = 0x%x, bUnCommittedByte = 0x%x, bRepeat = %d",bCommittedByte,bUnCommittedByte,bRepeat);
//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;
if ( ZL1031XRdReg( bTunerIndex,ZL1031X_DISEQC_MODE, &bValue, 1 ) != CSQPSK_SUCCESS )
{
return CSQPSK_FAILURE;
}
bPreF22KStatus =bValue & (0x07);///22k off
if ( ZL1031X_F22K_Switch( bTunerIndex, CSHDI_OFF ) != CSQPSK_SUCCESS )
{
return CSQPSK_FAILURE;
}
while ( TRUE )
{
#if 0
for ( ii = 0; ii < 4; ii++ )
{
bValue = pbCommittedCommand[ii];
ZL1031XWrtReg( bTunerIndex, ZL1031X_DISEQC_INSTR, &bValue, 1 );
}
temp &= (~0x3f);/*clear*/
temp |= 0x1c;/*set mode and length after data send in fifo*/
ZL1031XWrtReg (bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
CSSleep(150);/*延时太短会影响到下一个命令*/
#endif
for ( ii = 0; ii < 4; ii++ )
{
bValue = pbUnCommittedCommand[ii];
ZL1031XWrtReg ( bTunerIndex, ZL1031X_DISEQC_INSTR, &bValue, 1 );
}
temp &= (~0x3f);/*clear*/
temp |= 0x1c;/*set mode and length after data send in fifo*/
ZL1031XWrtReg (bTunerIndex, ZL1031X_DISEQC_MODE, &temp, 1);
CSSleep(150);
if (bRepeat == 0)
{
CSSleep(40);
break;
}
else
{
//pbCommittedCommand[0] = 0xE1;
pbUnCommittedCommand[0] = 0xE1;
CSSleep(90);
bRepeat--;
}
}
ZL1031XRdReg( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 );
bValue &= (~0x07);
bValue |= bPreF22KStatus;
ZL1031XWrtReg ( bTunerIndex, ZL1031X_DISEQC_MODE, &bValue, 1 );
//CSI2CReleaseBus(bTunerIndex);
CSSleep(20);
//CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][ZL1031XSendDiSEqC11Command]:\n========================================\n");
return CSQPSK_SUCCESS;
}
CSQPSK_Error_t ZL1031XSetStandby( CSHDITunerIndex bTunerIndex, int nStandby )
{
BYTE bValue;
if(ZL1031XRdReg( bTunerIndex,ZL1031X_CONFIG, &bValue, 1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
if(nStandby)
bValue &= 0x7f;
else
bValue|=0x80;
return ZL1031XWrtReg( bTunerIndex,ZL1031X_CONFIG, &bValue, 1);
}
CSQPSK_Error_t ZL1031XSetClockPolarity( CSHDITunerIndex bTunerIndex, T_ClockPolarity clockPol )
{
BYTE bValue;
if (ZL1031XRdReg ( bTunerIndex,ZL1031X_OP_CTRL,&bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
bValue &=( ~ZL1031X_OP_CTRL_MOCLKINV);
if ( clockPol == LOW_TO_HIGH )
{
bValue |= ZL1031X_OP_CTRL_MOCLKINV;
}
return ZL1031XWrtReg ( bTunerIndex, ZL1031X_OP_CTRL, &bValue, 1);
}
CSQPSK_Error_t ZL1031XSetFECRates(CSHDITunerIndex bTunerIndex, CSQPSK_FECRates FECRates)
{
BYTE Data = 0;
BYTE bValue;
BYTE Data1;
if(ZL1031XRdReg(bTunerIndex, ZL1031X_VIT_MODE, &bValue, 1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
Data1 = bValue;
/*
** For each STTUNER FEC rates (see sttuner.h)
** Set specific bit of enable puncture rate register
** Bit 0 - 1/2, 1 - 2/3, 2 - 3/4, 3 - 5/6, 4 - 7/8(DVB) or 6/7(DSS)
*/
if (FECRates==FEC1_2) // 1/2
Data |= ZL1031X_VENRATE12;
if (FECRates==FEC2_3) // 2/3
Data |= ZL1031X_VENRATE23;
if (FECRates==FEC3_4) // 3/4
Data |= ZL1031X_VENRATE34;
if (FECRates==FEC5_6) // 5/6
Data |= ZL1031X_VENRATE56;
else
Data |= ZL1031X_VENRATE78;
//sttbx_Print("[ZL1031XSetFECRates]Data = 0x%x\n",Data);
return ZL1031XWrtReg(bTunerIndex, ZL1031X_VIT_MODE, &Data, 1);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?