📄 cx24143drv.c
字号:
//int lock_flag=0;
//ret_err=CX2414xCheckLockStatus(bTunerIndex,&lock_flag);
//if(lock_flag==TRUE)
ret_err = CX2414X_get_signal_stats( (ULONG)bTunerIndex, &signal_stats,0 );
//else
// *pnSignalQuality =0;
CSASSERT(ret_err==CSQPSK_SUCCESS);
*pnSignalQuality =signal_stats.signal_quality;
*pnSignalQuality =(*pnSignalQuality*100)/0xff ;
#ifdef QPSK_DEBUG
//CSTRACE( QPSK_DEBUG_LEVEL, "\n[HDI][CS_QPSK][CX2414xSignalQuality] = %d\n ",*pnSignalQuality);
#endif
return ret_err;
}
/*****************************************************************************/
/* FUNCTION: CX2414xSignalStrength */
/* PARAMETERS: bTunerIndex - tuner index
pnSignalQuality - the current Signal Strength.
*/
/* DESCRIPTION: This function Check tuner Signal Strength. */
/* RETURNS: suceess or failure */
/*****************************************************************************/
CSQPSK_Error_t CX2414xSignalStrength(CSHDITunerIndex bTunerIndex, int *pnSignalQuality )
{
CSQPSK_Error_t ret_err;
SIGNAL_STATS signal_stats;
//int lock_flag=0;
//ret_err=CX2414xCheckLockStatus(bTunerIndex,&lock_flag);
//if(lock_flag==TRUE)
ret_err = CX2414X_get_signal_stats( (ULONG)bTunerIndex, &signal_stats ,1);
//else
// *pnSignalQuality =0;
CSASSERT(ret_err==CSQPSK_SUCCESS);
*pnSignalQuality =signal_stats.signal_strength;
*pnSignalQuality =(*pnSignalQuality*100)/0xff ;
#ifdef QPSK_DEBUG
//CSTRACE( QPSK_DEBUG_LEVEL, "\n[HDI][CS_QPSK][CX2414xSignalStrength] = %d\n ",*pnSignalQuality);
#endif
return ret_err;
}
/*****************************************************************************/
/* FUNCTION: CX2414xSet_LNBPower */
/* PARAMETERS: bTunerIndex - tuner index
bGPIOValue - 1:on ,0:off
*/
/* DESCRIPTION: This function Set LNB Power on or off. */
/* RETURNS: suceess or failure */
/*****************************************************************************/
CSQPSK_Error_t CX2414xSet_LNBPower ( CSHDITunerIndex bTunerIndex, UCHAR bGPIOValue )
{
T_CSGPIOStatus ret_err;
//ret_err=CSGPIOWrite(PIO_LNB_ENABLE, bGPIOValue);
ret_err=CSGPIOWrite(PIO_LNB_ENABLE, !bGPIOValue); // for polarity inverse, beause conexant has it's default sets, which control by 0x80000000.
//CSTRACE( INFO_LEVEL, "\n[HDI][CS_QPSK][CX2414xSet_LNBPower] = %d\n ",bGPIOValue);
return (!ret_err?CSQPSK_SUCCESS:CSQPSK_FAILURE);
}
/*****************************************************************************/
/* FUNCTION: CX2414x13_18VSwitch */
/* PARAMETERS: bTunerIndex - tuner index
nch_p - 1:V ,0:H
*/
/* DESCRIPTION: This function Set LNB Power 13V,18V. */
/* RETURNS: suceess or failure */
/*****************************************************************************/
CSQPSK_Error_t CX2414x13_18VSwitch ( CSHDITunerIndex bTunerIndex, Channel_Polarisation nch_p )
{
ULONG ulRegVal;
BOOL ret_err;
ulRegVal = (nch_p == CSHDI_ON ? 0x01UL : 0x00UL);
ret_err=RegisterWrite(&NIMs[bTunerIndex],CX24130_LNBDC,ulRegVal) ;
#ifdef QPSK_DEBUG
CSTRACE( QPSK_DEBUG_LEVEL, "[HDI][CS_QPSK][CX2414x13_18VSwitch] = %d\n ",ulRegVal);
#endif
return (ret_err?CSQPSK_SUCCESS:CSQPSK_FAILURE);
}
/*****************************************************************************/
/* FUNCTION: CX2414xF22KSwitch */
/* PARAMETERS: bTunerIndex - tuner index
nF22KCtrl - 1:ON ,0:OFF
*/
/* DESCRIPTION: This function Set 22K signal wave on or off. */
/* RETURNS: suceess or failure */
/*****************************************************************************/
CSQPSK_Error_t CX2414xF22KSwitch ( CSHDITunerIndex bTunerIndex, CSHDISwitch nF22KCtrl ){
BOOL ret_err;
if ( nF22KCtrl == CSHDI_ON)
ret_err=API_SetLNBTone(&NIMs[bTunerIndex],LNBTONE_ON);
else
ret_err=API_SetLNBTone(&NIMs[bTunerIndex],LNBTONE_OFF);
//CSTRACE( ERROR_LEVEL,(nF22KCtrl == CSHDI_ON )?"[HDIQPSK] CX2414xF22KSwitch on \n":"[HDIQPSK] CX2414xF22KSwitch off \n");
return (ret_err?CSQPSK_SUCCESS:CSQPSK_FAILURE);
}
/*****************************************************************************/
/* FUNCTION: CX2414xSCheckChipID */
/* PARAMETERS: bTunerIndex - tuner index, NO use
bTSOutMode - NO use
*/
/* DESCRIPTION: This function read chip ID. */
/* RETURNS: suceess - the chip ID is right
failure - the chip ID is wrong */
/*****************************************************************************/
CSQPSK_Error_t CX2414xSCheckChipID ( CSHDITunerIndex bTunerIndex, UCHAR bTSOutMode )
{
UCHAR data[4];
if ( CS_CNXT_REGMAP_GET( CS_PLL_TEST_REG, CS_PLL_TEST_DEMOD_DISABLE_MASK ) ==
CS_PLL_TEST_DEMOD_DISABLED )
{
CSTRACE( ERROR_LEVEL, "[HDIQPSK] DEMOD_NO_HARDWARE\n");
return CSQPSK_DEVICE_UNKNOWN;//DEMOD_NO_HARDWARE;
}
if(CX2414x_I2C_Handle_Init(bTunerIndex)!=CSQPSK_SUCCESS)
{
CSTRACE( ERROR_LEVEL, "[HDIQPSK] CX2414x open i2c fail \n");
return CSQPSK_FAILURE;
}
if(CX2414XReadReg( bTunerIndex, 0, data)!=CSQPSK_SUCCESS)
{
CSTRACE( ERROR_LEVEL, "[HDIQPSK] CX2414xSCheckChipID read fail \n");
return CSQPSK_FAILURE;
}
if ( data[0] == CX2414x_ID )
{
CSTRACE(INFO_LEVEL, "[HDIQPSK] CX2414xSCheckChipID=0x%x ok!!!\n",data[0]);
return CSQPSK_SUCCESS;
}
else
{
CSTRACE(ERROR_LEVEL, "[HDIQPSK] CX2414xSCheckChipID Error???\n");
return CSQPSK_DEVICE_UNKNOWN;
}
}
/*****************************************************************************/
/* FUNCTION: CX2414xReadReg */
/* PARAMETERS: bTunerIndex - tuner index
reg - the register index
data -The register content. */
/* DESCRIPTION: This function read chip register unit . */
/* RETURNS: suceess or failure. */
/*****************************************************************************/
/*
CSQPSK_Error_t CX2414xReadReg ( CSHDITunerIndex bTunerIndex, int reg,UCHAR *data )
{
BOOL ret_err;
ret_err= API_ReadReg(&NIMs[bTunerIndex] ,Register[reg].addr ,data);
CSTRACE( INFO_LEVEL, "[HDIQPSK] CX2414x Reg%d=0x%x \n",Register[reg].addr,data[0]);
CSASSERT(ret_err);
if (ret_err )
{
return CSQPSK_SUCCESS;
}
else
{
return CSQPSK_FAILURE;
}
}
*/
/*****************************************************************************/
/* FUNCTION: CX2414xSetStandby */
/* PARAMETERS: bTunerIndex - tuner index
nStandby-1:standby ,0:normal. */
/* DESCRIPTION: This function set chip standby or not . */
/* RETURNS: suceess or failure. */
/*****************************************************************************/
CSQPSK_Error_t CX2414xSetStandby( CSHDITunerIndex bTunerIndex, int nStandby )
{
if(API_SetSleepMode(&NIMs[bTunerIndex], nStandby))
return CSQPSK_SUCCESS;
return(CSQPSK_FAILURE);
}
CSQPSK_Error_t CX2414xSetClockPolarity( CSHDITunerIndex bTunerIndex, T_ClockPolarity clockPol )
{
ULONG ulRegVal;
// internal demodulator clock polarity
//*((ULPREG) HSDP_TSB_PORT_CNTL_REG) = 1;
if (RegisterRead(&NIMs[bTunerIndex],CX24130_TUNBURSTCLKPOL,&ulRegVal) == False)
return(CSQPSK_FAILURE);
if(clockPol==LOW_TO_HIGH)
ulRegVal &= (~0x40); //bit 6
else
ulRegVal |= 0x40;
if (RegisterWrite(&NIMs[bTunerIndex],CX24130_TUNBURSTCLKPOL,ulRegVal) == False)
return(CSQPSK_FAILURE);
return CSQPSK_SUCCESS;
}
void vFillOutTune(CSQPSKCHANNEL *pCSCHANNEL)
{
/* fill out the tuning spec... */
Stuning.type = DEMOD_NIM_SATELLITE;
//m_dwChannelFrequency is TP Fre or Down Fre ?
Stuning.nim_satellite_tune.frequency = pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency; //m_dwChannelFrequency is TP Fre or Down Fre ?
Stuning.nim_satellite_tune.symbol_rate = pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate;
// Stuning.tune.nim_satellite_tune.orbital_position = pConfig->orbital_position;
Stuning.nim_satellite_tune.orbital_position = 0;
Stuning.nim_satellite_tune.spectrum = SAT_SPECTRUM_AUTO;
Stuning.nim_satellite_tune.polarisation= 0;
Stuning.nim_satellite_tune.fec = M_RATE_AUTO;
}
/*****************************************************************************/
/* FUNCTION: CX2414xCSLock */
/* PARAMETERS: bTunerIndex - tuner index
pCSCHANNEL-Channel para. */
/* DESCRIPTION: This function search signal . */
/* RETURNS: suceess--lock , failure--lost lock. */
/*****************************************************************************/
CSQPSK_Error_t CX2414xCSLock ( CSHDITunerIndex bTunerIndex, CSQPSKCHANNEL *pCSCHANNEL )
{
CHANOBJ chan;
BOOL APIresult=0;
int LockStatus=0;
LOCKIND lockinds;
ACQSTATE state=0;
CSQPSK_Error_t nReturn;
LONG effectfrq ;
int i,j,k;
LONG nFrequencyOffset,tuneroffset;
nFrequencyOffset = 0;
CSTRACE( ERROR_LEVEL, "\n[HDIQPSK] CX2414x start Lock\n");
if ( (pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate < 1000) ||
(pCSCHANNEL->m_CHANNEL.m_DMD.m_dwChannelSymbolRate > 50000) ||
(pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency < 900000) ||
(pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency > 2250000) )
{
if ( g_ucCx2414xTunerType[bTunerIndex] == CX2414X_TUNER_CX24109)
{
_TUNER_CX24108_set_freq(&NIMs[bTunerIndex],900*1000);
}
else
{
//Shart0302aSetFrequency( bTunerIndex, 900*1000, 1000);
}
{
#ifdef QPSK_DEBUG
CSTRACE( ERROR_LEVEL, "\n[CSLock]Param Error");
CSTRACE( ERROR_LEVEL, "Position:file = %s,line = %d\n", __FILE__, __LINE__);
#endif
return CSQPSK_FAILURE;
}
}
vFillOutTune(pCSCHANNEL);
// sfg convet frequency unit from KHZ to HZ
/*CSTRACE(INFO_LEVEL, "[HDIQPSK]CX2414xCSLock freq = %d\r\n", pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency);*/
chan.frequency= pCSCHANNEL->m_CHANNEL.m_dwChannelFrequency*1000; //sfg,unit is hz
// end
chan.modtype = MOD_QPSK;
if(Stuning.nim_satellite_tune.fec != M_RATE_AUTO)
{
/* Manual mode. */
chan.coderate = convert_fec_in( Stuning.nim_satellite_tune.fec );
/* Not sure why we do this but I'll leave it there as it dosent cause much harm! */
chan.viterbicoderates = CODERATE_2DIV3 | CODERATE_3DIV4; /* only for testing - should be 0 */
}
else
{
/* Automatic mode, try all code rates. */
chan.coderate = CODERATE_1DIV2;
chan.viterbicoderates = viterbicoderates;
}
chan.symbrate = Stuning.nim_satellite_tune.symbol_rate; //sfg,unit is k
chan.specinv = convert_spectrum_in( Stuning.nim_satellite_tune.spectrum );
chan.samplerate = SAMPLE_FREQ_NOM;
/* Make sure all interrupts (including acq_fail) are reset, then call
API_ChangeChannel to accomplish the tuning. */
// added by yuxibo to optimize demod lock
RegisterWrite(&NIMs[bTunerIndex], CX24130_CTLAFCGAIN, 0x03);
#if 1
for(i=0;i<6;i++)
{
API_AcqBegin( &NIMs[bTunerIndex] );
// API_ClearPendingInterrupts( &NIMs[bTunerIndex] );
// acq_failure_countdown[unit] = DEMOD_CONNECT_COUNTDOWN;
//CSSleep(50);
APIresult = API_ChangeChannel( &NIMs[bTunerIndex], &chan, bTunerIndex);
if ( !APIresult )
{
CSASSERT(APIresult);
// API_SetInterruptOptions( &NIMs[bTunerIndex], COBRA_NO_INTERRUPTS );
//return CSQPSK_FAILURE;
}
//API_SetInterruptOptions( &NIMs[bTunerIndex], COBRA_CONNECTING_INTERRUPTS );
// API_GetAcquisitionOffset(&NIMs[bTunerIndex],&effectfrq);
// g_nFrequencyOffset[bTunerIndex]=(int)(effectfrq/1000);
#if 0
nReturn = CSQPSKSleep(bTunerIndex,200);
if ( CSQPSK_DROPPED == nReturn )
{
CSTRACE( INFO_LEVEL, "\n[CS_QPSK] QUICK EXIT\n");
return CSQPSK_DROPPED;
}
#endif
//if (API_GetFrequencyOffset(&NIMs[bTunerIndex],&tuneroffset) == False) return(False);
//API_SetCentralFreq( &NIMs[bTunerIndex], 0 );
/*CSTRACE( QPSK_DEBUG_LEVEL, "[CS_QPSK] pCSCHANNEL->m_nFrequencyOffset = %d, tuneroffset = %d\n",pCSCHANNEL->m_nFrequencyOffset,tuneroffset);*/
for (j=0;j<8;j++) //jeffrey
{
// API_Monitor(&NIMs[bTunerIndex],&state,&lockinds);
API_GetLockIndicators(&NIMs[bTunerIndex],&lockinds);
if(lockinds.demod)
{
for ( k=0; k<5; k++ )
{
if ( lockinds.demod != TRUE )
{
break;
}
if (lockinds.syncbyte)
{
/* Get Acq Freq Offset */
//API_GetAcquisitionOffset(&NIMs[bTunerIndex],&nFrequencyOffset);
//pCSCHANNEL->m_nFrequencyOffset += nFrequencyOffset;
CSTRACE( QPSK_DEBUG_LEVEL, "[CS_QPSK] Locked frequency offset = %d\n",nFrequencyOffset);
pCSCHANNEL->m_nFrequencyOffset = nFrequencyOffset;
return CSQPSK_SUCCESS; //full locked
}
else
{
nReturn = CSQPSKSleep(bTunerIndex,150);
if ( CSQPSK_DROPPED == nReturn )
{
CSTRACE( INFO_LEVEL, "\n[CS_QPSK] QUICK EXIT\n");
return CSQPSK_DROPPED;
}
API_GetLockIndicators(&NIMs[bTunerIndex],&lockinds);
}
}
break;
}
nReturn = CSQPSKSleep(bTunerIndex,50);
if ( CSQPSK_DROPPED == nReturn )
{
CSTRACE( INFO_LEVEL, "\n[CS_QPSK] QUICK EXIT\n");
return CSQPSK_DROPPED;
}
}
// chan.frequency+=effectfrq;
/*
if(i%3==1)
{
chan.symbrate =Stuning.nim_satellite_tune.symbol_rate -50*(i/3+1);
chan.frequency = Stuning.nim_satellite_tune.frequency*1000-100000*(i/3+1);
}
else if(i%3==2)
{
chan.symbrate =Stuning.nim_satellite_tune.symbol_rate +50*(i/3+1);
chan.frequency = Stuning.nim_satellite_tune.frequency*1000+100000*(i/3+1);
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -