📄 d0372_drv.c
字号:
U8 AgcVal1,AgcVal2,AgcVal3;
/* top level public instance data */
Inst = STTUNER_GetDrvInst();
/* get the tuner instance for this driver from the top level handle */
TunerInstance = &Inst[TopLevelHandle].Terr.Tuner;
/*pParams->Frequency = pParams->BaseFreq;*/ /*commented for repeated call*/
pParams->Ttiming = 100;
pParams->Tcarrier = 150;
pParams->Tdata = 200;
pParams->TFSM1 = 500;
pParams->TFSM2 = 300;
pParams->Frequency = pParams->BaseFreq;
pParams->TunerOffset = 0;
EQResetNb=0;
/* May be must called from Init routine */
STV0372_SetCarrier(DeviceMap, IOHandle,pParams->IF,pParams->Quartz,pParams->IQMode);
STV0372_SetTiming(DeviceMap, IOHandle,pParams->Quartz);
/**********************************************/
Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle,(U32)pParams->Frequency,(U32 *)&pParams->Frequency); /* Move the tuner */
/* Temporisations */
FE_372_WaitTuner(TunerInstance,100); /* Is tuner Locked ? (wait 100 ms maxi) */
/*Power estimation. Check whether power level is within
threshold level or not. If yes then proceed for lock
else return without doing anything*/
AgcVal1 = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_AGC_IND_LSB);
AgcVal2 = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_AGC_IND_MSB);
AgcVal3 = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_AGC_IND_MMSB);
powerestimation=AgcVal1 + AgcVal2*256+ AgcVal3*65536;
if (powerestimation>=131072)
{
powerestimation= powerestimation-262144;
}
if(powerestimation<=0)
{
powerestimation=-powerestimation;
}
powerestimation=(S32)(powerestimation/(UTIL_372_PowOf2(11-STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_AGCBWSEL))));
if ((powerestimation< pParams->LOWPowerTh)||(powerestimation > pParams->UPPowerTh))
{
pParams->State=NOPOWER_372;
return pParams->State;
}
else
{
pParams->State=POWEROK_372;
}
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_MAXNBFRAMEDD_LSB,0x00) ;
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_MAXNBFRAMERCA,0x00) ;
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_NCO_TIMEOUT_MMSB,0x00) ;
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_NCO_TIMEOUT_MSB,0x00) ;
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_NCO_TIMEOUT_LSB,0x00);
/* There is signal in the band */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_TIMING,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_CARRIER,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTAGC,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM1,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,1);
WAIT_N_MS_372(5);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTAGC,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_CARRIER,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_TIMING,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM1,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,0);
FirstWatchdog=time_now();
if(CheckFSM1_372(DeviceMap,IOHandle,pParams) == FSM1OK_372) /* Check for FSM1 Lock */
{
do
{
EQState=STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_EQSTATE); /* Read EQSTATE */
if (EnableEQreset)
{
FirstTimeOutEQ=time_now();
}
if(EQState==0)
{
/* FULL RESET */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTAGC,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_TIMING,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_CARRIER,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM1,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,1);
WAIT_N_MS_372(20);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTAGC,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_CARRIER,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RST_TIMING,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM1,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,0);
/* END OF FULL RESET */
Watchdog= time_now()-FirstWatchdog;
if ( Watchdog<=pParams->Watchdog )
{
FirstTimeOutEQ=time_now();
EnableEQreset=1;
}
else
{
pParams->State = NOFSM2_372;
}
}
if(EQState>5)
{
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,0); /* Reset Equalizer */
WAIT_N_MS_372(5);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,1);
WAIT_N_MS_372(5);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,0);
Watchdog= time_now()-FirstWatchdog;
if ( Watchdog<=pParams->Watchdog )
{
FirstTimeOutEQ=time_now();
EnableEQreset=1;
}
else
{
pParams->State = NOFSM2_372;
}
}
if(EQState==5)
{
EQState = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_EQSTATE);
MAINState = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_MAINSTATE);
Watchdog= time_now()-FirstWatchdog;
if((MAINState==0x0A)&&(EQState==0x05))
{
pParams->FreqOffset=UTIL_372_Get_FrequencyOffset(DeviceMap,IOHandle,pParams->Quartz);
pParams->Results.Frequency = pParams->Frequency+(pParams->FreqOffset/1000);
pParams->Results.EQResetNB = EQResetNb;
/* Read FSM2 LOCK indicator */
pParams->State = FSM2OK_372;
}
else
{
pParams->State = NOFSM2_372;
}
}
if((EQState>0)&&(EQState<5))
{
TimeOutEQ=time_now()- FirstTimeOutEQ;
if(TimeOutEQ>pParams->TimeOut)
{
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,0); /* Reset Equalizer */
WAIT_N_MS_372(5);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_EQSWRSTN,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,1);
WAIT_N_MS_372(5);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0372_RSTFSM2,0);
Watchdog= time_now()-FirstWatchdog;
if ( Watchdog<=pParams->Watchdog )
{
FirstTimeOutEQ=time_now();
EnableEQreset=1;
}
else
{
pParams->State = NOFSM2_372;
}
}
else
{
EnableEQreset=0;
Watchdog= time_now()-FirstWatchdog;
}
}
}
while( (Watchdog <= pParams->Watchdog)&&(pParams->State != FSM2OK_372)&&(pParams->State != NOFSM2_372) );
}
pParams->Results.SignalType = pParams->State;
return pParams->State;
}
/*****************************************************
--FUNCTION :: FE_372_Search
--ACTION :: Search for a valid transponder
--PARAMS IN :: Handle ==> Front End Handle
pSearch ==> Search parameters
pResult ==> Result of the search
--PARAMS OUT:: NONE
--RETURN :: Error (if any)
--***************************************************/
FE_372_Error_t FE_372_Search(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,
FE_372_SearchParams_t *pSearch,
FE_372_SearchResult_t *pResult,
STTUNER_Handle_t TopLevelHandle)
{
FE_372_Error_t error = FE_372_NO_ERROR;
FE_372_InternalParams_t pParams;
STTUNER_tuner_instance_t *TunerInstance;
STTUNER_InstanceDbase_t *Inst;
TUNER_Status_t TunerStatus;
/* top level public instance data */
Inst = STTUNER_GetDrvInst();
/* get the tuner instance for this driver from the top level handle */
TunerInstance = &Inst[TopLevelHandle].Terr.Tuner;
/*This is to be put in initparams*/pParams.Quartz = 27000000; /*For 27Mhz Quartz Frequency*/
FE_372_SetInternalError(FE_372_IERR_NO,FE_372_LOC_NOWHERE,&pParams.Error);
/* Fill pParams structure with search parameters */
pParams.BaseFreq = pSearch->Frequency;
pParams.SymbolRate = pSearch->SymbolRate;
pParams.SearchRange = pSearch->SearchRange;
pParams.DerotPercent = 30;
pParams.IQMode = pSearch->IQMode;
pParams.Watchdog = pSearch->FistWatchdog;
pParams.TimeOut = pSearch->DefaultWatchdog;
pParams.LOWPowerTh = pSearch->LOWPowerTh;
pParams.UPPowerTh = pSearch->UPPowerTh;
/* Run the search algorithm */
error = (TunerInstance->Driver->tuner_GetStatus)(TunerInstance->DrvHandle, &TunerStatus);
pParams.IF = TunerStatus.IntermediateFrequency ;
if(FE_372_Algo(DeviceMap, IOHandle,&pParams,TopLevelHandle) == FSM2OK_372)
{
pResult->Locked = TRUE;
/* update results */
pResult->Frequency = pParams.Results.Frequency;
pResult->SymbolRate = pParams.Results.SymbolRate;
}
else
{
pResult->Locked = FALSE;
switch(pParams.Error.Type)
{
case FE_372_IERR_I2C: /* I2C error */
error = FE_372_I2C_ERROR;
break;
case FE_372_IERR_NO:
default:
error = FE_372_SEARCH_FAILED;
break;
}
}
return error;
}
void FE_372_Status(FE_372_Handle_t Handle,FE_372_SIGNALTYPE_t *SignalType)
{
if(Handle)
*SignalType = ((FE_372_InternalParams_t *)Handle)->Results.SignalType;
}
/*****************************************************
--FUNCTION :: FE_372_GetCarrierToNoiseRatio
--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
--***************************************************/
S32 FE_372_GetCarrierToNoiseRatio(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
S32 c_n = 0,
regval,
Imin,
Imax,
i;
if(FE_372_CN_LookUp.size)
{
regval = MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_ERROR_POWER_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_ERROR_POWER_LSB));
Imin = 0;
Imax = FE_372_CN_LookUp.size-1;
if(INRANGE(FE_372_CN_LookUp.table[Imin].regval,regval,FE_372_CN_LookUp.table[Imax].regval))
{
while((Imax-Imin)>1)
{
i=(Imax+Imin)/2;
if(INRANGE(FE_372_CN_LookUp.table[Imin].regval,regval,FE_372_CN_LookUp.table[i].regval))
Imax = i;
else
Imin = i;
}
c_n = ((regval - FE_372_CN_LookUp.table[Imin].regval)
* (FE_372_CN_LookUp.table[Imax].realval - FE_372_CN_LookUp.table[Imin].realval)
/ (FE_372_CN_LookUp.table[Imax].regval - FE_372_CN_LookUp.table[Imin].regval))
+ FE_372_CN_LookUp.table[Imin].realval;
}
else
c_n = 10;
}
return ( c_n);
}
/*****************************************************
--FUNCTION :: FE_372_GetBitErrorRate
--ACTION :: Return the bit error rate
--PARAMS IN :: NONE
--PARAMS OUT:: NONE
--RETURN :: 100000000 * ber
--***************************************************/
S32 FE_372_GetBitErrorRate(STTUNER_IOREG_DeviceMap_t *DeviceMap,IOARCH_Handle_t IOHandle)
{
S32 ber = 0,
regval,
divider,
Imin,
Imax,
i;
unsigned char low_precision=1;
if(FE_372_BER_LookUp.size)
{
regval = MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_SER_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_SER_LSB));
regval =regval*10000;
divider= MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_SER_PERIOD_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0372_SER_PERIOD_LSB));
if (regval < divider )/*If regval*10e4 < divider then div of regval by
divider will give 0. To avoid this multiply regval by 100 */
{
regval = regval *100;
low_precision=0;
}
else
{
low_precision =1;
}
if (divider!=0)
{
regval/=divider;
}
if (low_precision ==1 )/*Now multiply after division by 100 if it is not multiplied by 10e6 before*/
{
regval =regval *100;
}
Imin = 0;
Imax = FE_372_BER_LookUp.size-1;
if(INRANGE(FE_372_BER_LookUp.table[Imin].regval,regval,FE_372_BER_LookUp.table[Imax].regval))
{
while((Imax-Imin)>1)
{
i=(Imax+Imin)/2;
if(INRANGE(FE_372_BER_LookUp.table[Imin].regval,regval,FE_372_BER_LookUp.table[i].regval))
Imax = i;
else
Imin = i;
}
ber = ((regval - FE_372_BER_LookUp.table[Imin].regval)
* (FE_372_BER_LookUp.table[Imax].realval - FE_372_BER_LookUp.table[Imin].realval)
/ (FE_372_BER_LookUp.table[Imax].regval - FE_372_BER_LookUp.table[Imin].regval))
+ FE_372_BER_LookUp.table[Imin].realval;
}
else
ber = 684546;
}
return ber; /* returned value is 100000000 time the ber */
}
/*
--
--==============================================================================
--
-- END of the source code .
--
--==============================================================================
--
-- TTT H H EEE
-- T HHH EE
-- T H H EEE
--
--
-- EEEEEEEEEEEE NNNNNNNN NNNN DDDDDDDDDDDDDD
-- EEEEEEEEEEEE NNNNNNNN NNNN DDDDDDDDDDDDDDDD
-- EEEE NNNN NNNN NNNN DDDD DDDD
-- EEEE NNNN NNNN NNNN DDDD DDDD
-- EEEEEEEE NNNN NNNN NNNN DDDD DDDD
-- EEEEEEEE NNNN NNNN NNNN DDDD DDDD
-- EEEE NNNN NNNN NNNN DDDD DDDD
-- EEEE NNNN NNNNNNNN DDDD DDDD
-- EEEEEEEEEEEE NNNN NNNNNNN DDDDDDDDDDDDDDD
-- EEEEEEEEEEEE NNNN NNNNNN DDDDDDDDDDDDDD
--
--
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -