📄 d0899_dvbs2util.c
字号:
return tempus; /* to convert value to db tempus=(10*log10(tempus)/(quant^2)*/
/* with quant = UWP_ESN0_QUANT field value */
}
/*****************************************************
**FUNCTION :: FE_DVBS2_AutoConfigCSM
**ACTION :: Set the CSM to Automatic mode
**PARAMS IN :: hChip ==> handle to the chip
**PARAMS OUT:: NONE
**RETURN :: None
*****************************************************/
void FE_DVBS2_AutoConfigCSM(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
/* to auto=config write a 1 to auto_param register */
/*Set filed image value*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_AUTO_PARAM,FSTB0899_AUTO_PARAM_INFO,1);
}
/*****************************************************
**FUNCTION :: FE_DVBS2_AutoConfigCSM
**ACTION :: Set the CSM to Manual mode.
**PARAMS IN :: hChip ==> handle to the chip
:: CSMParams ==> CSM parameters
**PARAMS OUT:: NONE
**RETURN :: None
*****************************************************/
void FE_DVBS2_ManualConfigCSM(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_DVBS2_CSMConfig_Params_t CSMParams)
{
U32 val;
/* to manually config write a 0 to auto_param register*/
val=(CSMParams.DvtTable&0x01)+ ((CSMParams.TwoPass & 0x01)<<1)+((CSMParams.AgcGain & 0x1ff)<<2)+
((CSMParams.AgcShift & 0x7)<<11)+ ((CSMParams.FeLoopShift & 0x7)<<14);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CSMCNTRL1,val);
/*configure other registers*/
val=(CSMParams.GammaAcq & 0xf)+ ((CSMParams.GammaRhoAcq & 0x1ff)<<8 );
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CSMCNTRL2,val);
val=(CSMParams.GammaTrack & 0xf)+ ((CSMParams.GammaRhoTrack & 0x1ff)<<8 );
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CSMCNTRL3,val);
val=(CSMParams.LockCountThreshold & 0xf)+ ((CSMParams.PhaseDiffThreshold & 0x7f)<<8 );
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CSMCNTRL4,val);
}
/*****************************************************
**FUNCTION :: FE_DVBS2_CSMInitialize
**ACTION :: Set the parameters for Manual mode.
Should be used when QPSK pilots on and Mclk/SymbolRate<=4
**PARAMS IN :: hChip ==> handle to the chip
:: Pilots ==> Pilots On/Off
:: ModCode ==> found MODCODE
:: SymbolRate ==> Symbol Rate in Symb/s
:: MasterClock ==> Demod Clock in Hz
**PARAMS OUT:: NONE
**RETURN :: None
*****************************************************/
void FE_DVBS2_CSMInitialize(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int Pilots,FE_DVBS2_ModCod_t ModCode,U32 SymbolRate,U32 MasterClock)
{
FE_DVBS2_CSMConfig_Params_t csmParams;
csmParams.DvtTable=1;
csmParams.TwoPass=0;
csmParams.AgcGain=6;
csmParams.AgcShift=0;
csmParams.FeLoopShift=0;
csmParams.PhaseDiffThreshold=0x80;
if( ((MasterClock/SymbolRate)<=4)&&(ModCode<=11)&&(Pilots==1))
{
switch (ModCode)
{
case FE_QPSK_12:
csmParams.GammaAcq=25;
csmParams.GammaRhoAcq=2700;
csmParams.GammaTrack=12;
csmParams.GammaRhoTrack=180;
csmParams.LockCountThreshold=8;
break;
case FE_QPSK_35:
csmParams.GammaAcq=38;
csmParams.GammaRhoAcq=7182;
csmParams.GammaTrack=14;
csmParams.GammaRhoTrack=308;
csmParams.LockCountThreshold=8;
break;
case FE_QPSK_23:
csmParams.GammaAcq=42;
csmParams.GammaRhoAcq=9408;
csmParams.GammaTrack=17;
csmParams.GammaRhoTrack=476;
csmParams.LockCountThreshold=8;
break;
case FE_QPSK_34:
csmParams.GammaAcq=53;
csmParams.GammaRhoAcq=16642;
csmParams.GammaTrack=19;
csmParams.GammaRhoTrack=646;
csmParams.LockCountThreshold=8;
break;
case FE_QPSK_45:
csmParams.GammaAcq=53;
csmParams.GammaRhoAcq=17119;
csmParams.GammaTrack=22;
csmParams.GammaRhoTrack=880;
csmParams.LockCountThreshold=8;
break;
case FE_QPSK_56:
csmParams.GammaAcq=55;
csmParams.GammaRhoAcq=19250;
csmParams.GammaTrack=23;
csmParams.GammaRhoTrack=989;
csmParams.LockCountThreshold=8;
break;
case FE_QPSK_89:
csmParams.GammaAcq=60;
csmParams.GammaRhoAcq=24240;
csmParams.GammaTrack=24;
csmParams.GammaRhoTrack=1176;
csmParams.LockCountThreshold=8;
break;
case FE_QPSK_910:
csmParams.GammaAcq=66;
csmParams.GammaRhoAcq=29634;
csmParams.GammaTrack=24;
csmParams.GammaRhoTrack=1176;
csmParams.LockCountThreshold=8;
break;
default:
csmParams.GammaAcq=66;
csmParams.GammaRhoAcq=29634;
csmParams.GammaTrack=24;
csmParams.GammaRhoTrack=1176;
csmParams.LockCountThreshold=8;
break;
}
FE_DVBS2_ManualConfigCSM(DeviceMap,IOHandle,csmParams);
}
}
/*****************************************************
**FUNCTION :: FE_DVBS2_GetCSMLock
**ACTION :: Read the CSM status locked or not
**PARAMS IN :: hChip ==> handle to the chip
:: TimeOut ==> timeout to wait for CSM lock
**PARAMS OUT:: NONE
**RETURN :: CSM state
*****************************************************/
int FE_DVBS2_GetCSMLock(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int TimeOut)
{
int Time=0,
CSMLocked=0;
while((!CSMLocked)&&(Time<TimeOut))
{
CSMLocked=STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_CSM_LOCK,FSTB0899_CSM_LOCK_INFO);
/*WAIT_N_MS_899(1);*/
Time++;
}
return CSMLocked;
}
/*****************************************************
--FUNCTION :: CarrierWidth
--ACTION :: Compute the width of the carrier
--PARAMS IN :: SymbolRate -> Symbol rate of the carrier (Kbauds or Mbauds)
-- RollOff -> Rolloff * 100
--PARAMS OUT:: NONE
--RETURN :: Width of the carrier (KHz or MHz)
--***************************************************/
long FE_DVBS2_CarrierWidth(long SymbolRate,FE_DVBS2_RRCAlpha_t Alpha)
{
long RollOff;
switch(Alpha)
{
case RRC_20:
RollOff=20;
break;
case RRC_25:
RollOff=25;
break;
case RRC_35:
RollOff=35;
break;
}
return (SymbolRate + (SymbolRate*RollOff)/100);
}
/*****************************************************
**FUNCTION :: FE_DVBS2_GetDataLock
**ACTION :: Read the FEC status for data lock
**PARAMS IN :: hChip ==> handle to the chip
:: TimeOut ==> timeout to wait for data lock
**PARAMS OUT:: NONE
**RETURN :: Data Lock status
*****************************************************/
int FE_DVBS2_GetDataLock(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int TimeOut)
{
int Time=0,
DataLocked=0;
while((!DataLocked)&&(Time<TimeOut))
{
DataLocked=STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_LOCK,FSTB0899_LOCK_INFO);
/*WAIT_N_MS_899(1);*/
Time++;
}
return DataLocked;
}
/*****************************************************
**FUNCTION :: FE_DVBS2_GetDemodStatus
**ACTION :: Return the DVBS2 DEMOD status Locked or not
**PARAMS IN :: hChip ==> handle to the chip
:: timeout ==> timeout to wait for DEMOD lock.
**PARAMS OUT:: NONE
**RETURN :: DEMOD STATE
*****************************************************/
FE_DVBS2_State FE_DVBS2_GetDemodStatus(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int timeout)
{
int time=0;
BOOL Locked=FALSE;
do
{
if(STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,RSTB0899_DMDSTAT2)==0x03) /*CSM_LOCK == 1 and UWP_LOCK ==1*/
Locked=TRUE;
time+=3;
WAIT_N_MS_899(1);
}while((Locked==FALSE) &&(time<=timeout));
if(Locked)
return FE_DVBS2_DEMOD_LOCKED;
else
return FE_DVBS2_DEMOD_NOT_LOCKED;
}
/*****************************************************
**FUNCTION :: FE_DVBS2_GetFecStatus
**ACTION :: Return the DVBS2 FEC status Locked or not
**PARAMS IN :: hChip ==> handle to the chip
:: timeout ==> timeout to wait for FEC lock.
**PARAMS OUT:: NONE
**RETURN :: FEC STATE
*****************************************************/
FE_DVBS2_State FE_DVBS2_GetFecStatus(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int timeout)
{
int time=0,
Locked;
do
{
Locked=FE_DVBS2_GetDataLock(DeviceMap,IOHandle,1);
time++;
WAIT_N_MS_899(1);
}while((Locked==FALSE) &&(time<timeout));
if(Locked)
return FE_DVBS2_DATAOK;
else
return FE_DVBS2_FEC_NOT_LOCKED;
}
/*****************************************************
**FUNCTION :: FE_DVBS2_InitialCalculations
**ACTION :: Initialize DVBS2 UWP, CSM, carrier
and timing loop for Acquisition
**PARAMS IN :: hChip ==> handle to the chip
:: InitParams ==> Initializing parameters.
**PARAMS OUT:: NONE
**RETURN :: None
*****************************************************/
void FE_DVBS2_InitialCalculations(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_STB0899_DVBS2_InitParams_t *InitParams)
{
FE_DVBS2_UWPConfig_Params_t uwpParams;
FE_DVBS2_LoopBW_Params_t loopBW;
S32 numSteps,
freqStepSize,
acqcntrl2,
i=0;
U32 eqcoeffs[22] = {0,0,0,0,0,0,0,0,0,0,1024,0,0,0,0,0,0,0,0,0,0,0};
uwpParams.EsNoAve=ESNO_AVE;
uwpParams.EsNoQuant=ESNO_QUANT;
uwpParams.AveFramesCoarse=InitParams->AveFrameCoarse;
uwpParams.AveframesFine =InitParams->AveFramefine;
uwpParams.MissThreshold=MISS_THRESHOLD;
uwpParams.ThresholdAcq=UWP_THRESHOLD_ACQ;
uwpParams.ThresholdTrack=UWP_THRESHOLD_TRACK;
uwpParams.ThresholdSof=UWP_THRESHOLD_SOF;
uwpParams.SofSearchTimeout=SOF_SEARCH_TIMEOUT;
loopBW.LoopBwPercent=60;
loopBW.SymbolRate=InitParams->SymbolRate;
loopBW.MasterClock=InitParams->MasterClock;
loopBW.Mode=InitParams->ModeMode;
loopBW.Zeta=707;
loopBW.SymPeakVal=23;/**5.76*/
/* config uwp and csm */
FE_DVBS2_ConfigUWP(DeviceMap,IOHandle,uwpParams);
FE_DVBS2_AutoConfigCSM(DeviceMap,IOHandle);
/* initialize BTR */
FE_DVBS2_SetSymbolRate(DeviceMap,IOHandle,InitParams->SymbolRate,InitParams->MasterClock);
FE_DVBS2_SetBtrLoopBW(DeviceMap,IOHandle,loopBW);
if(InitParams->SymbolRate/1000000 >=15)
freqStepSize =(1<<17)/5;
else if(InitParams->SymbolRate/1000000 >=10)
freqStepSize =(1<<17)/7;
else if(InitParams->SymbolRate/1000000 >=5)
freqStepSize =(1<<17)/10;
else
freqStepSize =(1<<17)/3;
numSteps = (10* InitParams->FreqRange*(1<<17))/(freqStepSize * (InitParams->SymbolRate/1000000));
numSteps =(numSteps+6)/10;
numSteps = (numSteps ==0)?1:numSteps;
if(numSteps%2 == 0)
FE_DVBS2_SetCarrierFreq(DeviceMap,IOHandle,InitParams->CarrierFrequency-(InitParams->StepSize*(InitParams->SymbolRate/20000000)),(InitParams->MasterClock)/1000000);
else
FE_DVBS2_SetCarrierFreq(DeviceMap,IOHandle,InitParams->CarrierFrequency,(InitParams->MasterClock)/1000000);
/*Set Carrier Search params (zigzag, num steps and freq step size*/
acqcntrl2=(1<<25) |(numSteps<<17) |(freqStepSize);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_ACQCNTRL2,acqcntrl2);
}
/*****************************************************
**FUNCTION :: FE_DVBS2_Reacquire
**ACTION :: Trig a DVBS2 Acquisition
**PARAMS IN :: hChip ==> handle to the chip
**PARAMS OUT:: NONE
**RETURN :: None
*****************************************************/
void FE_DVBS2_Reacquire(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
S32 numSteps,
freqStepSize,
acqcntrl2,
i=0;
/* demod soft reset */
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_RESETCNTRL,1);
/*Reset Timing Loop*/
FE_DVBS2_BtrInit(DeviceMap,IOHandle);
/* reset Carrier loop */
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CRLFREQINIT,1<<30);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CRLFREQINIT,0);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CRLLOOPGAIN,0);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CRLPHSINIT,1<<30);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CRLPHSINIT,0);
/*release demod soft reset */
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_RESETCNTRL,0);
/* start acquistion process */
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_ACQUIRETRIG,1);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_LOCKLOST,0);
/* equalizer Init*/
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_EQUILIZERINIT,1);
/*Start equilizer*/
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_EQUILIZERINIT,0);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_EQCNTL,0x054800);
/*Reset Packet Delin*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_ALGOSWRST,FSTB0899_ALGOSWRST_INFO,1);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_ALGOSWRST,FSTB0899_ALGOSWRST_INFO,0);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_HYSTSWRST,FSTB0899_HYSTSWRST_INFO,1);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_HYSTSWRST,FSTB0899_HYSTSWRST_INFO,0);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_PDELCTRL,0x4a);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -