?? driv0299.c
字號:
(pParams->DerotFreq * pParams->Mclk)/1000); /* cast to eliminate compiler warning --SFS */ if((TransponderFrequency >= pParams->BaseFreq - RangeOffset) && (TransponderFrequency <= pParams->BaseFreq + RangeOffset)) pParams->State = RANGEOK; else pParams->State = OUTOFRANGE; return pParams->State;}/****************************************************--FUNCTION :: CarrierNotCentered--ACTION :: Check if the carrier is correctly centered--PARAMS IN ::--PARAMS OUT::--RETURN :: 1 if not centered, 0 otherwise--***************************************************/int CarrierNotCentered(STV0299_ControlBlock_t *Dev_p, SEARCHPARAMS *pParams, int AllowedOffset){ int NotCentered = 0, DerotFreq, Fs; Fs = (int)(CarrierWidth(pParams->SymbolRate, pParams->RollOff)); /* cast to eliminate compiler warning --SFS */ DerotFreq = ABS((int)pParams->DerotFreq * (int)pParams->Mclk); /* cast with macro to eliminate compiler warning --SFS */ if((pParams->TunerIF == 0) && (Fs < 4000000)) NotCentered = (int)((pParams->TunerBW - Fs)/4) ; /* cast to eliminate compiler warning --SFS */ else NotCentered = (((int)pParams->TunerBW/2 - DerotFreq - Fs/2) < AllowedOffset) && (DerotFreq > pParams->TunerStep); /* cast to eliminate compiler warning --SFS */ return NotCentered;}/****************************************************--FUNCTION :: TunerCentering--ACTION :: Optimisation of the tuner position to allow frequency variations--PARAMS IN :: pParams--PARAMS OUT:: pResult--RETURN :: DATAOK if success--**************************************************/SIGNALTYPE TunerCentering(STV0299_ControlBlock_t *Dev_p, SEARCHPARAMS *pParams, SEARCHRESULT *pResult, int AllowedOffset){ int /* NotCentered = 0, */ /*NotCentered not used in this function; compiler warning --SFS */ DerotFreq,MinOffset,MaxOffset, CentringFrequency, TransponderFrequency, Fs,sign; Fs = (int)CarrierWidth(pParams->SymbolRate,pParams->RollOff); /* cast to eliminate compiler warning --SFS */ DerotFreq = ABS((int)pParams->DerotFreq * (int)pParams->Mclk);/* cast to eliminate compiler warning --SFS */ if((pParams->TunerIF == 0) && (Fs < 4000000)) MinOffset = 2000000; else MinOffset = 0; MaxOffset = MAX((int)(pParams->TunerBW)/2 - Fs/2- AllowedOffset,MinOffset + (int)(pParams->TunerStep)); /* casts to eliminate compiler warning --SFS */ if(!INRANGE(MinOffset,DerotFreq,MaxOffset) || (CheckData(Dev_p, pParams)==NODATA)) { sign = (pParams->DerotFreq > 0) ? 1:-1; TransponderFrequency = (int)(pParams->Frequency + (pParams->DerotFreq * pParams->Mclk)/1000); /* cast to eliminate compiler warning --SFS */ CentringFrequency = TransponderFrequency + (sign*MinOffset)/1000; TNR_SetFrequency(TNR_HANDLE(Dev_p), CentringFrequency, (U32 *)&CentringFrequency); WaitTuner(Dev_p, 100); /* Is tuner Locked ? (wait 100 ms maxi) */ /* Reset Derotator */ pParams->DerotFreq = (short int)(((TransponderFrequency - CentringFrequency)*1000)/(int)pParams->Mclk); /* casts to eliminate compiler warning --SFS */ pParams->Frequency = CentringFrequency; pParams->Direction = 1; FieldSetVal(Dev_p, DEROTATORFREQUENCYMSB,MSB(pParams->DerotFreq)); FieldSetVal(Dev_p, DEROTATORFREQUENCYLSB,LSB(pParams->DerotFreq)); RegSetRegisters(Dev_p, R_CFRM,2); /* Wait for agc1,agc2 and timing loop */ SystemWaitFor(pParams->Tagc1 + pParams->Tagc2 + pParams->Ttiming); if(SearchCarrier(Dev_p, pParams, pResult) == CARRIEROK) /* Search for carrier */ SearchData(Dev_p, pParams, pResult); /* Search for data */ } return pParams->State;}/****************************************************--FUNCTION :: FirstSubRange--ACTION :: Compute the first SubRange of the search--PARAMS IN :: pParams->SearchRange--PARAMS OUT:: pParams->SubRange--RETURN :: NONE--***************************************************/SIGNALTYPE FirstSubRange(STV0299_ControlBlock_t *Dev_p, SEARCHPARAMS *pParams){ int maxsubrange; maxsubrange = (int)(pParams->TunerBW - CarrierWidth(pParams->SymbolRate,pParams->RollOff)/2); /* cast to eliminate compiler warning --SFS */ pParams->SubRange = MIN(pParams->SearchRange,maxsubrange); pParams->Frequency = pParams->BaseFreq; pParams->TunerOffset = 0L; pParams->SubDir = 1; if(pParams->TunerBW > CarrierWidth(pParams->SymbolRate,pParams->RollOff/2)) pParams->State = BWOK; else pParams->State = BWTOONARROW; return pParams->State;}/****************************************************--FUNCTION :: NextSubRange--ACTION :: Compute the next SubRange of the search--PARAMS IN :: Frequency -> Start frequency-- pParams->SearchRange--PARAMS OUT:: pParams->SubRange--RETURN :: NONE--***************************************************/void NextSubRange(STV0299_ControlBlock_t *Dev_p, SEARCHPARAMS *pParams){ long OldSubRange; if(pParams->SubDir > 0) { OldSubRange = pParams->SubRange; pParams->SubRange = MIN((pParams->SearchRange/2) - (pParams->TunerOffset + pParams->SubRange/2), pParams->SubRange); pParams->TunerOffset += (OldSubRange + pParams->SubRange)/2; } pParams->Frequency = pParams->BaseFreq + (pParams->SubDir * pParams->TunerOffset)/1000; pParams->SubDir = -pParams->SubDir;}/*****************************************************--FUNCTION :: AutoSearchAlgo--ACTION :: Search for Signal, Timing, Carrier and then data at a given Frequency,-- in a given range--PARAMS IN :: NONE--PARAMS OUT:: NONE--RETURN :: Type of the founded signal (if any)--***************************************************/SIGNALTYPE AutoSearchAlgo(STV0299_ControlBlock_t *Dev_p){ int errorrate,sn,to,hy; SEARCHPARAMS *pParams; SEARCHRESULT *pResult; pParams = &Dev_p->Params; pResult = &Dev_p->Result; pParams->BaseFreq = pParams->Frequency; /* Insert I2C access here */ RegTriggerOn(Dev_p); /*______________________________________TRIGGER____________________________________________*/ RegSetSymbolRate(Dev_p, pParams->SymbolRate); /* Set the symbol rate */ RegGetOneRegister(Dev_p, R_PR); RegGetOneRegister(Dev_p, R_VSEARCH); /* Get fields value */ sn=FieldGetVal(Dev_p, SN); to=FieldGetVal(Dev_p, TO); hy=FieldGetVal(Dev_p, H); errorrate=FieldGetVal(Dev_p, RATE); RegTriggerOff(Dev_p); /*______________________________________TRIGGER____________________________________________*/ /* Initial calculations */ RegTriggerOn(Dev_p); /*______________________________________TRIGGER____________________________________________*/ pParams->DerotStep = (short int)(pParams->DerotPercent*(pParams->SymbolRate/1000L)/pParams->Mclk); /* saut de DerotStep/1000 * Fsymbol */ /* cast to eliminate compiler warning --SFS */ pParams->Ttiming = (short int)(CalcTimingTimeConstant(pParams->SymbolRate)); /* cast to eliminate compiler warning --SFS */ pParams->Tderot = (short int)(2 + 20 * CalcDerotTimeConstant(pParams->SymbolRate)); /* cast to eliminate compiler warning --SFS */ pParams->Tdata = (short int)(2 * CalcDataTimeConstant(errorrate,sn,to,hy,pParams->SymbolRate)); /* cast to eliminate compiler warning --SFS */ RegTriggerOff(Dev_p); /*______________________________________TRIGGER____________________________________________*/ if (FirstSubRange(Dev_p, pParams) == BWOK) { do { /* Initialisations */ FieldSetVal(Dev_p, DEROTATORFREQUENCYMSB,0); FieldSetVal(Dev_p, DEROTATORFREQUENCYLSB,0); RegSetRegisters(Dev_p, R_CFRM,2); /* Reset of the derotator frequency */ RegSetField(Dev_p, RTF, 0); RegSetField(Dev_p, CFD_ALGO, 1); pParams->DerotFreq = 0; pParams->State = NOAGC1; RegTriggerOn(Dev_p); /*______________________________________TRIGGER____________________________________________*/ TNR_SetFrequency(TNR_HANDLE(Dev_p), (U32)pParams->Frequency, (U32 *)&pParams->Frequency); /* cast on pParams->Frequency to eliminate compiler warning --SFS */ RegTriggerOff(Dev_p); /*______________________________________TRIGGER____________________________________________*/ /* Temporisations */ RegTriggerOn(Dev_p); /*______________________________________TRIGGER____________________________________________*/ SystemWaitFor(pParams->Tagc1 + pParams->Tagc2 + pParams->Ttiming); /* Wait for agc1,agc2 and timing loop */ WaitTuner(Dev_p, 100); /* Is tuner Locked ? (wait 100 ms maxi) */ RegTriggerOff(Dev_p); /*______________________________________TRIGGER____________________________________________*/ RegTriggerOn(Dev_p); /*______________________________________TRIGGER____________________________________________*/ if(CheckAgc1(Dev_p, pParams)>AGC1SATURATION) { /* There is signal in the band */ if(pParams->SymbolRate <= pParams->SubRange/2L) SearchTiming(Dev_p, pParams,pResult); /* For low rates (SCPC) */ else CheckTiming(Dev_p, pParams); /* For high rates (MCPC) */ if(pParams->State == TIMINGOK) { if(SearchCarrier(Dev_p, pParams,pResult) == CARRIEROK) /* Search for carrier */ { if(SearchData(Dev_p, pParams,pResult) == DATAOK) /* Check for data */ { if(Dev_p->ScanMode != SCAN) TunerCentering(Dev_p, pParams, pResult, 200000); if(CheckRange(Dev_p, pParams,pResult) == RANGEOK) { pResult->Frequency = pParams->Frequency + (pParams->DerotFreq*(pParams->Mclk)/1000); pResult->PunctureRate = RegGetField(Dev_p, CPR); } } } } } if(pParams->State != RANGEOK) NextSubRange(Dev_p, pParams); RegTriggerOff(Dev_p); /*______________________________________TRIGGER____________________________________________*/ } while(pParams->SubRange && pParams->State!=RANGEOK); } pResult->SignalType = pParams->State; return pParams->State;}/*****************************************************--FUNCTION :: SetLnb--ACTION :: set the Lnb--PARAMS IN :: Lnb -> true for LnbHigh, false for LnbLow--PARAMS OUT:: NONE--RETURN :: NONE--***************************************************/void SetLnb(STV0299_ControlBlock_t *Dev_p, int Lnb){ /* RegSetField(Dev_p, OP0VALUE,Lnb); */#if defined(mb5518)/* RegSetField(Dev_p, OP0VALUE,Lnb);*/ /* For EVAL5508 */ if (Lnb == 0) /* FORCE */ { /* Low band -> no 22KHz tone */ RegSetField(Dev_p, DISEQCMODE, 0x0); } if (Lnb == 1) { /* High band -> 22KHz tone */ RegSetField(Dev_p, DISEQCMODE, 0x3); }#else RegSetField(Dev_p, OP0VALUE,Lnb);#endif}/*****************************************************--FUNCTION :: CarrierTracking--ACTION :: Track the carrier--PARAMS IN :: NONE--PARAMS OUT:: NONE--RETURN :: New frequency of the carrier--***************************************************/int CarrierTracking(STV0299_ControlBlock_t *Dev_p){ if(Dev_p->Result.SignalType == RANGEOK) TunerCentering(Dev_p, &Dev_p->Params, &Dev_p->Result, 2000000); return (int)Dev_p->Params.Frequency;}/*****************************************************--FUNCTION :: SetPolarization--ACTION :: set the polarization--PARAMS IN :: Polarization -> Polarization--PARAMS OUT:: NONE--RETURN :: NONE--***************************************************/void SetPolarization(STV0299_ControlBlock_t *Dev_p, POLARIZATION Polarization){ if(Polarization == VERTICAL) RegSetField(Dev_p, LOCKOUTPUT,0); else RegSetField(Dev_p, LOCKOUTPUT,1);}void GetNoiseEstimator(STV0299_ControlBlock_t *Dev_p, U32 *Noise_p, U32 *Ber_p){ U32 LutHigh, LutLow, Real, RealLow, RealHigh, CN, Ber; LUT_t *Lut_p; RegGetRegisters(Dev_p, R_NIRH, 2); Real = MAKEWORD(FieldGetVal(Dev_p, NOISEINDICATORMSB), FieldGetVal(Dev_p, NOISEINDICATORLSB)); Lut_p = (LUT_t *)SignalNoiseLUT; while (Lut_p->Real >= Real && Lut_p->Real != ((U32)-1)) Lut_p++; if (Lut_p->Real != ((U32)-1)) { RealHigh = (U32)(Lut_p-1)->Real; LutLow = (U32)(Lut_p-1)->Lookup; RealLow = (U32)Lut_p->Real; LutHigh = (U32)Lut_p->Lookup; CN = INTERPOLATE(-LutLow, -LutHigh, -RealLow, -RealHigh, -Real); } else CN = 0; Lut_p = (LUT_t *)BerLUT; while (Lut_p->Real >= Real && Lut_p->Real != ((U32)-1)) Lut_p++; if (Lut_p->Real != ((U32)-1)) { RealHigh = (U32)(Lut_p-1)->Real; LutLow = (U32)Lut_p->Lookup; RealLow = (U32)Lut_p->Real; LutHigh = (U32)(Lut_p-1)->Lookup; Ber = INTERPOLATE(LutLow, LutHigh, RealLow, RealHigh, Real); } else Ber = 200000; *Ber_p = Ber; *Noise_p = -CN;}U8 GetPowerEstimator(STV0299_ControlBlock_t *Dev_p){ S32 LutHigh, LutLow, Real, RealLow, RealHigh; LUT_t *Lut_p = (LUT_t *)AgcLUT; U8 Power; Real = RegGetField(Dev_p, AGCINTEGRATORVALUE); while (Lut_p->Real >= Real && Lut_p->Real != ((U32)-1)) Lut_p++; if (Lut_p->Real != ((U32)-1)) { RealHigh = (Lut_p-1)->Real; LutLow = Lut_p->Lookup; RealLow = Lut_p->Real; LutHigh = (Lut_p-1)->Lookup; Power = (U8)INTERPOLATE(LutLow, LutHigh, RealLow, RealHigh, Real); } else Power = 255; return Power;}/* End of driv0299.c */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -