mt313drv.c
来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 2,160 行 · 第 1/5 页
C
2,160 行
/* Reset the ADC */
if (ZL1031XRdReg ( bTunerIndex,ZL1031X_GPP,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
bValue[0] &=~ZL1031X_GPP_ADCRUN;
if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_GPP,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
//vDelay_time(500);
CSSleep(10);
/* release the ADC reset*/
bValue[0] =ZL1031X_GPP_ADCRUN | ZL1031X_GPP_DEFAULT;
if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_GPP,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/* trim ADC calibration for ZL10312 and ZL10313*/
bValue[0] =ZL31X_XTRA_ADCBYTEL_DEFAULT;
if (ZL1031x_WriteExtra ( bTunerIndex,ZL313_CTRL_SELEXTRA_ADCBL,bValue)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/* select the MPEG external clock pin to use*/
if (ZL1031x_ReadExtra(bTunerIndex, ZL313_CTRL_SELEXTRA_MPEG ,bValue)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/* select IRQ for MPEG clock input */
bValue[0] &= ~ZL313_XTRA_MPEG_USEIRQ ;
if (ZL1031x_WriteExtra(bTunerIndex,ZL313_CTRL_SELEXTRA_MPEG ,bValue)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/* set up the clock speed register= 2 *xtal*pll ratio*/
#if (ZL1031X_XTAL == XTALK10111KHZ)
bValue[0]= 0xb6;
#else
bValue[0]= 0xb4;
#endif
if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_SYS_CLK,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/*diseqc ratio = FxtalkHz/88 */
#if (ZL1031X_XTAL == XTALK10111KHZ)
bValue[0]= 0x73;
#else
bValue[0]= 0x72;
#endif
if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_DISEQC_RATIO,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/*set up receiver tuner i/q swap and ROLL_20 bits*/
if (ZL1031XRdReg ( bTunerIndex,ZL1031X_QPSK_CTRL,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
bValue[0]&= ~ZL1031X_QPSK_CTRL_ROLL20;
if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_QPSK_CTRL,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
//Zl10039_Initialise(bTunerIndex);
/* change some defaults */
bValue[0]= ZL1031X_SNR_THS_HIGH_DEFAULT;
if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_SNR_THS_HIGH,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
bValue[0]= ZL1031X_CW_SW_RATE_3_DEFAULT;
if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_CS_SW_RATE_3,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/* set up the mpeg output control register 0x60 OP_CTRL*/
if (ZL1031XRdReg ( bTunerIndex,ZL1031X_OP_CTRL,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
bValue[0] &= ~(ZL1031X_OP_CTRL_BKERRINV|ZL1031X_OP_CTRL_MOCLKINV|ZL1031X_OP_CTRL_TEIMPEG|ZL1031X_OP_CTRL_BSO);
#if 1//(ZLX_MPEG_SERIAL)
if (TS_SERIAL ==(BYTE) nTSOutMode ||g_nTSOutputMode[bTunerIndex]==TS_SERIAL)
bValue[0] |= ZL1031X_OP_CTRL_BSO;
#endif
#if (ZLX_TEI_IN_MEG)
bValue[0] |= ZL1031X_OP_CTRL_TEIMPEG;
#endif
#if (ZLX_MOCLK_INV)
bValue[0] |= ZL1031X_OP_CTRL_MOCLKINV;
#endif
#if (ZLX_BKERR_INV)
bValue[0] |= ZL1031X_OP_CTRL_BKERRINV;
#endif
if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_OP_CTRL,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/* error indicator control b7 in Monitor control*/
if (ZL1031XRdReg ( bTunerIndex,ZL1031X_MON_CTRL,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
bValue[0] &=~ZL1031X_MON_CTRL_ERRNOSIG;
#if (ZLX_BKERR_NOSIG)
bValue[0] |= ZL1031X_MON_CTRL_ERRNOSIG;
#endif
bValue[0] |= 0x05;//add by th for test
if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_MON_CTRL,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/*set coderate & IQ search to auto (all bits =1)*/
bValue[0] = 0xBF;
if (ZL1031XWrtReg ( bTunerIndex,ZL1031X_VIT_MODE,bValue,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
bValue[0] = 0x44; // IQ swap
if ( ZL1031XWrtReg ( bTunerIndex,ZL1031X_QPSK_CTRL, bValue, 1 ) !=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
return CSQPSK_SUCCESS;
}
CSQPSK_Error_t ZL1031XGetLockStatus ( CSHDITunerIndex bTunerIndex, int *pnLockStatus )
{
BYTE bValue, bTemp;
int nStatus = ALLLOST;
int ErrorCode=CSQPSK_SUCCESS;
int ii;
BYTE szBuffer[3]={0,0,0};
for(ii=0; ii<5; ii++)
{
ErrorCode = ZL1031XRdReg(bTunerIndex, ZL1031X_STATUS,szBuffer,3);
if ( ErrorCode == CSQPSK_SUCCESS )
break;
CSSleep(10);
}
//CSTRACE(ERROR_LEVEL,"[hdi][qpsk] ZL1031X_STATUS : 0x%x,0x%x, 0x%x \n",szBuffer[0],szBuffer[1],szBuffer[2]);
if(((szBuffer[0]&0x17)==0x17) && ((szBuffer[2]&0x0c)==0x0c))
{
nStatus = TP_LOCK;
}
else if(szBuffer[0]&0x04)
nStatus = CFOUND;
else if(szBuffer[0]&0x08)
nStatus = TIMINGOK;
*pnLockStatus = nStatus;
return ErrorCode;
}
#if 0
CSQPSK_Error_t ZL1031XCheckLockStatus ( CSHDITunerIndex bTunerIndex, int *pnLockStatus )
{
int nReturn;
int nStatus;
nReturn = ZL1031XGetLockStatus (bTunerIndex, &nStatus);
//*pnLockStatus = FALSE;
if ( nReturn == CSQPSK_SUCCESS )
{
if (TP_LOCK == nStatus)
{
*pnLockStatus = TRUE;
}
else
{
*pnLockStatus = FALSE;
}
}
// else
// *pnLockStatus = FALSE;
// CSTRACE(ERROR_LEVEL,"[hdi][qpsk] ZL1031XCheckLockStatus : 0x%x\n",*pnLockStatus);
return nReturn;
}
#else
CSQPSK_Error_t ZL1031XCheckLockStatus ( CSHDITunerIndex bTunerIndex, int *pnLockStatus )
{
int nReturn;
int nStatus;
BYTE szBuffer[3]={0,0,0};
int i;
*pnLockStatus = FALSE;
//vDisplay_Reg_Value( bTunerIndex);
for(i=0;i<5;i++)
{
nReturn = ZL1031XRdReg(bTunerIndex, ZL1031X_STATUS,szBuffer,3);
if ( nReturn == CSQPSK_SUCCESS )
{
if(((szBuffer[0]&0x17)==0x17) &&( (szBuffer[2]&0x0c)==0x0c))
{
*pnLockStatus = TRUE;
break;
}
else
{
//*pnLockStatus = FALSE;
CSSleep(5);
}
}
else
//*pnLockStatus = FALSE;
CSSleep(5);
}
// CSTRACE(ERROR_LEVEL,"[hdi][qpsk] ZL1031XCheckLockStatus : 0x%x\n",*pnLockStatus);
return nReturn;
}
#endif
/* +==========================================================================+ */
/* | Function: IQ;%;; | */
/* | Input: N^
* | Output: N^ | */
/* | Return: 3I9&1jV> | */
/* +==========================================================================+ */
CSQPSK_Error_t ZL1031XSwapIQ ( CSHDITunerIndex bTunerIndex )
{
BYTE bValue;
int ErrorCode;
#if 0
ErrorCode = ZL1031XRdReg ( bTunerIndex, ZL1031X_VIT_MODE, &bValue, 1 );
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
bValue |= 0x40;
return ( ZL1031XWrtReg ( bTunerIndex,ZL1031X_VIT_MODE, &bValue, 1 ) );
#else
ErrorCode = ZL1031XRdReg ( bTunerIndex, ZL1031X_QPSK_CTRL, &bValue, 1 );
//if ( ErrorCode != CSQPSK_SUCCESS )
// return ErrorCode;
bValue |= 0x40;
return ( ZL1031XWrtReg ( bTunerIndex,ZL1031X_QPSK_CTRL, &bValue, 1 ) );
#endif
}
/* +==========================================================================+ */
/* | Function: IhVC Link IC 5D7{:EBJ<D4fFw | */
/* | Input: 7{:EBJ(KbpsN*5%N;) | */
/* | Output: N^ | */
/* | Return: 2YWw3I9&1jV> | */
/* +==========================================================================+ */
CSQPSK_Error_t ZL1031XSetSRate ( CSHDITunerIndex bTunerIndex, DWORD dwSymbolRate,Scan_Mode mode )
{
DWORD dwSRate;
BYTE bValue[4];
int ErrorCode=0;
if(mode==AUTO_BLIND_SCAN)
{
bValue[0]=0xcf;
bValue[1]=0xff;
if( ZL1031XWrtReg ( bTunerIndex,ZL1031X_SYM_RATE, bValue, 2 ) !=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
return CSQPSK_SUCCESS;
}
else
{
if(dwSymbolRate>45000)
dwSymbolRate=45000;
dwSRate=dwSymbolRate*256+500;
dwSRate/=1000;
bValue[0]=(BYTE)(dwSRate>>8)&0xff;
bValue[1]=(BYTE)dwSRate&0xff;
}
if( ZL1031XWrtReg ( bTunerIndex,ZL1031X_SYM_RATE, bValue, 2 ) !=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
if(ZL1031XRdReg( bTunerIndex, ZL1031X_QPSK_CTRL, bValue, 1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
bValue[0]&= ~(ZL1031X_QPSK_CTRL_AFC | ZL1031X_QPSK_CTRL_FSCAN);
if (dwSymbolRate < 10000)
{ /*Set AFC bit if required*/
bValue[0] |= ZL1031X_QPSK_CTRL_AFC;
}
if(ZL1031XWrtReg( bTunerIndex, ZL1031X_QPSK_CTRL, bValue, 1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
return CSQPSK_SUCCESS;
}
CSQPSK_Error_t ZL1031XGetSRate ( CSHDITunerIndex bTunerIndex, DWORD *pdwSymbolRate_k )
{
BYTE bValue[2];
DWORD dwSRate;
if( ZL1031XRdReg ( bTunerIndex,ZL1031X_SYM_RATE, bValue, 2 ) !=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
dwSRate=bValue[0];
dwSRate <<= 8;
dwSRate |= bValue[1];
*pdwSymbolRate_k = dwSRate*1000/256;
return CSQPSK_SUCCESS;
}
/* +==========================================================================+ */
/* | Function: ;qH!PE:EVJA? | */
/* | Input: N^ | */
/* | Output: N^ | */
/* | Return: PE:EVJA?0-255V.<d (J}V5T=4s, PE:EVJA?T=:C) | */
/* +==========================================================================+ */
CSQPSK_Error_t ZL1031XSignalQuality(CSHDITunerIndex bTunerIndex, int *pnSignalQuality )
{
BYTE bSNR[2];
WORD wTmp;
DWORD dwQPSK_EbNo;
int nLockStatus;
int ErrorCode;
ErrorCode = ZL1031XGetLockStatus(bTunerIndex,&nLockStatus);
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
if ( nLockStatus!= TP_LOCK )
{
dwQPSK_EbNo = 0;
}
else
{
ErrorCode = ZL1031XRdReg ( bTunerIndex,ZL1031X_M_SNR, bSNR, 2 );
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
wTmp = bSNR[0];
wTmp = ((wTmp<<8)&0x7f00)|bSNR[1];
dwQPSK_EbNo=(DWORD)((13312-wTmp)*10/683)*10;
dwQPSK_EbNo/=10;
if(dwQPSK_EbNo>99)dwQPSK_EbNo=99;
}
*pnSignalQuality = dwQPSK_EbNo;
return CSQPSK_SUCCESS;
}
/* +==========================================================================+ */
/* | Function: ;qH!PE:EG?6H ( 4}5wJT ) | */
/* | Input: N^ | */
/* | Output: N^ | */
/* | Return: PE:EG?6H0-255V.<d (J}V5T=4s, PE:EG?6HT=4s) | */
/* +==========================================================================+ */
CSQPSK_Error_t ZL1031XSignalStrength ( CSHDITunerIndex bTunerIndex, int *pnSignalStrength )
{
BYTE bSR[2];
int nLevel;
int ErrorCode;
int nLockStatus;
int wTmp;
ErrorCode = ZL1031XGetLockStatus(bTunerIndex,&nLockStatus);
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
/*
if ( nLockStatus!= TP_LOCK )
{
*pnSignalStrength = 0;
}
else*/ /*del by th 061228*/
{
ErrorCode = ZL1031XRdReg ( bTunerIndex, ZL1031X_AGC, bSR, 2 );
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
wTmp = bSR[0];
wTmp <<= 8;
wTmp |= bSR[1];
wTmp >>= 2;
nLevel=100*wTmp/0x3fff;
//*pnSignalStrength = 100*( nLevel + 128 ) / 224;
*pnSignalStrength = nLevel;
}
return CSQPSK_SUCCESS;
}
BOOL ZL1031x_SetFsmGo(CSHDITunerIndex bTunerIndex)
{
BYTE buffer;
buffer = 1;
if( ZL1031XWrtReg(bTunerIndex, ZL1031X_GO, &buffer,1)!=CSQPSK_SUCCESS)
return FALSE;
return TRUE;
}
CSQPSK_Error_t ZL1031x_ProgramTuner(CSHDITunerIndex bTunerIndex,DWORD uFreqKhz, DWORD uRsKhz)
{
DWORD dwFreqMHz;
BYTE ucRs; /* default rs for scanning*/
BYTE ucExt = 0;
dwFreqMHz = uFreqKhz/1000;
/* trim frequency limits */
if (uRsKhz)
ucRs = (BYTE) (uRsKhz/1000);
else
ucRs = 255; /* scanning */
return ZL1003zSetFrequency(bTunerIndex,uFreqKhz, ucRs);
}
void vDisplay_Reg_Value(CSHDITunerIndex bTunerIndex)
{
BYTE i;
BYTE szBuffer[4];
for(i=0;i<0x80;i++)
{
if(ZL1031XRdReg(bTunerIndex, i,szBuffer,1)!=CSQPSK_SUCCESS)
CSTRACE(ERROR_LEVEL,"[qpsk] i2c read error \n");
CSTRACE(ERROR_LEVEL,"[%02x]%02x ", i,szBuffer[0]);
if((i+1)%0x10==0)
CSTRACE(ERROR_LEVEL,"\n");
}
CSTRACE(ERROR_LEVEL,"\n");
}
CSQPSK_Error_t ZL1031XLockChannel(CSHDITunerIndex bTunerIndex, CSQPSKCHANNEL *pCHPara)
{
BYTE ucBuffer;
BYTE szSymRate[3];
DWORD dwTemp;
int lock_flag = FALSE;
BYTE ucFreqLimit;
int nSearchCnt;
BYTE szBuffer[3]={0,0,0};
int nLoopCnt = 0;
BYTE ucAdjFreqLimit;
/* check symbol rate and frequency are within sensible values (1 to 45 MBd, 950 to lnblo+2150MHz*/
if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate< 990|| pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate > 45450)
{
CSTRACE(ERROR_LEVEL,"[hdi][qpsk] input channel paramater error \n");
ZL1031x_ProgramTuner(bTunerIndex, 950000, 27500);/*modify by th on070126*//*去锁一个锁不住的频点*/
return /*CSQPSK_INVALID_PARAM*/CSQPSK_FAILURE;/*modify by th on070115*/
}
if (pCHPara->m_CHANNEL.m_dwChannelFrequency< (ZL1031X_MIN_FREQ - 5000) || pCHPara->m_CHANNEL.m_dwChannelFrequency > (ZL1031X_MAX_FREQ + 5000))
{
CSTRACE(ERROR_LEVEL,"[hdi][qpsk] input channel paramater error \n");
ZL1031x_ProgramTuner(bTunerIndex, 950000, 27500);/*modify by th on070126*//*去锁一个锁不住的频点*/
return /*CSQPSK_INVALID_PARAM*/CSQPSK_FAILURE;/*modify by th on070115*/
}
/* program the tuner */
if(ZL1031x_ProgramTuner(bTunerIndex,pCHPara->m_CHANNEL.m_dwChannelFrequency, pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate)!=CSQPSK_SUCCESS)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?