📄 drv0899.c
字号:
STTUNER_IOREG_GetContigousRegisters_SizeU32(DeviceMap, IOHandle, RSTB0899_EQUAI1,10,EqCoeffs);
}
return Params->State;
}
/*****************************************************
--FUNCTION :: FE_STB0899_SetMclk
--ACTION :: Set demod Master Clock
--PARAMS IN :: Handle ==> Front End Handle
:: Mclk : demod master clock
:: ExtClk external Quartz
--PARAMS OUT:: NONE.
--RETURN :: Error (if any)
--***************************************************/
FE_STB0899_Error_t FE_STB0899_SetMclk(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, U32 Mclk, FE_STB0899_InternalParams_t *Params)
{
FE_STB0899_Error_t error = FE_899_NO_ERROR;
U32 mDiv;
if(Params == NULL)
error=FE_899_INVALID_HANDLE;
else
{
mDiv = ((6*Mclk)/Params->Quartz)-1;
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_MDIV, FSTB0899_MDIV_INFO, mDiv);
Params->MasterClock=FE_STB0899_GetMclkFreq(DeviceMap, IOHandle, Params->Quartz);
}
return(FE_899_NO_ERROR);
}
/*****************************************************
--FUNCTION :: FE_STB0899_DVBS2Algo
--ACTION :: Locking Algo for DVBS2 Signal
--PARAMS IN :: Params => Pointer to FE_STB0899_InternalParams_t structure
--PARAMS OUT:: Params->State => Result of the check
--RETURN ::
--***************************************************/
FE_DVBS2_State FE_STB0899_DVBS2Algo(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_STB0899_InternalParams_t *Params, STTUNER_Handle_t TopLevelHandle)
{
S32 offsetfreq, pilots, searchTime, fecLockTime;
S16 iqSpectrum;
FE_DVBS2_ModCod_t modCode;
FE_STB0899_DVBS2_InitParams_t initParams;
STTUNER_InstanceDbase_t *Inst;
STTUNER_tuner_instance_t *TunerInstance;
ST_ErrorCode_t Error = ST_NO_ERROR;
/* top level public instance data */
Inst = STTUNER_GetDrvInst();
/* get the tuner instance for this driver from the top level handle */
TunerInstance = &Inst[TopLevelHandle].Sat.Tuner;
/*Init Params Initialization*/
initParams.RRCAlpha=Params->RrcAlpha;
initParams.SymbolRate=Params->DVBS2SymbolRate;
initParams.MasterClock=Params->MasterClock;
initParams.CarrierFrequency=Params->CenterFreq;/*carrier freq = 0?*/
initParams.AveFrameCoarse=Params->AveFrameCoarse;
initParams.AveFramefine=Params->AveFramefine;
initParams.StepSize=Params->StepSize;
/*Check for (1)Demod lock then (2)FEC lock for different symbol rates */
if(Params->DVBS2SymbolRate <= 2000000)
{
searchTime=5000; /*5000 ms time to lock UWP, CSM and FEC when SYMB <= 2Mbs */
fecLockTime=350; /*350 ms to lock the FEC only once the demod locked*/
}
else if(Params->DVBS2SymbolRate <= 5000000)
{
searchTime=2500; /*2500 ms time to lock UWP, CSM and FEC when 2Mbs< SYMB <= 5Mbs */
fecLockTime=170; /*170 ms to lock the FEC only once the demod locked*/
}
else if(Params->DVBS2SymbolRate <= 10000000)
{
searchTime=1500; /*1500 ms time to lock UWP, CSM and FEC when 5Mbs <SYMB <= 10Mbs */
fecLockTime=100; /*100 ms to lock the FEC only once the demod locked*/
}
else if (Params->DVBS2SymbolRate <= 15000000)
{
searchTime=500; /*700 ms time to lock UWP, CSM and FEC when 10Mbs <SYMB <= 15Mbs */
fecLockTime=70; /*70 ms to lock the FEC only once the demod locked*/
}
else if (Params->DVBS2SymbolRate <= 20000000)
{
searchTime=300; /*500 ms time to lock UWP, CSM and FEC when 15Mbs < SYMB <= 20Mbs */
fecLockTime=50; /*50 ms to lock the FEC only once the demod locked*/
}
else if (Params->DVBS2SymbolRate <= 25000000)
{
searchTime=250; /*250 ms time to lock UWP, CSM and FEC when 20 Mbs < SYMB <= 25Mbs */
fecLockTime=25; /*30 ms to lock the FEC only once the demod locked*/
}
else
{
searchTime=150; /*150 ms time to lock UWP, CSM and FEC when SYMB > 25Mbs */
fecLockTime=20; /*20 ms to lock the FEC only once the demod locked*/
}
Params->SubRange = 12000000;
initParams.FreqRange = Params->SubRange/1000000;
Params->Frequency = Params->BaseFreq;
Params->TunerOffset = 0;
Params->SubDir = 1;
/*Maintain Stream Merger in reset during acquisition*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_FRESRS,FSTB0899_FRESRS_INFO,1);
FE_DVBS2_InitialCalculations(DeviceMap,IOHandle,&initParams);
/*IQ swap setting*/
if(Params->SpectralInv == STTUNER_IQ_MODE_NORMAL)
{
/* I,Q Spectrum Set to Normal*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO,0);
}
else if(Params->SpectralInv == STTUNER_IQ_MODE_INVERTED)
{
/* I,Q Spectrum Inverted*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO,1);
}
else
{
/* I,Q Auto use last "successful search" value first */
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO,Params->IQLocked);
}
do{
Error |= (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, (U32)Params->Frequency , (U32 *)&Params->Frequency); /* Move the tuner */
if(Error != ST_NO_ERROR)
{
return(FE_DVBS2_NOAGC);
}
/* Temporisations */
WAIT_N_MS_899(10); /* Wait for agc1,agc2 and timing loop */
tuner_tunsdrv_Utilfunction(TunerInstance->DrvHandle, VCO_SEARCH_OFF);
FE_STB0899_WaitTuner(TunerInstance,100); /* Is tuner Locked ? (wait 100 ms maxi) */
/*Set IF AGC to Acquire value*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_IF_LOOPGAIN,FSTB0899_IF_LOOPGAIN_INFO,4);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_IF_AGCREF,FSTB0899_IF_AGCREF_INFO,32);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_IF_AGC_DUMPPER,FSTB0899_IF_AGC_DUMPPER_INFO,0);
FE_DVBS2_Reacquire(DeviceMap,IOHandle);
/*Wait for UWP,CSM and DATA LOCK 70ms max*/
Params->Results.DVBS2SignalType=Params->DVBS2State=FE_DVBS2_GetDemodStatus(DeviceMap,IOHandle,searchTime);
if(Params->DVBS2State==FE_DVBS2_DEMOD_LOCKED)
{
/*Demod Locked, check the FEC */
Params->Results.DVBS2SignalType=Params->DVBS2State=FE_DVBS2_GetFecStatus(DeviceMap,IOHandle,fecLockTime);
}
if(Params->DVBS2State!=FE_DVBS2_DATAOK)
{
if(Params->SpectralInv == STTUNER_IQ_MODE_AUTO)
{
iqSpectrum=STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO);
/* I,Q Spectrum Inverted*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO,!iqSpectrum);
/* start acquistion process */
FE_DVBS2_Reacquire(DeviceMap,IOHandle);
/*Whait for UWP,CSM and data LOCK 200ms max*/
Params->Results.DVBS2SignalType=Params->DVBS2State=FE_DVBS2_GetDemodStatus(DeviceMap,IOHandle,searchTime);
if(Params->DVBS2State == FE_DVBS2_DEMOD_LOCKED)
Params->IQLocked=!iqSpectrum;
}
}
if(Params->DVBS2State!=FE_DVBS2_DATAOK)
{
FE_899_NextSubRange(Params);
}
}
while(Params->SubRange && Params->DVBS2State!=FE_DVBS2_DATAOK);
if(Params->DVBS2State==FE_DVBS2_DATAOK)
{
modCode = Params->Results.ModCode=(FE_DVBS2_ModCod_t)FE_DVBS2_GetModCod(DeviceMap, IOHandle);
pilots = Params->Results.Pilots=STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_UWP_DECODED_MODCODE, FSTB0899_UWP_DECODED_MODCODE_INFO)&0x01;
Params->Results.FrameLength= (FE_DVBS2_FRAME)((STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_UWP_DECODED_MODCODE, FSTB0899_UWP_DECODED_MODCODE_INFO)>>1)&0x01);
if((((10*Params->MasterClock)/(Params->DVBS2SymbolRate/10))<=400)&&(INRANGE(FE_QPSK_23,modCode,FE_QPSK_910))&&(pilots==1))
{
FE_DVBS2_CSMInitialize(DeviceMap,IOHandle,pilots,modCode,Params->DVBS2SymbolRate,Params->MasterClock);
/*Wait for UWP,CSM and data LOCK 20ms max*/
Params->Results.DVBS2SignalType=Params->DVBS2State=FE_DVBS2_GetFecStatus(DeviceMap,IOHandle,fecLockTime);
}
if((((10*Params->MasterClock)/(Params->DVBS2SymbolRate/10))<=400)&&(INRANGE(FE_QPSK_12,modCode,FE_QPSK_35))&&(pilots==1))
{
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_EQ_DISABLE_UPDATE,FSTB0899_EQ_DISABLE_UPDATE_INFO,1);
}
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_EQ_SHIFT,FSTB0899_EQ_SHIFT_INFO,0x2);
offsetfreq = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_CRL_FREQUENCY, FSTB0899_CRL_FREQUENCY_INFO);
offsetfreq = offsetfreq/(S32)(FE_899_PowOf2(30)/1000);
offsetfreq *= (S32)(Params->MasterClock/1000000);
if(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO))
offsetfreq*=-1;
Params->Results.Frequency = (U32)(Params->Frequency - offsetfreq);
if((Params->Results.Frequency > Params->BaseFreq + Params->SearchRange/2000) || (Params->Results.Frequency < Params->BaseFreq - Params->SearchRange/2000))
{
Params->DVBS2State = FE_DVBS2_OUTOFRANGE;
return Params->DVBS2State;
}
if(!Inst[TopLevelHandle].Sat.ScanExact)
{
Params->Results.DVBS2SymbolRate=FE_DVBS2_GetSymbolRate(DeviceMap, IOHandle, Params->MasterClock);
}
else
{
Params->Results.DVBS2SymbolRate = Params->DVBS2SymbolRate;
}
/*if offset Frequency >5MHz Tuner centring */
if(offsetfreq>6000)
{
Error |= (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, (U32)Params->Results.Frequency , (U32 *)&Params->Frequency); /* Move the tuner */
}
/*Set IF AGC to tracquing value*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_IF_LOOPGAIN,FSTB0899_IF_LOOPGAIN_INFO,3);
/*if QPSK 1/2,QPSK 3/5 or QPSK 2/3 set IF AGC reference to 16 otherwise 32*/
if(INRANGE(FE_QPSK_12,Params->Results.ModCode,FE_QPSK_23))
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_IF_AGCREF,FSTB0899_IF_AGCREF_INFO,16); /*Write field Image*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_IF_AGC_DUMPPER,FSTB0899_IF_AGC_DUMPPER_INFO,7);
}
/*Release Stream Merger Reset*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_FRESRS,FSTB0899_FRESRS_INFO,0);
return Params->DVBS2State;
}
/*****************************************************
--FUNCTION :: FE_STB0899_GetRFLevel
--ACTION :: Return power of the signal
--PARAMS IN :: NONE
--PARAMS OUT:: NONE
--RETURN :: Power of the signal (dBm), -100 if no signal
--***************************************************/
S32 FE_STB0899_GetRFLevel(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,STTUNER_FECType_t FECType, STTUNER_FECMode_t FECMode)
{
S32 agcGain = 0,
Imin,
Imax,
i,
rfLevel = 0;
FE_STB0899_LOOKUP_t *lookup;
lookup = &FE_STB0899_RF_LookUp;
if(FECType == STTUNER_FEC_MODE_DVBS2)
lookup = &FE_STB0899_DVBS2RF_LookUp;
if((lookup != NULL) && lookup->size)
{
if((FECType == STTUNER_FEC_MODE_DVBS1) || (FECMode == STTUNER_FEC_MODE_DIRECTV))
{
agcGain = STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_AGCIQ_VALUE,FSTB0899_AGCIQ_VALUE_INFO);
}
else if(FECType == STTUNER_FEC_MODE_DVBS2)
{
agcGain = STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_IF_AGCGAIN,FSTB0899_IF_AGCGAIN_INFO);
}
Imin = 0;
Imax = lookup->size-1;
if(INRANGE(lookup->table[Imin].regval,agcGain,lookup->table[Imax].regval))
{
while((Imax-Imin)>1)
{
i=(Imax+Imin)/2;
if(INRANGE(lookup->table[Imin].regval,agcGain,lookup->table[i].regval))
Imax = i;
else
Imin = i;
}
rfLevel = (((S32)agcGain - lookup->table[Imin].regval)
* (lookup->table[Imax].realval - lookup->table[Imin].realval)
/ (lookup->table[Imax].regval - lookup->table[Imin].regval))
+ lookup->table[Imin].realval;
}
else
rfLevel = -100;
}
return rfLevel*10;
}
/*****************************************************
--FUNCTION :: FE_STB0899_GetCarrierQuality
--ACTION :: Return the carrier to noise of the current carrier
--PARAMS IN :: NONE
--PARAMS OUT:: NONE
--RETURN :: C/N of the carrier, 0 if no carrier
--***************************************************/
int FE_STB0899_GetCarrierQuality(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,STTUNER_FECType_t FECType, STTUNER_FECMode_t FECMode)
{
int c_n = 0,
quant,
regval,
Imin,
Imax,
i;
long val2 = 0;
long coeff2log10 = 646456993;
FE_STB0899_LOOKUP_t *lookup;
lookup = &FE_STB0899_CN_LookUp;
U32 nirm[2];
if((FECType == STTUNER_FEC_MODE_DVBS1) || (FECMode == STTUNER_FEC_MODE_DIRECTV))
{
if(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_CARRIER_FOUND,FSTB0899_CARRIER_FOUND_INFO))
{
if((lookup != NULL) && lookup->size)
{
STTUNER_IOREG_GetContigousRegisters_SizeU32(DeviceMap, IOHandle,RSTB0899_NIRM,2,nirm);
regval = MAKEWORD(nirm[0],nirm[1]);
Imin = 0;
Imax = lookup->size-1;
if(INRANGE(lookup->table[Imin].regval,regval,lookup->table[Imax].regval))
{
while((Imax-Imin)>1)
{
i=(Imax+Imin)/2;
if(INRANGE(lookup->table[Imin].regval,regval,lookup->table[i].regval))
Imax = i;
else
Imin = i;
}
c_n = ((regval - lookup->table[Imin].regval)
* (lookup->table[Imax].realval - lookup->table[Imin].realval)
/ (lookup->table[Imax].regval - lookup->table[Imin].regval))
+ lookup->table[Imin].realval;
}
else if(regval<lookup->table[Imin].regval)
c_n = 100;
}
}
}
else if(FECType == STTUNER_FEC_MODE_DVBS2)
{
quant=STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_UWP_ESN0_QUANT, FSTB0899_UWP_ESN0_QUANT_INFO);
c_n=FE_DVBS2_GetUWPEsNo(DeviceMap,IOHandle,quant);
if(c_n ==1)
c_n = 301;
else if(c_n == 2)
c_n = 270;
else
{
val2 = (long)(-1*(Log10Int((long)(c_n))-2*Log10Int((long)(quant))));
val2 = MULT32X32(val2,coeff2log10);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -