📄 stb0899_drv.c
字号:
return (SymbolRate + (SymbolRate * RollOff) / 100);
}
/*****************************************************
--FUNCTION :: FE_STB0899_InitialCalculations
--ACTION :: Set Params fields that are never changed during search algorithm
--PARAMS IN :: NONE
--PARAMS OUT :: NONE
--RETURN :: NONE
--***************************************************/
static void
FE_STB0899_InitialCalculations(FE_STB0899_InternalParams_t *pParams)
{
int MasterClock;
/*Read registers (in burst mode)*/
ChipGetOneRegister(pParams->hDemod, RSTB0899_AGC1CN);
/*Read AGC1R and AGC2O registers */
ChipGetRegisters(pParams->hDemod, RSTB0899_AGC1REF, 2);
/*Initial calculations*/
MasterClock = FE_STB0899_GetMclkFreq(pParams->hDemod, pParams->Quartz);
pParams->Tagc1 = 0;
pParams->Tagc2 = 0;
pParams->MasterClock = MasterClock;
pParams->Mclk = MasterClock / 65536L;
pParams->RollOff = FE_STB0899_GetAlpha(pParams->hDemod);
/*DVBS2 Initial calculations */
/*Set AGC init value to to the midle*/
pParams->AgcGain = 8154;
ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_GAININIT, pParams->AgcGain);
ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL, 1);
pParams->RrcAlpha = (FE_DVBS2_RRCAlpha_t)ChipGetField(pParams->hDemod, FSTB0899_RRC_ALPHA);
pParams->AcqMode = CORR_PEAK;
pParams->FreqRange = 4; /*pSearch->FreqRange*/
pParams->CenterFreq = 0;
pParams->mod = DVBS2_PSK8;
pParams->AveFrameCoarse = 10;
pParams->AveFramefine = 20;
pParams->AgcThreshold = 23;
pParams->AveFrameCoarseAcq = 4;
pParams->AveFramefineAcq = 6;
pParams->AveFrameCoarseTrq = 10;
pParams->AveFramefineTrq = 20;
pParams->AutoReacq = 1;
pParams->TracklockSel = 0;
pParams->Zigzag = 1;
pParams->StepSize = 2;
}
/*****************************************************
--FUNCTION :: FE_STB0899_SearchTiming
--ACTION :: Perform an Fs/2 zig zag to found timing
--PARAMS IN :: NONE
--PARAMS OUT :: NONE
--RETURN :: NOTIMING if no valid timing had been found, TIMINGOK otherwise
--***************************************************/
static FE_STB0899_SIGNALTYPE_t
FE_STB0899_SearchTiming(FE_STB0899_InternalParams_t *pParams)
{
short int DerotStep,
DerotFreq = 0,
DerotLimit,
NextLoop = 3;
int index = 0;
pParams->State = NOTIMING;
/* timing loop computation & symbol rate optimisation */
DerotLimit = (short int)((pParams->SubRange / 2L) / pParams->Mclk);
DerotStep = (short int)((pParams->SymbolRate / 2L) / pParams->Mclk);
while((FE_STB0899_CheckTiming(pParams) != TIMINGOK) && NextLoop)
{
index++;
/*Compute the next derotator position for the zig zag*/
DerotFreq += index*pParams->Direction * DerotStep;
if(ABS(DerotFreq) > DerotLimit)
NextLoop--;
if(NextLoop)
{
ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB, MSB(pParams->hTuner->IQ_Wiring * DerotFreq));
ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB, LSB(pParams->hTuner->IQ_Wiring * DerotFreq));
/*Set the derotator frequency*/
ChipSetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
}
/*Change the zigzag direction*/
pParams->Direction = -pParams->Direction;
}
if(pParams->State == TIMINGOK)
{
pParams->Results.SymbolRate = pParams->SymbolRate;
/*Get the derotator frequency*/
ChipGetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
pParams->DerotFreq = pParams->hTuner->IQ_Wiring * ((short int) MAKEWORD(ChipGetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB), ChipGetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB)));
}
return pParams->State;
}
/*****************************************************
--FUNCTION :: FE_STB0899_SearchCarrier
--ACTION :: Search a QPSK carrier with the derotator
--PARAMS IN ::
--PARAMS OUT :: NONE
--RETURN :: NOCARRIER if no carrier had been found, CARRIEROK otherwise
--***************************************************/
static FE_STB0899_SIGNALTYPE_t
FE_STB0899_SearchCarrier(FE_STB0899_InternalParams_t *pParams)
{
short int DerotFreq = 0,
LastDerotFreq = 0,
DerotLimit,
NextLoop = 3;
int index = 0;
pParams->State = NOCARRIER;
DerotLimit = (short int)((pParams->SubRange / 2L) / pParams->Mclk);
DerotFreq = pParams->DerotFreq;
ChipSetField(pParams->hDemod, FSTB0899_CFD_ON, 1);
do
{
if(FE_STB0899_CheckCarrier(pParams) == NOCARRIER)
{
index++;
LastDerotFreq = DerotFreq;
/*Compute the next derotator position for the zig zag*/
DerotFreq += index * pParams->Direction * pParams->DerotStep;
if(ABS(DerotFreq) > DerotLimit)
NextLoop--;
if(NextLoop)
{
ChipSetField(pParams->hDemod, FSTB0899_CFD_ON, 1);
ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB, MSB(pParams->hTuner->IQ_Wiring * DerotFreq));
ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB, LSB(pParams->hTuner->IQ_Wiring * DerotFreq));
/*Set the derotator frequency*/
ChipSetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
}
}
else
{
pParams->Results.SymbolRate = pParams->SymbolRate;
}
/*Change the zigzag direction*/
pParams->Direction = -pParams->Direction;
}
while((pParams->State != CARRIEROK) && NextLoop);
if(pParams->State == CARRIEROK)
{
/*Get the derotator frequency*/
ChipGetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
pParams->DerotFreq = pParams->hTuner->IQ_Wiring * ((short int) MAKEWORD(ChipGetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB), ChipGetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB)));
}
else
{
pParams->DerotFreq = LastDerotFreq;
}
return pParams->State;
}
/*****************************************************
--FUNCTION :: FE_STB0899_SearchData
--ACTION :: Search a QPSK carrier with the derotator, even if there is a false lock
--PARAMS IN ::
--PARAMS OUT :: NONE
--RETURN :: NOCARRIER if no carrier had been found, CARRIEROK otherwise
--***************************************************/
static FE_STB0899_SIGNALTYPE_t
FE_STB0899_SearchData(FE_STB0899_InternalParams_t *pParams)
{
short int DerotFreq,
DerotStep,
DerotLimit,
NextLoop = 3;
int index = 1;
DerotStep = (short int)((pParams->SymbolRate / 4L) / pParams->Mclk);
DerotLimit = (short int)((pParams->SubRange / 2L) / pParams->Mclk);
DerotFreq = pParams->DerotFreq;
do
{
if((pParams->State != CARRIEROK) || (FE_STB0899_CheckData(pParams) != DATAOK))
{
/*Compute the next derotator position for the zig zag*/
DerotFreq += index * pParams->Direction * DerotStep;
if(ABS(DerotFreq) > DerotLimit)
NextLoop--;
if(NextLoop)
{
ChipSetField(pParams->hDemod, FSTB0899_CFD_ON,1);
ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB, MSB(pParams->hTuner->IQ_Wiring * DerotFreq));
ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB, LSB(pParams->hTuner->IQ_Wiring * DerotFreq));
/*Reset the derotator frequency*/
ChipSetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
FE_STB0899_CheckCarrier(pParams);
index++;
}
}
pParams->Direction = -pParams->Direction;/*Change the zigzag direction*/
}
while((pParams->State != DATAOK) && NextLoop);
if(pParams->State == DATAOK)
{
/*Get the derotator frequency*/
ChipGetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
pParams->DerotFreq = pParams->hTuner->IQ_Wiring * ((short int) MAKEWORD(ChipGetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB), ChipGetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB)));
}
return pParams->State;
}
/****************************************************
--FUNCTION :: FE_STB0899_CheckRange
--ACTION :: Check if the founded frequency is in the correct range
--PARAMS IN :: pParams->BaseFreq =>
--PARAMS OUT :: pParams->State =>Result of the check
--RETURN :: RANGEOK if check success, OUTOFRANGE otherwise
--***************************************************/
static FE_STB0899_SIGNALTYPE_t
FE_STB0899_CheckRange(FE_STB0899_InternalParams_t *pParams)
{
int RangeOffset,
TransponderFrequency;
RangeOffset = pParams->SearchRange/2000;
TransponderFrequency = pParams->Frequency + (pParams->DerotFreq * pParams->Mclk) / 1000;
if((TransponderFrequency >= pParams->BaseFreq - RangeOffset)
&& (TransponderFrequency <= pParams->BaseFreq + RangeOffset))
pParams->State = RANGEOK;
else
pParams->State = OUTOFRANGE;
return pParams->State;
}
/****************************************************
--FUNCTION :: FirstSubRange
--ACTION :: Compute the first SubRange of the search
--PARAMS IN :: pParams->SearchRange
--PARAMS OUT :: pParams->SubRange
--RETURN :: NONE
--***************************************************/
static void
FirstSubRange(FE_STB0899_InternalParams_t *pParams)
{
int maxsubrange;
maxsubrange = TunerGetBandwidth(pParams->hTuner) - CarrierWidth(pParams->SymbolRate, pParams->RollOff) / 2;
if(maxsubrange > 0)
pParams->SubRange = MIN(pParams->SearchRange, maxsubrange);
else
pParams->SubRange = 0;
pParams->Frequency = pParams->BaseFreq;
pParams->TunerOffset = 0L;
pParams->SubDir = 1;
}
/****************************************************
--FUNCTION :: NextSubRange
--ACTION :: Compute the next SubRange of the search
--PARAMS IN :: Frequency->Start frequency
-- pParams->SearchRange
--PARAMS OUT :: pParams->SubRange
--RETURN :: NONE
--***************************************************/
static void
NextSubRange(FE_STB0899_InternalParams_t *pParams)
{
long OldSubRange;
if(pParams->SubDir > 0)
{
OldSubRange = pParams->SubRange;
pParams->SubRange = MIN((pParams->SearchRange/2) - (pParams->TunerOffset + pParams->SubRange/2), pParams->SubRange);
if(pParams->SubRange < 0)
pParams->SubRange = 0;
pParams->TunerOffset += (OldSubRange + pParams->SubRange) / 2;
}
pParams->Frequency = pParams->BaseFreq + (pParams->SubDir * pParams->TunerOffset) / 1000;
pParams->SubDir = -pParams->SubDir;
}
/*****************************************************
--FUNCTION :: FE_STB0899_Algo
--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)
--***************************************************/
FE_STB0899_SIGNALTYPE_t
FE_STB0899_Algo(FE_STB0899_InternalParams_t *pParams)
{
pParams->Frequency = pParams->BaseFreq;
pParams->Direction = 1;
FE_STB0899_SetSymbolRate(pParams->hDemod, pParams->MasterClock, pParams->SymbolRate);
/* Carrier loop optimization versus symbol rate */
if(pParams->SymbolRate <= 5000000)
ChipSetField(pParams->hDemod, FSTB0899_ALPHA, 9);
else
ChipSetField(pParams->hDemod, FSTB0899_ALPHA, 7);
if(pParams->SymbolRate <= 2000000)
ChipSetField(pParams->hDemod, FSTB0899_BETA, 0x17);
else if(pParams->SymbolRate <= 5000000)
ChipSetField(pParams->hDemod, FSTB0899_BETA, 0x1C);
else if(pParams->SymbolRate <= 15000000)
ChipSetField(pParams->hDemod, FSTB0899_BETA, 0x22);
else if(pParams->SymbolRate <= 30000000)
ChipSetField(pParams->hDemod, FSTB0899_BETA, 0x27);
else
ChipSetField(pParams->hDemod, FSTB0899_BETA, 0x29);
/*Initial calculations*/
/*step of DerotStep/1000 * Fsymbol*/
pParams->DerotStep = pParams->DerotPercent*((S16)((pParams->SymbolRate/1000L)/pParams->Mclk));
pParams->Ttiming = (S16)(FE_STB0899_TimingTimeConstant(pParams->SymbolRate));
pParams->Tderot = (S16)(FE_STB0899_DerotTimeConstant(pParams->SymbolRate));
pParams->Tdata = 500;
ChipSetField(pParams->hDemod,FSTB0899_FRESRS, 1); /*Reset Stream merger*/
FirstSubRange(pParams);
/*Initialisations*/
ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB, 0);
ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB, 0);
/*Reset of the derotator frequency*/
ChipSetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
ChipSetField(pParams->hDemod, FSTB0899_TIMING_LOOP_FREQ, 0xf2);
ChipSetField(pParams->hDemod, FSTB0899_CFD_ON,1);
pParams->DerotFreq = 0;
pParams->State = NOAGC1;
/*Move the tuner*/
TunerSetFrequency(pParams->hTuner, pParams->Frequency);
pParams->Frequency = TunerGetFrequency(pParams->hTuner);
if (pParams->hTuner->Chip->ChipError)
{
return NOCARRIER;
}
/*Temporisations*/
/*Wait for agc1,agc2 and timing loop*/
WAIT_N_MS(pParams->Tagc1 + pParams->Tagc2 + pParams->Ttiming);
/*Is tuner Locked? (wait 100 ms maxi)*/
WaitTuner(pParams->hTuner, 100);
pParams->State = AGC1OK; /* No AGC test actually */
/*There is signal in the band*/
if(pParams->SymbolRate <= (S32)(TunerGetBandwidth(pParams->hTuner)/2))
FE_STB0899_SearchTiming(pParams); /*For low rates (SCPC)*/
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -