📄 stb0899_drv.c
字号:
FE_STB0899_CheckTiming(pParams); /*For high rates (MCPC)*/
if(pParams->State == TIMINGOK)
{
if(FE_STB0899_SearchCarrier(pParams) == CARRIEROK)
{
/*Check for data*/
if(FE_STB0899_SearchData(pParams) == DATAOK)
{
if(FE_STB0899_CheckRange(pParams) == RANGEOK)
{
pParams->Results.Frequency = pParams->Frequency + (pParams->DerotFreq * (pParams->Mclk) / 1000);
pParams->Results.PunctureRate = (FE_STB0899_Rate_t)ChipGetField(pParams->hDemod, FSTB0899_VIT_CURPUN);
}
}
}
}
if(pParams->State != RANGEOK)
NextSubRange(pParams);
ChipSetField(pParams->hDemod, FSTB0899_FRESRS, 0); /*release Stream merger reset*/
ChipSetField(pParams->hDemod, FSTB0899_CFD_ON, 0); /*Disable Carrier detector*/
ChipGetRegisters(pParams->hDemod, RSTB0899_EQUAI1, 10);
pParams->Results.SignalType = pParams->State;
/*if locked and range is ok set Kdiv value*/
if(pParams->State == RANGEOK)
{
switch(pParams->Results.PunctureRate)
{
case 13: /*1/2*/
ChipSetField(pParams->hDemod, FSTB0899_KDIVIDER, 0x1a/*36*/);
break;
case 18: /*2/3*/
ChipSetField(pParams->hDemod, FSTB0899_KDIVIDER, 44/*0x27*/);
break;
case 21: /*3/4*/
ChipSetField(pParams->hDemod, FSTB0899_KDIVIDER,/*0x34*/60);
break;
case 24: /*5/6*/
ChipSetField(pParams->hDemod, FSTB0899_KDIVIDER,75/*0x4f*/);
break;
case 25: /*6/7*/
ChipSetField(pParams->hDemod, FSTB0899_KDIVIDER,/*0x5c*/80);
break;
case 26: /*7/8*/
ChipSetField(pParams->hDemod, FSTB0899_KDIVIDER,94/*0x6a*/);
break;
}
}
return pParams->State;
}
FE_DVBS2_State
FE_STB0899_DVBS2Algo(FE_STB0899_InternalParams_t *pParams)
{
FE_STB0899_DVBS2_InitParams_t initParams;
FE_DVBS2_ReacquireParams_t racqParams;
FE_DVBS2_ModCod_t modCode;
S32 offsetfreq,searchTime,pilots;
/*Init Params Initialization*/
initParams.RRCAlpha = pParams->RrcAlpha;
initParams.ModeMode = pParams->mod;
initParams.SymbolRate = pParams->DVBS2SymbolRate;
initParams.MasterClock = pParams->MasterClock;
initParams.CarrierFrequency = 0;
initParams.AveFrameCoarse = pParams->AveFrameCoarse;
initParams.AveFramefine = pParams->AveFramefine;
initParams.AgcThreshold = pParams->AgcThreshold;
/*Reacquire Params initialization*/
racqParams.AcqMode = pParams->AcqMode;
racqParams.SymbolRate = pParams->DVBS2SymbolRate;
racqParams.MasterClock = pParams->MasterClock;
racqParams.FreqRange = pParams->SearchRange / 1000000/*pParams->FreqRange*/;
racqParams.CenterFreq = pParams->CenterFreq;
racqParams.AveFrameCoarseAcq = pParams->AveFrameCoarseAcq;
racqParams.AveFramefineAcq = pParams->AveFramefineAcq;
racqParams.AveFrameCoarseTrq = pParams->AveFrameCoarseTrq;
racqParams.AveFramefineTrq = pParams->AveFramefineTrq;
racqParams.AutoReacq = pParams->AutoReacq;
racqParams.TracklockSel = pParams->TracklockSel;
racqParams.Zigzag = pParams->Zigzag;
racqParams.StepSize = pParams->StepSize;
if(pParams->DVBS2SymbolRate <= 2000000)
searchTime = 5000;
else if(pParams->DVBS2SymbolRate <= 5000000)
searchTime = 2500;
else if(pParams->DVBS2SymbolRate <= 10000000)
searchTime = 1500;
else if (pParams->DVBS2SymbolRate <= 15000000)
searchTime = 700;
else if (pParams->DVBS2SymbolRate <= 20000000)
searchTime = 500;
else if (pParams->DVBS2SymbolRate <= 25000000)
searchTime = 200;
else
searchTime = 150;
/*move tuner*/
TunerSetFrequency(pParams->hTuner, pParams->Frequency);
pParams->Frequency = TunerGetFrequency(pParams->hTuner);
/*Temporisations*/
WaitTuner(pParams->hTuner, 100); /*Is tuner Locked?(wait 100 ms maxi)*/
/*Set IF AGC to Acquire value*/
ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_LOOPGAIN, 4);
ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL, 1);
ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_AGC_DUMPPER, 0);
ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL2, 1);
/*Initialisations*/
FE_DVBS2_InitialCalculations(pParams->hDemod, &initParams);
/*IQ swap setting*/
if((pParams->SpectralInv == FE_IQ_AUTO) || (pParams->SpectralInv == FE_IQ_NORMAL))
{
/* I,Q Spectrum Set to Normal*/
ChipSetFieldImage(pParams->hDemod, FSTB0899_SPECTRUM_INVERT, 0);
ChipSetRegisters(pParams->hDemod, RSTB0899_DMDCNTRL2, 1);
}
else
{
/* I,Q Spectrum Inverted*/
ChipSetFieldImage(pParams->hDemod, FSTB0899_SPECTRUM_INVERT, 1);
ChipSetRegisters(pParams->hDemod, RSTB0899_DMDCNTRL2, 1);
}
FE_DVBS2_Reacquire(pParams->hDemod, &racqParams);
/*Wait for UWP,CSM and DATA LOCK searchTime ms max*/
pParams->Results.DVBS2SignalType = pParams->DVBS2State = FE_DVBS2_GetState(pParams->hDemod, searchTime);
if(pParams->DVBS2State != FE_DVBS2_DATAOK)
{
if(pParams->SpectralInv == FE_IQ_AUTO)
{
/* I,Q Spectrum Invertion*/
ChipSetFieldImage(pParams->hDemod, FSTB0899_SPECTRUM_INVERT, 1);
ChipSetRegisters(pParams->hDemod, RSTB0899_DMDCNTRL2, 1);
/* start acquistion process */
FE_DVBS2_Reacquire(pParams->hDemod, &racqParams);
/*Whait for UWP,CSM and data LOCK 200ms max*/
pParams->Results.DVBS2SignalType = pParams->DVBS2State = FE_DVBS2_GetState(pParams->hDemod, searchTime);
if(pParams->DVBS2State == FE_DVBS2_DATAOK)
pParams->SpectralInv = FE_IQ_SWAPPED;
}
}
/*Set IF AGC to tracking value*/
ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_LOOPGAIN, 3);
ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL, 1);
ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_AGC_DUMPPER, 7);
ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL2, 1);
if(pParams->DVBS2State == FE_DVBS2_DATAOK)
{
modCode = (FE_DVBS2_ModCod_t)FE_DVBS2_GetModCod(pParams->hDemod);
pilots=ChipGetFieldImage(pParams->hDemod, FSTB0899_UWP_DECODED_MODCODE) & 0x01;
if((((10*pParams->MasterClock) / (pParams->DVBS2SymbolRate/10)) <= 400) && (INRANGE(FE_QPSK_12, modCode, FE_QPSK_910)) && (pilots == 1))
{
FE_DVBS2_CSMInitialize(pParams->hDemod, pilots, modCode, pParams->DVBS2SymbolRate, pParams->MasterClock);
/*Wait for UWP,CSM and data LOCK 20ms max*/
pParams->Results.DVBS2SignalType = pParams->DVBS2State = FE_DVBS2_GetState(pParams->hDemod, 20);
}
/*if locked store signal parameters*/
offsetfreq = ChipGetField(pParams->hDemod, FSTB0899_CRL_FREQUENCY);
offsetfreq = offsetfreq / (PowOf2(30) / 1000);
offsetfreq *= (pParams->MasterClock / 1000000);
if(ChipGetFieldImage(pParams->hDemod, FSTB0899_SPECTRUM_INVERT))
offsetfreq *= -1;
pParams->Results.Frequency = TunerGetFrequency(pParams->hTuner) - offsetfreq;
pParams->Results.DVBS2SymbolRate = FE_DVBS2_GetSymbolRate(pParams->hDemod, pParams->MasterClock);
pParams->Results.ModCode = (FE_DVBS2_ModCod_t)FE_DVBS2_GetModCod(pParams->hDemod);
pParams->Results.Pilots = (BOOL)ChipGetFieldImage(pParams->hDemod, FSTB0899_UWP_DECODED_MODCODE) & 0x01;
pParams->Results.FrameLength = (FE_DVBS2_FRAME)((ChipGetFieldImage(pParams->hDemod, FSTB0899_UWP_DECODED_MODCODE) >> 1) & 0x01);
/*Set AGC init value to to the founded AGC level*/
pParams->AgcGain = ChipGetField(pParams->hDemod, FSTB0899_IF_AGCGAIN);
ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_GAININIT, pParams->AgcGain);
ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL, 1);
/*if QPSK 1/2 ,QPSK 3/5 or QPSK 2/3 set IF AGC reference to 16 otherwise 32*/
if(pParams->Results.ModCode <= FE_QPSK_23)
{
ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_AGCREF, 16);
ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL, 1);
}
else
{
ChipSetFieldImage(pParams->hDemod,FSTB0899_IF_AGCREF,32);
ChipSetRegisters(pParams->hDemod,RSTB0899_IFAGCCNTRL,1);
}
}
return pParams->DVBS2State;
}
/*Symbol Rate in Hz,Mclk in Hz */
static void
FE_STB0899_SetIterScal(STCHIP_Handle_t hChip, u32 MasterClock, u32 SymbolRate)
{
S32 iTerScal;
iTerScal = 17 * (MasterClock / 1000);
iTerScal += 410000;
iTerScal /= (SymbolRate / 1000000);
iTerScal /= 1000;
if(iTerScal > 150)
iTerScal = 150;
ChipSetField(hChip, FSTB0899_ITERATION_SCALE, iTerScal);
}
/*****************************************************
--FUNCTION :: FE_STB0899_Init
--ACTION :: Initialisation of the STB0899 chip
--PARAMS IN :: pInit==>pointer to stb0899_state structure
--PARAMS OUT :: NONE
--RETURN :: Handle to STB0899
--***************************************************/
FE_STB0899_Handle_t
FE_STB0899_Init(FE_STB0899_InitParams_t *pInit)
{
FE_STB0899_InternalParams_t *pParams = NULL;
/* Internal params structure allocation */
pParams = (FE_STB0899_InternalParams_t *)malloc(sizeof(FE_STB0899_InternalParams_t));
if(pParams != NULL)
{
/* Chip initialisation */
pParams->hDemod = STB0899_Init(pInit->STB0899Init);
if(pInit->TunerInit->Chip->Repeater)
pInit->TunerInit->Chip->RepeaterHost = pParams->hDemod;
pParams->hTuner = STTunerInit(pInit->TunerInit);
#if 0
pParams->hLnb = LNBP21_Init(pInit->LnbInit);
#endif
if((pParams->hDemod != NULL) && (!pParams->hDemod->ChipError))
{
FE_STB0899_SetStandard(pParams->hDemod, (STB0899_STANDARD)pInit->Standard);
pParams->Quartz = 27000000;
switch(pInit->Clock)
{
case FE_PARALLEL_CLOCK:
/*TS_CLK = MCLK , if parallel TS disable output fifo */
ChipSetField(pParams->hDemod, FSTB0899_OUTRS_PS, 0x00);
ChipSetOneRegister(pParams->hDemod, RSTB0899_TSOUT, 0x7f);
break;
case FE_SERIAL_MASTER_CLOCK:
/*TS_CLK = MCLK if serial TS do not disable output fifo , set TS_clk ratio to 1 */
ChipSetField(pParams->hDemod, FSTB0899_OUTRS_PS, 0x01);
ChipSetOneRegister(pParams->hDemod, RSTB0899_TSOUT, 0x23);
break;
default:
break;
}
switch(pInit->Parity)
{
case FE_PARITY_ON:
ChipSetField(pParams->hDemod, FSTB0899_CLK_POL, 0x00);
break;
case FE_PARITY_OFF:
ChipSetField(pParams->hDemod, FSTB0899_CLK_POL, 0x01);
break;
default:
break;
}
FE_STB0899_InitialCalculations(pParams);
}
else
{
free(pParams);
pParams = NULL;
}
}
return (FE_STB0899_Handle_t) pParams;
}
/*****************************************************
--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(FE_STB0899_Handle_t Handle, u32 Mclk, u32 ExtClk)
{
FE_STB0899_Error_t st_error = FE_NO_ERROR;
FE_STB0899_InternalParams_t * pParams = (FE_STB0899_InternalParams_t *)Handle;
u32 mDiv;
if(pParams == NULL)
st_error = FE_INVALID_HANDLE;
else
{
mDiv = ((6 * Mclk) / ExtClk) - 1;
ChipSetField(pParams->hDemod, FSTB0899_MDIV, mDiv);
pParams->MasterClock = FE_STB0899_GetMclkFreq(pParams->hDemod, pParams->Quartz);
}
return(FE_NO_ERROR);
}
FE_STB0899_Error_t
FE_STB0899_Search(FE_STB0899_Handle_t Handle, FE_STB0899_SearchParams_t *pSearch, FE_STB0899_SearchResult_t *pResult)
{
FE_STB0899_Error_t st_error = FE_NO_ERROR;
FE_STB0899_InternalParams_t *pParams;
if(Handle != 0)
{
pParams = (FE_STB0899_InternalParams_t *) Handle;
FE_STB0899_SetInternalError(FE_IERR_NO, FE_LOC_NOWHERE, &pParams->Inl_Error);
pParams->Standard = pSearch->Standard;
if((INRANGE(1000000, pSearch->SymbolRate, 45000000)) && (INRANGE(1000000, pSearch->SearchRange, 50000000)))
{
FE_STB0899_SetStandard(pParams->hDemod, (STB0899_STANDARD)pSearch->Standard);
/*Set tuner Gain */
if(pSearch->SymbolRate > 15000000)
TunerSetGain(pParams->hTuner, 8);
else if(pSearch->SymbolRate > 5000000)
TunerSetGain(pParams->hTuner,12);
else
TunerSetGain(pParams->hTuner,14);
/*For Low Symbol Rate (<=5Mbs) set Mclk to 45MHz, else use 108MHz*/
if(pSearch->SymbolRate <= 5000000)
{
FE_STB0899_SetMclk(Handle, 45000000, pParams->Quartz);
}
else
{
FE_STB0899_SetMclk(Handle, 108000000, pParams->Quartz);
}
switch(pSearch->Standard)
{
case FE_DVBS1_STANDARD:
case FE_DSS_STANDARD:
/* Fill pParams structure with search parameters */
pParams->BaseFreq = pSearch->Frequency;
pParams->SymbolRate = pSearch->SymbolRate;
pParams->SearchRange = pSearch->SearchRange;
pParams->DerotPercent = 10;
TunerSetBandwidth(pParams->hTuner, (13 * (CarrierWidth(pParams->SymbolRate, pParams->RollOff) + 10000000)) / 10);
pParams->TunerBW = TunerGetBandwidth(pParams->hTuner);
/*Set DVB-S1 AGC*/
ChipSetOneRegister(pParams->hDemod, RSTB0899_AGCRFCFG, 0x11);
/* Run the search algorithm */
if((FE_STB0899_Algo(pParams) == RANGEOK) && (pParams->hDemod->ChipError == CHIPERR_NO_ERROR))
{
pResult->Locked = TRUE;
/* update results */
pResult->Frequency =pParams->Results.Frequency;
pResult->SymbolRate = pParams->Results.SymbolRate;
pResult->Rate = pParams->Results.PunctureRate;
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -