📄 drv0899.c
字号:
}
}
else
{
Params->Results.SymbolRate = Params->SymbolRate;
}
Params->Direction = -Params->Direction; /* Change the zigzag direction */
}
while( (Params->State!=CARRIEROK_899) && NextLoop);
if(Params->State == CARRIEROK_899)
{
STTUNER_IOREG_GetContigousRegisters_SizeU32(DeviceMap, IOHandle,RSTB0899_CFRM,2, cfrm); /* Get the derotator frequency */
cfrm[0]&=0xff;
cfrm[1]&=0xff;
Params->DerotFreq =(short int)Params->TunerIQSense*((short int) MAKEWORD(cfrm[0],cfrm[1]));
}
else
{
Params->DerotFreq = LastDerotFreq;
}
return Params->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_899 if no carrier had been found, CARRIEROK_899 otherwise
--***************************************************/
FE_STB0899_SIGNALTYPE_t FE_STB0899_SearchData(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_STB0899_InternalParams_t *Params)
{
short int DerotFreq,
DerotStep,
DerotLimit,
NextLoop = 3;
int index = 1;
U32 cfrm[2];
DerotStep = (Params->SymbolRate/4)/Params->Mclk;
DerotLimit = (Params->SubRange/2)/Params->Mclk;
DerotFreq = Params->DerotFreq;
do
{
if((Params->State != CARRIEROK_899) || (FE_STB0899_CheckData(DeviceMap, IOHandle, Params)!= DATAOK_899))
{
DerotFreq += (short int)Params->TunerIQSense*index*Params->Direction*DerotStep; /* Compute the next derotator position for the zig zag */
if(ABS(DerotFreq) > DerotLimit)
NextLoop--;
if(NextLoop)
{
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_CFD_ON,FSTB0899_CFD_ON_INFO,1);
cfrm[0] = MSB((short int)DerotFreq);
cfrm[1] = LSB((short int)DerotFreq);
STTUNER_IOREG_SetContigousRegisters_SizeU32(DeviceMap, IOHandle, RSTB0899_CFRM,cfrm,2); /* Reset the derotator frequency */
FE_STB0899_CheckCarrier(DeviceMap, IOHandle, Params);
index++;
}
}
Params->Direction = -Params->Direction; /* Change the zigzag direction */
}
while((Params->State != DATAOK_899) && NextLoop);
if(Params->State == DATAOK_899)
{
STTUNER_IOREG_GetContigousRegisters_SizeU32(DeviceMap, IOHandle,RSTB0899_CFRM,2, cfrm); /* Get the derotator frequency */
cfrm[0]&=0xff;
cfrm[1]&=0xff;
Params->DerotFreq = (short int)Params->TunerIQSense*((short int) MAKEWORD(cfrm[0],cfrm[1]));
}
return Params->State;
}
/****************************************************
--FUNCTION :: FE_STB0899_CheckRange
--ACTION :: Check if the founded frequency is in the correct range
--PARAMS IN :: Params->BaseFreq =>
--PARAMS OUT:: Params->State => Result of the check
--RETURN :: RANGEOK_899 if check success, OUTOFRANGE_899 otherwise
--***************************************************/
FE_STB0899_SIGNALTYPE_t FE_STB0899_CheckRange(FE_STB0899_InternalParams_t *Params)
{
int RangeOffset,
TransponderFrequency;
RangeOffset = Params->SearchRange/2000;
TransponderFrequency = Params->Frequency + (S32)((Params->DerotFreq * ((S16)(Params->Mclk)))/1000);
if((TransponderFrequency >= Params->BaseFreq - RangeOffset)
&& (TransponderFrequency <= Params->BaseFreq + RangeOffset))
Params->State = RANGEOK_899;
else
Params->State = OUTOFRANGE_899;
return Params->State;
}
/****************************************************
--FUNCTION :: FE_899_CarrierNotCentered
--ACTION :: Check if the carrier is correctly centered
--PARAMS IN ::
--PARAMS OUT::
--RETURN :: 1 if not centered, 0 otherwise
--***************************************************/
int FE_899_CarrierNotCentered(FE_STB0899_InternalParams_t *Params,int AllowedOffset)
{
int NotCentered = 0,
DerotFreq;
long Fs;
Fs = FE_899_CarrierWidth(Params->SymbolRate,Params->RollOff);
DerotFreq = abs(Params->DerotFreq * Params->Mclk);
if(Fs < 4000000)
NotCentered = (int)(Params->TunerBW - Fs)/4 ;
else
NotCentered = ((Params->TunerBW/2 - (U32)DerotFreq - (U32)(Fs/2)) < AllowedOffset) && (DerotFreq > Params->TunerStep);
return NotCentered;
}
/****************************************************
--FUNCTION :: FE_899_FirstSubRange
--ACTION :: Compute the first SubRange of the search
--PARAMS IN :: Params->SearchRange
--PARAMS OUT:: Params->SubRange
--RETURN :: NONE
--***************************************************/
void FE_899_FirstSubRange(STTUNER_tuner_instance_t *TunerInstance, FE_STB0899_InternalParams_t *Params)
{
int maxsubrange;
maxsubrange = (int)((Params->TunerBW)*1000 - (U32)FE_899_CarrierWidth(Params->SymbolRate,Params->RollOff)/2);
if(maxsubrange > 0)
Params->SubRange = MIN(Params->SearchRange,maxsubrange);
else
Params->SubRange = 0;
Params->Frequency = Params->BaseFreq;
Params->TunerOffset = 0;
Params->SubDir = 1;
}
/****************************************************
--FUNCTION :: FE_899_NextSubRange
--ACTION :: Compute the next SubRange of the search
--PARAMS IN :: Frequency -> Start frequency
-- Params->SearchRange
--PARAMS OUT:: Params->SubRange
--RETURN :: NONE
--***************************************************/
void FE_899_NextSubRange(FE_STB0899_InternalParams_t *Params)
{
S32 OldSubRange;
if(Params->SubDir > 0)
{
OldSubRange = Params->SubRange;
Params->SubRange = MIN((S32)(Params->SearchRange/2) - (Params->TunerOffset + Params->SubRange/2),Params->SubRange);
if(Params->SubRange < 0)
Params->SubRange = 0;
Params->TunerOffset += (OldSubRange + Params->SubRange)/2;
}
Params->Frequency = Params->BaseFreq + (Params->SubDir * Params->TunerOffset)/1000;
Params->SubDir = -Params->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(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_STB0899_InternalParams_t *Params, STTUNER_Handle_t TopLevelHandle)
{
/*S32 pr,sn,to,hy;*/
/*beta value for 99MHz*/
S32 betaTab[5][4]= { /*5MBs*/ /*10MBs*/ /*20MBs*/ /*30Mbs*/
/*QPSK 1/2 */ 37, 34, 32, 31,
/*QPSK 2/3 */ 37, 35, 33, 31,
/*QPSK 3/4 */ 37, 35, 33, 31,
/*QPSK 5/6 */ 37, 36, 33, 32,
/*QPSK 7/8 */ 37, 36, 33, 32
};
S32 clnI=3;
U32 cfrm[2]={0,0},EqCoeffs[10];
STTUNER_InstanceDbase_t *Inst;
STTUNER_tuner_instance_t *TunerInstance;
ST_ErrorCode_t Error;
U32 TransponderFreq;
/* 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;
Params->Frequency = Params->BaseFreq;
Params->Direction = 1;
FE_STB0899_SetSymbolRate(DeviceMap, IOHandle, Params->MasterClock,Params->SymbolRate); /* Set the symbol rate */
/* Carrier loop optimization versus symbol rate */
if(Params->SymbolRate <= 5000000)
{
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_ACLC,0x89);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_BETA,FSTB0899_BETA_INFO,0x1c);
clnI=0;
}
else if(Params->SymbolRate <= 15000000)
{
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_ACLC,0xc9);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_BETA,FSTB0899_BETA_INFO,0x22);
clnI=1;
}
else if(Params->SymbolRate <= 125000000)
{
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_ACLC,0x89);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_BETA,FSTB0899_BETA_INFO,0x27);
clnI=2;
}
else
{
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_ACLC,0xc8);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_BETA,FSTB0899_BETA_INFO,0x29);
clnI=3;
}
/*Set the timing loop to acquisition */
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_RTC,0x46);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CFD,0xee);
/* Initial calculations */
Params->DerotStep = Params->DerotPercent*(Params->SymbolRate/1000)/Params->Mclk; /* step of DerotStep/1000 * Fsymbol */
Params->Ttiming = (S16)FE_STB0899_TimingTimeConstant(Params->SymbolRate);
Params->Tderot = (S16)FE_STB0899_DerotTimeConstant(Params->SymbolRate);
Params->Tdata = 500; /*2 + FE_STB0899_DataTimeConstant(pr,sn,to,hy,Params->SymbolRate);*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_FRESRS, FSTB0899_FRESRS_INFO,1); /* Reset Stream Merger*/
/*FE_899_FirstSubRange(TunerInstance, Params);*/
Params->SubRange = 10000000;
Params->Frequency = Params->BaseFreq;
Params->TunerOffset = 0;
Params->SubDir = 1;
do
{
/* Initialisations */
/* Initialisations */
STTUNER_IOREG_SetContigousRegisters_SizeU32(DeviceMap, IOHandle,RSTB0899_CFRM,cfrm,2); /* Reset of the derotator frequency */
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_TIMING_LOOP_FREQ,FSTB0899_TIMING_LOOP_FREQ_INFO,0xf2);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle,FSTB0899_CFD_ON,FSTB0899_CFD_ON_INFO,1);
Params->DerotFreq = 0;
Params->State = NOAGC1_899;
TransponderFreq = Params->Frequency;
Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, (U32)Params->Frequency, (U32 *)&Params->Frequency);
if(Error != ST_NO_ERROR)
{
return(NOAGC1_899);
}
/* Temporisations */
WAIT_N_MS_899(10); /* Wait for agc1,agc2 and timing loop */
tuner_tunsdrv_Utilfunction(TunerInstance->DrvHandle, VCO_SEARCH_OFF);
Params->State = AGC1OK_899; /* No AGC test actually */
/* There is signal in the band */
if(Params->SymbolRate <= (Params->TunerBW)/2)
FE_STB0899_SearchTiming(DeviceMap, IOHandle,Params); /* For low rates (SCPC) */
else
FE_STB0899_CheckTiming(DeviceMap, IOHandle,Params); /* For high rates (MCPC) */
if(Params->State == TIMINGOK_899)
{
if(FE_STB0899_SearchCarrier(DeviceMap, IOHandle, Params) == CARRIEROK_899) /* Search for carrier */
{
if(FE_STB0899_SearchData(DeviceMap, IOHandle, Params) == DATAOK_899) /* Check for data */
{
if(FE_STB0899_CheckRange(Params) == RANGEOK_899)
{
Params->Results.Frequency = Params->Frequency + (Params->DerotFreq*((S16)(Params->Mclk)))/1000;
Params->Results.PunctureRate = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_VIT_CURPUN, FSTB0899_VIT_CURPUN_INFO);
}
}
}
}
if(Params->State != RANGEOK_899)
FE_899_NextSubRange(Params);
}
while(Params->SubRange && Params->State!=RANGEOK_899);
Params->Results.SignalType = Params->State;
/*if locked and range is ok set Kdiv value*/
if(Params->State == RANGEOK_899)
{
/*Set the timing loop to tracking */
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_RTC,0x23);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,RSTB0899_CFD,0xF7);
switch(Params->Results.PunctureRate)
{
case 13: /*1/2*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_KDIVIDER,FSTB0899_KDIVIDER_INFO,0x1a);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_BETA,FSTB0899_BETA_INFO,betaTab[0][clnI]);
break;
case 18: /*2/3*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_KDIVIDER,FSTB0899_KDIVIDER_INFO,44/*0x27*/);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_BETA,FSTB0899_BETA_INFO,betaTab[1][clnI]);
break;
case 21: /*3/4*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_KDIVIDER,FSTB0899_KDIVIDER_INFO,/*0x34*/60);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_BETA,FSTB0899_BETA_INFO,betaTab[2][clnI]);
break;
case 24: /*5/6*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_KDIVIDER,FSTB0899_KDIVIDER_INFO,75/*0x4f*/);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_BETA,FSTB0899_BETA_INFO,betaTab[3][clnI]);
break;
case 25: /*6/7*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_KDIVIDER,FSTB0899_KDIVIDER_INFO,/*0x5c*/80);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_BETA,FSTB0899_BETA_INFO,betaTab[3][clnI]);
break;
case 26: /*7/8*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_KDIVIDER,FSTB0899_KDIVIDER_INFO,94/*0x6a*/);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_BETA,FSTB0899_BETA_INFO,betaTab[4][clnI]);
break;
}
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_FRESRS,FSTB0899_FRESRS_INFO,0); /*release Stream merger reset*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_CFD_ON,FSTB0899_CFD_ON_INFO,0); /*Disable Carrier detector*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -