stv0288drv.c
来自「QPSK Tuner details, for conexant chipset」· C语言 代码 · 共 2,124 行 · 第 1/5 页
C
2,124 行
{
*pnLockStatus = TRUE;
}
else
{
*pnLockStatus = FALSE;
}
}
return nReturn;
#else
if( bSTV0288CheckTPLock ( bTunerIndex))
*pnLockStatus = TRUE;
else
*pnLockStatus = FALSE;
#endif
return CSQPSK_SUCCESS;
}
/* +==========================================================================+ */
/* | Function: IhVC(I,Q) / (I,-Q) | */
/* | Input: IQW4L, 0: I, Q IQ Normal | */
/* | 1: I,-Q IQ Invert | */
/* | Output: N^ | */
/* | Return: 3I9&1jV> | */
/* +==========================================================================+ */
/*set IQ for FEC use,I,Q 一路表示一个BIT*/
CSQPSK_Error_t STV0288SetIQ ( CSHDITunerIndex bTunerIndex, BYTE bIQStatus )
{
BYTE bValue;
CSQPSK_Error_t error=CSQPSK_SUCCESS;
//STV0288Get_RegMap_Val(R288_FECM, &bValue, 1);
error |= STV0288RdReg ( bTunerIndex,R288_FECM, &bValue, 1 );
if (bIQStatus)
bValue |= F288_IQ_INVERT;
else
bValue &= (~F288_IQ_INVERT);
error |= STV0288WrtReg ( bTunerIndex,R288_FECM, &bValue, 1 );
return error;
}
/* +==========================================================================+ */
/* | Function: IQ;%;; | */
/* | Input: N^
* | Output: N^ | */
/* | Return: 3I9&1jV> | */
/* +==========================================================================+ */
CSQPSK_Error_t STV0288SwapIQ ( CSHDITunerIndex bTunerIndex )
{
BYTE bValue;
CSQPSK_Error_t error=CSQPSK_SUCCESS;
//STV0288Get_RegMap_Val(R288_FECM, &bValue, 1);
error |= STV0288RdReg ( bTunerIndex,R288_FECM, &bValue, 1 );
bValue ^=0x01;
error |= STV0288WrtReg ( bTunerIndex,R288_FECM, &bValue, 1 );
return error;
}
/* +==========================================================================+ */
/* | Function: 4r?*I2CM(5@ | */
/* | Return: 3I9&1jV> | */
/* +==========================================================================+ */
CSQPSK_Error_t STV0288EnableTunerI2C ( CSHDITunerIndex bTunerIndex )
{
BYTE bValue;
STV0288Get_RegMap_Val(R288_I2CRPT, &bValue, 1);
//CSTRACE(ERROR_LEVEL," enable tuner value =%d",bValue);
bValue |= 0x80 ;
return ( STV0288WriteReg ( bTunerIndex,R288_I2CRPT, &bValue, 1 ) );
//return ( STV0288WrtReg ( bTunerIndex,R288_I2CRPT, &bValue, 1 ) );
}
/* +==========================================================================+ */
/* | Function: 9X1UI2CM(5@ | */
/* | Return: 3I9&1jV> | */
/* +==========================================================================+ */
CSQPSK_Error_t STV0288DisableTunerI2C (CSHDITunerIndex bTunerIndex)
{
BYTE bValue;
STV0288Get_RegMap_Val(R288_I2CRPT, &bValue, 1);
//CSTRACE(ERROR_LEVEL," disable tuner value =%d",bValue);
bValue &= 0x7f ;
return ( STV0288WriteReg ( bTunerIndex,R288_I2CRPT, &bValue, 1 ) );
//return ( STV0288WrtReg ( bTunerIndex,R288_I2CRPT, &bValue, 1 ) );
}
/* +==========================================================================+ */
/* | Function: <l2bCHIP IDJG7qU}H7 ( SCSZLink ICWT6/J61p ) | */
/* | Input: N^ | */
/* | Output: N^ | */
/* | Return: U}H7, 75;XSUCCESS, 7qTr75;XFAILURE | */
/* +==========================================================================+ */
CSQPSK_Error_t STV0288CheckChipID ( CSHDITunerIndex bTunerIndex )
{
BYTE bValue ;
int ErrorCode;
g_hSTV0288I2C[bTunerIndex] = 0;
if (CSI2COpen(bTunerIndex,STV0288_CHIP_ADDR,&g_hSTV0288I2C[bTunerIndex]) != CSI2C_SUCCESS)
{
CSTRACE( ERROR_LEVEL, "\n[HDI][CS_QPSK][STV0288CheckChipID]:\n******** STV0288 Open I2C Error ********");
return CSQPSK_I2C_ERROR;
}
ErrorCode = STV0288RdReg ( bTunerIndex,R288_ID, &bValue, 1 );
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
CSTRACE( ERROR_LEVEL, "\n[HDI][CS_QPSK][STV0288CheckChipID]:%d",bValue);
if ( bValue == STV0288_CHIP_ID )
{
return CSQPSK_SUCCESS;
}
else
{
return CSQPSK_FAILURE;
}
}
/* +==========================================================================+ */
/* | Function: STV0288=xHk/MK3vJ!5gD#J= | */
/* | Input: Power Down D#J= ( 0: U}3#. 1: J!5g ) | */
/* | Output: N^ | */
/* | Return: 2YWw3I9&1jV> | */
/* +==========================================================================+ */
CSQPSK_Error_t STV0288STDBY ( CSHDITunerIndex bTunerIndex, int bPDownFlag )
{
BYTE bValue ;
STV0288Get_RegMap_Val(R288_SYNTCTRL,&bValue,1);
bValue &=0x7f;
bValue |= ((BYTE)bPDownFlag) << 7;
return ( STV0288WrtReg ( bTunerIndex,R288_SYNTCTRL, &bValue, 1 ) );
}
/* +==========================================================================+ */
/* | Function: IhVC Link IC 5D7{:EBJ<D4fFw | */
/* | Input: 7{:EBJ(KbpsN*5%N;) | */
/* | Output: N^ | */
/* | Return: 2YWw3I9&1jV> | */
/* +==========================================================================+ */
CSQPSK_Error_t STV0288SetSymbolRate ( CSHDITunerIndex bTunerIndex, DWORD dwSymbolRate )
{
DWORD dMasterClk;
BYTE bValue[4];
int ErrorCode=0;
DWORD dwSRate;
#if 0
bValue[0] = 0x80;
bValue[1] = 0x00;
bValue[2] = 0x00;
if ( STV0288WrtReg ( bTunerIndex,R288_SFRH, bValue, 3 ) != CSQPSK_SUCCESS )
{
ErrorCode++;
}
#endif
dMasterClk =g_dwMaster_Clock_Khz*1000; //khz to hz
//dwSRate=dwSymbolRate*1000;
dwSRate=dwSymbolRate*1000 ;
dwSRate=(DWORD)BinFloatDiv(dwSRate,dMasterClk,20);
//CSTRACE(INFO_LEVEL,"[SetSRate]set symbol rate 0x%x, ture symbol =%d\n",dwSRate,dwSymbolRate);
bValue[0] = (BYTE)((dwSRate >> 12) & 0xff);
bValue[1] = (BYTE)((dwSRate >> 4) & 0xff);
bValue[2] = (BYTE)(dwSRate&0x0f)<<4;
if ( STV0288WrtReg ( bTunerIndex,R288_SFRH, bValue, 3 ) != CSQPSK_SUCCESS )
{
ErrorCode++;
}
if ( ErrorCode != 0 )
{
CSTRACE(INFO_LEVEL,"[qpsk]SetSRate error \n");
return CSQPSK_FAILURE;
}
else
{
return CSQPSK_SUCCESS;
}
}
/* +==========================================================================+ */
/* | Function: ;qH!PE:EVJA? | */
/* | Input: N^ | */
/* | Output: N^ | */
/* | Return: PE:EVJA?0-255V.<d (J}V5T=4s, PE:EVJA?T=:C) | */
/* +==========================================================================+ */
/*Noise indicator*/
CSQPSK_Error_t STV0288SignalQuality(CSHDITunerIndex bTunerIndex, int *pnSignalQuality )
{
BYTE bSNR[4];
WORD wTmp;
DWORD dwQPSK_EbNo;
int nLockStatus;
int ErrorCode;
ErrorCode = STV0288GetLockStatus(bTunerIndex,&nLockStatus);
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
if ( nLockStatus!= TP_LOCK )
{
dwQPSK_EbNo = 0;
}
else
{
ErrorCode = STV0288RdReg ( bTunerIndex,R288_NIRM, bSNR, 2 );
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
wTmp = bSNR[0];
wTmp = ((wTmp<<8)&0xff00)|bSNR[1];
dwQPSK_EbNo = wTmp;
if( dwQPSK_EbNo > 0x3100) // SPP'76N'Ih6(N*(0x1200 - 0x3000)
dwQPSK_EbNo = 0x3100;
if( dwQPSK_EbNo < 0x1600)
dwQPSK_EbNo = 0x1600;
dwQPSK_EbNo = ( 0x3100 - dwQPSK_EbNo ) * 100 / (0x3100-0x1600);
}
*pnSignalQuality = dwQPSK_EbNo;
// *pnSignalQuality = 60;
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) | */
/* +==========================================================================+ */
/*通过RF AGC 的大小来确定信号强度*/
CSQPSK_Error_t STV0288SignalStrength ( CSHDITunerIndex bTunerIndex, int *pnSignalStrength )
{
BYTE bSPOWER;
int nLevel;
int ErrorCode;
int nLockStatus;
#if 0/*获取信号强度不需要判断锁定的状态*/
ErrorCode = STV0288GetLockStatus(bTunerIndex,&nLockStatus);
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
if ( nLockStatus== ALLLOST)
{
*pnSignalStrength = 0;
}
else
#endif
{
ErrorCode = STV0288RdReg ( bTunerIndex, R288_AGC1IN, &bSPOWER, 1 );
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
if ( bSPOWER >= 0x80 )
{
nLevel = (255-bSPOWER)*(-1);
}
else
{
nLevel = bSPOWER;
}
if (nLevel > 90)
nLevel = 90 ;
*pnSignalStrength = 100*( nLevel + 128 ) / 218;
}
return CSQPSK_SUCCESS;
}
CSQPSK_Error_t STV0288Get_SymbolRate(CSHDITunerIndex bTunerIndex, DWORD *pdwSymb)
{
BYTE bValue[3];
DWORD dwMClk;
CSQPSK_Error_t error= CSQPSK_SUCCESS;
if ( NULL == pdwSymb )
{
CSASSERT ( NULL != pdwSymb );
return CSQPSK_FAILURE;
}
error |=STV0288RdReg( bTunerIndex, R288_SFRH, bValue, 3);
if ( CSQPSK_SUCCESS != error )
return CSQPSK_FAILURE;
*pdwSymb = STV0288_CalcSymbolRate(g_dwMaster_Clock_Khz,bValue[0],bValue[1],bValue[2]>>4) ;
return CSQPSK_SUCCESS;
}
/* +==========================================================================+ */
/* | Function: ;qH!PE:ENsBkBJ | */
/* +==========================================================================+ */
/*通过VITERBI 寄存器得到*/
CSQPSK_Error_t STV0288BER(CSHDITunerIndex bTunerIndex, DWORD *pdwBer)
{
BYTE pbBER[4], bERR;
DWORD dwErrCNT;
int ErrorCode=CSQPSK_FAILURE;
int nLockStatus;
ErrorCode = STV0288GetLockStatus(bTunerIndex,&nLockStatus);
if ( ErrorCode != CSQPSK_SUCCESS )
return ErrorCode;
if ( nLockStatus!= TP_LOCK )
{
*pdwBer = 10000000;
return CSQPSK_SUCCESS;
}
ErrorCode |= STV0288RdReg ( bTunerIndex, R288_ECNTL, &bERR, 1 );
dwErrCNT = (DWORD)pbBER[0] ;
ErrorCode |= STV0288RdReg ( bTunerIndex, R288_ECNTM, &bERR, 1 );
dwErrCNT |= ( ((DWORD)bERR) << 8 ) ;
*pdwBer = dwErrCNT;
return ErrorCode;
}
/* +==========================================================================+ */
/* | Function: IhVCCARRIER FREQUENCY REGISTER | */
/* | Input: Derotator Frequency | */
/* | Output: N^ | */
/* | Return: 2YWw3I9&1jV> | */
/* +==========================================================================+ */
CSQPSK_Error_t STV0288DerotFreq (CSHDITunerIndex bTunerIndex, DWORD dwDerotFrequency)
{
BYTE bDerotFreq[4];
BYTE bValue;
// STV0288RdReg ( bTunerIndex, 0x13, &bValue, 1 );
//bValue |= 0x80;
//STV0288WrtReg ( bTunerIndex, 0x13, &bValue, 1 );
bDerotFreq[0] = (BYTE) ( ( dwDerotFrequency >> 8 ) & 0xff );
bDerotFreq[1] = (BYTE) ( dwDerotFrequency & 0xff );
return ( STV0288WrtReg ( bTunerIndex, R288_CFRM, bDerotFreq, 2 ) );
}
CSQPSK_Error_t STV0288GetDerotFreq (CSHDITunerIndex bTunerIndex, int *nDerotFrequency)
{
BYTE bDerotFreq[4];
DWORD dwMasterClk;
int dwDerotFrequency;
//int nDirect = 1;
int ErrorCode=0;
if ( NULL == nDerotFrequency )
{
CSASSERT( NULL != nDerotFrequency );
return CSQPSK_FAILURE;
}
ErrorCode |= STV0288RdReg ( bTunerIndex, R288_CFRM, bDerotFreq, 2 );
dwDerotFrequency=CalcDerotFreq(bDerotFreq[0],bDerotFreq[1],g_dwMaster_Clock_Khz);
*nDerotFrequency = dwDerotFrequency;
return ErrorCode;
}
/*Carrier recovery frequency register*/
CSQPSK_Error_t STV0288SetDerotFrequency (CSHDITunerIndex bTunerIndex, int nFrequency)
{
int dwDerotFrequency;
int nDerotFrequency;
if (nFrequency < 0)
{
nDerotFrequency = (-1) * nFrequency;
dwDerotFrequency = nDerotFrequency * 0x400 / 1375;
dwDerotFrequency = 0xFFFF - dwDerotFrequency;
}
else
{
dwDerotFrequency = nFrequency * 0x400 / 1375;
}
#if 1
return STV0288DerotFreq(bTunerIndex, dwDerotFrequency);
#else
return STV0288DerotFreq(bTunerIndex, 0);
#endif
}
CSQPSK_Error_t STV0288SetClockPolarity( CSHDITunerIndex bTunerIndex, T_ClockPolarity clockPol )
{
BYTE bValue;
STV0288Get_RegMap_Val(R288_RS, &bValue, 1);
if ( clockPol == LOW_TO_HIGH )
{
bValue &= 0xfd;
}
else
{
bValue |= 0x02;
}
return STV0288WrtReg ( bTunerIndex, R288_RS, &bValue, 1);
}
/*maybe through means of detect the in put signal spectrum */
CSQPSK_Error_t STV0288_Coarse_Scan(CSHDITunerIndex bTunerIndex,int *Offset_Khz,DWORD *dwSymbolRate_k)
{
// DWORD symbolrate_Bds = 0;
CSQPSK_Error_t error=CSQPSK_SUCCESS;
BYTE bValue[2];
STV0288Get_RegMap_Val(R288_ASCTRL, bValue, 1);
bValue[0] |=0x38; /* 1 /16 inte ratio*/
bValue[0] |= 0x01; /*when high enable coarse mode*/
error |= STV0288WrtReg ( bTunerIndex, R288_ASCTRL, bValue, 1 );
/* run coarse during 15ms */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?