mt313drv.c
来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 2,160 行 · 第 1/5 页
C
2,160 行
return CSQPSK_FAILURE;
#if USE_MAX_BANDWIDTH
ucBuffer = ZL1031X_UNLOCKED_BANDWIDTH;
#else
ucBuffer = pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate/1000;
#endif
if(ZL1003zSetBandwidth(bTunerIndex,ucBuffer)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/*Select LNB band according to frequency and LNB data*/
/*Polarisation */
/*Satellite*/
/* set code rate search start*/
ucBuffer = 0xff; // IQ SWAP
if(ZL1031XWrtReg(bTunerIndex, ZL1031X_VIT_MODE,&ucBuffer,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
ucBuffer = 0x14;
if(ZL1031XWrtReg(bTunerIndex, ZL1031X_VIT_SETUP,&ucBuffer,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
//ZL1031XSwapIQ(bTunerIndex);
/* program symbol rate */
if(ZL1031XSetSRate(bTunerIndex,pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate,CHANNEL_ACQUIRE)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 5000) //5Msps
{
// ZL10039 Datasheet said no freq offset allowed when SR less than 10MSps
ucFreqLimit = 20; // 2.5M BW
}
else if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 10000) //10Msps
{
ucFreqLimit = 28; // 3.5M BW
}
else
{
ucFreqLimit =ZL1031X_FR_LIM_ACQ; // 6M BW
}
/* set frequency search range and centralise it*/
if(ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_LIM, &ucFreqLimit,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
ucBuffer = ZL1031X_FR_OFF_CENTRED;
if (ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_OFF, &ucBuffer,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
LOOP:
if( !ZL1031x_SetFsmGo(bTunerIndex)) return CSQPSK_FAILURE;
if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 12000)
{
nSearchCnt = 10;
}
else
{
nSearchCnt = 8;
}
do
{
if ( CSQPSK_DROPPED == CSQPSKSleep(bTunerIndex,100) )
{
CSTRACE(ERROR_LEVEL,"[qpsk] CSQPSK_DROPPED\n");
return CSQPSK_DROPPED;
}
ZL1031XRdReg(bTunerIndex, ZL1031X_STATUS,szBuffer,3);
if(((szBuffer[0]&0x17)==0x17) &&( (szBuffer[2]&0x0c)==0x0c))
{
return CSQPSK_SUCCESS;
}
}while (--nSearchCnt);
if ((pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 10000) && (nLoopCnt == 0))
{
ucAdjFreqLimit = ucFreqLimit + 8; // +1M BW
ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_LIM, &ucAdjFreqLimit,1);
ucBuffer = ZL1031X_FR_OFF_CENTRED;
ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_OFF, &ucBuffer,1);
nLoopCnt++;
//USPPrint(8, "[MT313]### Increase the search range and try again!!!\r\n");
goto LOOP;
}
return CSQPSK_FAILURE;
}
#if 0
CSQPSK_Error_t ZL1031XLockChannel(CSHDITunerIndex bTunerIndex, CSQPSKCHANNEL *pCHPara)
{
BYTE ucBuffer;
BYTE szSymRate[3];
DWORD dwTemp;
int lock_flag;
BYTE szBuffer[3]={0,0,0};
int search_cnt;
int nReturn;
int nFreqLimit;
int nAdjFreqLimit;
int nLoopCnt = 0;
int nAutoFEC = 0;
BYTE ucFECRate = 0;
int i;
/* 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);
return CSQPSK_FAILURE;
}
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);
return CSQPSK_FAILURE;
}
if(ZL1031x_ProgramTuner(bTunerIndex,pCHPara->m_CHANNEL.m_dwChannelFrequency, pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
#if USE_MAX_BANDWIDTH
ucBuffer = ZL1031X_UNLOCKED_BANDWIDTH;
#else
ucBuffer = pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate/1000;
#endif
if(ZL1003zSetBandwidth(bTunerIndex,ucBuffer)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/*Select LNB band according to frequency and LNB data*/
/*Polarisation */
/*Satellite*/
/* set code rate search start*/
ucFECRate = 0xC0; // Automatic spectral inversion
USPPrint(8, "[MT313]FEC %d, ",pCHPara->m_bFECRates);
switch (pCHPara->m_bFECRates)
{
case FEC1_2:
ucFECRate |= 0x01;
ucBuffer = 0x10;
USPPrint(8, "FEC1_2\r\n");
break;
case FEC2_3:
ucFECRate |= 0x02;
ucBuffer = 0x12;
USPPrint(8, "FEC2_3\r\n");
break;
case FEC3_4:
ucFECRate |= 0x04;
ucBuffer = 0x14;
USPPrint(8, "FEC3_4\r\n");
break;
case FEC5_6:
ucFECRate |= 0x08;
ucBuffer = 0x16;
USPPrint(8, "FEC5_6\r\n");
break;
case FEC7_8:
ucFECRate |= 0x20;
ucBuffer = 0x1A;
USPPrint(8, "FEC7_8\r\n");
break;
default:
ucFECRate = 0xFF;
ucBuffer = 0x14;
nAutoFEC = 1;
USPPrint(8, "FEC AUTO\r\n");
break;
}
if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate > 10000)
{
ucFECRate = 0xFF;
nAutoFEC = 1;
USPPrint(8, "[MT313]SymbolRate>10MSps, FEC AUTO\r\n");
}
if(ZL1031XWrtReg(bTunerIndex, ZL1031X_VIT_MODE,&ucFECRate,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
if(ZL1031XWrtReg(bTunerIndex, ZL1031X_VIT_SETUP,&ucBuffer,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
//ZL1031XSwapIQ(bTunerIndex);
/* program symbol rate */
if(ZL1031XSetSRate(bTunerIndex,pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate,CHANNEL_ACQUIRE)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/*设置载波恢复的范围*/
/* set frequency search range and centralise it*/
if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 5000) //5Msps
{
// ZL10039 Datasheet said no freq offset allowed when SR less than 10MSps
nFreqLimit = 20; // 2.5M BW
}
else if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 10000) //10Msps
{
nFreqLimit = 28; // 3.5M BW
}
else
{
nFreqLimit =ZL1031X_FR_LIM_ACQ; // 6M BW
}
/* [(-FR_LIM + FR_OFF), (FR_LIM + FR_OFF)]*/
if(ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_LIM, &nFreqLimit,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
ucBuffer = ZL1031X_FR_OFF_CENTRED;
if (ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_OFF, &ucBuffer,1)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
/* program the tuner , moved to the begining of channel search*/
#if 0
if(ZL1031x_ProgramTuner(bTunerIndex,pCHPara->m_CHANNEL.m_dwChannelFrequency, pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
#if USE_MAX_BANDWIDTH
ucBuffer = ZL1031X_UNLOCKED_BANDWIDTH;
#else
ucBuffer = pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate/1000;
#endif
if(ZL1003zSetBandwidth(bTunerIndex,ucBuffer)!=CSQPSK_SUCCESS)
return CSQPSK_FAILURE;
#endif
LOOP:
if( !ZL1031x_SetFsmGo(bTunerIndex)) return CSQPSK_FAILURE;
if (nAutoFEC == 0)
{
search_cnt = 6;
}
else
{
if (pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 12000)
{
search_cnt = 10;
}
else
{
search_cnt = 8;
}
}
for (i=0; i<search_cnt; i++)
{
int cr;
if ( CSQPSKSleep(bTunerIndex, 100) == CSQPSK_DROPPED)
{
CSTRACE(3, "QUICKEXIT\n");
return CSQPSK_DROPPED;
}
ZL1031XRdReg(bTunerIndex, ZL1031X_STATUS,szBuffer,3);
if(((szBuffer[0]&0x17)==0x17) &&( (szBuffer[2]&0x0c)==0x0c))
{
int sr;
int sr_offset;
//sr = get_sr();
sr_offset = sr - pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate;
if (sr_offset < 0)
{
sr_offset = -sr_offset;
}
cr = (szBuffer[2]>>4)&0x07;
if (cr > 2)
cr++;
//USPPrint(8, "[MT313]Signal Locked at i=%d, Status(0x%x, 0x%x, 0x%x)\r\n", i, szBuffer[0],szBuffer[1],szBuffer[2]);
USPPrint(8, "[MT313]Locked SR=%d, CodeRate=%d/%d\r\n",sr,cr+1,cr+2);
return CSQPSK_SUCCESS;
}
else
{
USPPrint(8, "[MT313]Not Lock, i=%d, Status(0x%x, 0x%x, 0x%x)\r\n", i,szBuffer[0],szBuffer[1],szBuffer[2]);
}
}
USPPrint(8, "[MT313]Not Lock, i=%d, Status(0x%x, 0x%x, 0x%x)\r\n", i,szBuffer[0],szBuffer[1],szBuffer[2]);
/*如果手动VIT 模式搜索失败,则转为自动模式*/
if ((nAutoFEC == 0) && (nLoopCnt == 0))
{
nAutoFEC = 1;
ucFECRate = 0xFF;
ZL1031XWrtReg(bTunerIndex, ZL1031X_VIT_MODE,&ucFECRate,1);
nAdjFreqLimit = nFreqLimit + 8; // +1M BW
ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_LIM, &nAdjFreqLimit,1);
ucBuffer = ZL1031X_FR_OFF_CENTRED;
ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_OFF, &ucBuffer,1);
nLoopCnt++;
USPPrint(8, "[MT313]### Change FEC_MODE to automatic and try again!!!\r\n");
goto LOOP;
}
/*若自动VIT搜索模式下的符号率低于10M,则再搜索一次*/
if ((pCHPara->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 10000) && (nLoopCnt == 0))
{
nAdjFreqLimit = nFreqLimit + 8; // +1M BW
ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_LIM, &nAdjFreqLimit,1);
ucBuffer = ZL1031X_FR_OFF_CENTRED;
ZL1031XWrtReg(bTunerIndex, ZL1031X_FR_OFF, &ucBuffer,1);
nLoopCnt++;
USPPrint(8, "[MT313]### Increase the search range and try again!!!\r\n");
goto LOOP;
}
return CSQPSK_FAILURE;
}
#endif
/* +==========================================================================+ */
/* | Function: ;qH!PE:ENsBkBJ | */
/* +==========================================================================+ */
CSQPSK_Error_t ZL1031XGetBER(CSHDITunerIndex bTunerIndex, DWORD *pdwBer)
{
#if 1
BYTE bValue[3],bCR;
int ErrorCode=CSQPSK_SUCCESS;
int dt=1;
DWORD dwSR_k,dwError;
int nLockStatus;
ErrorCode = ZL1031XGetLockStatus(bTunerIndex,&nLockStatus);
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
if ( nLockStatus!= TP_LOCK )
{
*pdwBer = 10000000;/*add by th*/
return CSQPSK_SUCCESS;
}
ErrorCode |= ZL1031XRdReg ( bTunerIndex, ZL1031X_FEC_STATUS, bValue, 1 );
bCR= (bValue[0]>>4)&0x07;
ErrorCode |= ZL1031XGetSRate ( bTunerIndex, &dwSR_k );
ErrorCode |= ZL1031XRdReg ( bTunerIndex, ZL1031X_RS_UBC, bValue, 2 );
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
dwError = ((DWORD)bValue[0])<<8 | bValue[1];
*pdwBer = dwError *1632 /(dt*2*bCR);
*pdwBer = *pdwBer*1000 /dwSR_k;
#endif
return CSQPSK_SUCCESS;
}
CSQPSK_Error_t ZL1031XGetDerotFreq (CSHDITunerIndex bTunerIndex, int *nDerotFrequency,DWORD dwSymbolRate)
{
BYTE bDerotFreq[4];
SHORT dwrequency1,dwrequency2;
int ErrorCode;
int dwDerotFrequency;
ErrorCode = ZL1031XRdReg ( bTunerIndex, ZL1031X_FREQ_ERR, bDerotFreq, 2 );
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
dwrequency1 = ((SHORT)bDerotFreq[0] << 8 ) + (SHORT)bDerotFreq[1];
ErrorCode = ZL1031XRdReg ( bTunerIndex, ZL1031X_FREQ_ERR+3, bDerotFreq, 2 );
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
dwrequency2 = ((SHORT)bDerotFreq[0] << 8 ) + (SHORT)bDerotFreq[1];
dwDerotFrequency=(int)((dwrequency1*90)/65536+(dwrequency2*(dwSymbolRate/1000))/262144);
*nDerotFrequency = dwDerotFrequency;
return CSQPSK_SUCCESS;
}
CSQPSK_Error_t ZL1031XSetDerotFrequency (CSHDITunerIndex bTunerIndex, int nFrequency_0ffset)
{
return CSQPSK_SUCCESS;
}
#if 0
/* +--------------------------------------------------------------------------+ */
/* +==========================================================================+ */
/* | RTOB:/J}SkDiSEqCSP9X | */
/* +==========================================================================+ */
/* +--------------------------------------------------------------------------+ */
/* +==========================================================================+ */
/* | Function: =xHkDiSEqC W4L, | */
/* +==========================================================================+ */
CSQPSK_Error_t CSDSCActive ( CSHDITunerIndex bTunerIndex )
{
BYTE bValue[4];
bValue[0] = 0 | DiSEqC_MODE | MODULATED_BURST;
return ( ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqC, bValue, 1 ) );
}
/* +==========================================================================+ */
/* | Function: 7"KMTONE BURST C|An | */
/* | DiSEqC bTBSwitch: | */
/* +==========================================================================+ */
static CSQPSK_Error_t CSDSCTBCommand ( CSHDITunerIndex bTunerIndex, BYTE bTBSwitch )
{
BYTE bValue;
int ErrorCode;
bValue = 0;
bValue &= ~( DiSEqCMODE_MASK | TONEBURST_MASK );
if ( bTBSwitch == 0 )
{
bValue |= DiSEqC_MODE ;
ErrorCode = ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqC, &bValue, 1 );
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
bValue = 0x00;
return ZL1031XWriteReg ( bTunerIndex, STV0299REG_DiSEqCFIFO, &bValue, 1 );
}
else //if ( bTBSwitch == 1 )
{
bValue |= DiSEqC_MODE ;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?