📄 d0360_drv.c
字号:
}
/*****************************************************
--FUNCTION :: FE_360_LookFor
--ACTION :: Intermediate layer before launching Search
--PARAMS IN :: Handle ==> Front End Handle
pSearch ==> Search parameters
pResult ==> Result of the search
--PARAMS OUT:: NONE
--RETURN :: Error (if any)
--***************************************************/
FE_360_Error_t FE_360_LookFor(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_360_SearchParams_t *pSearch, FE_360_SearchResult_t *pResult,STTUNER_tuner_instance_t *TunerInstance)
{
U8 trials[6];
S8 num_trials,index;
FE_360_Error_t error = FE_NO_ERROR;
U8 flag_spec_inv;
U8 flag_freq_off;
U32 frequency;
U8 flag,inv;
S8 delta_freq;
FE_360_InternalParams_t pParams;
frequency = pSearch->Frequency;
pParams.I2Cspeed = SpeedInit(DeviceMap,IOHandle);
pParams.prev_lock_status = NO_LOCK;
pParams.first_lock=0;
/****Initialize TRLNORMRATE TUNNING FLAG*****/
pParams.TrlNormRateFineTunning = FALSE ;
/***Initialize channel bandwidth value with a common value as the particular channel
bandwidth still not known*****/
pParams.ChannelBWStatus = STTUNER_CHAN_BW_NONE ;
/************************/
pParams.Frequency=pSearch->Frequency;
pParams.Frequency = pSearch->Frequency;
pParams.Mode = pSearch->Mode;
pParams.Guard = pSearch->Guard;
pParams.Inv = pSearch->Inv;
pParams.Offset = pSearch->Offset;
pParams.Force = pSearch->Force;
pParams.ChannelBW = pSearch->ChannelBW;
pParams.EchoPos = pSearch->EchoPos;
pParams.Hierarchy = pSearch->Hierarchy;
pParams.Tuner=TunerInstance->Driver->ID;
pParams.Quartz=0;
pParams.TrlNormRateTunning=FALSE;
if(pParams.ChannelBW != pParams.ChannelBWStatus)
{
pParams.ChannelBWStatus=pParams.ChannelBW;
pParams.TrlNormRateFineTunning=FALSE;
}
pParams.Channel_6M_Trl_Done = FALSE;
pParams.Channel_7M_Trl_Done = FALSE;
pParams.Channel_8M_Trl_Done = FALSE;
/****Initial normrate setting for 6 Mhz bandwidth***/
pParams.Channel_6M_Trl[0]=M6_F_TRL_NOMRATE0;
pParams.Channel_6M_Trl[1]=M6_F_TRL_NOMRATE8_1;
pParams.Channel_6M_Trl[2]=M6_F_TRL_NOMRATE16_9;
/****Initial normrate setting for 7 Mhz bandwidth***/
pParams.Channel_7M_Trl[0]=M7_F_TRL_NOMRATE0;
pParams.Channel_7M_Trl[1]=M7_F_TRL_NOMRATE8_1;
pParams.Channel_7M_Trl[2]=M7_F_TRL_NOMRATE16_9;
/****Initial normrate setting for 8 Mhz bandwidth***/
pParams.Channel_8M_Trl[0]=M8_F_TRL_NOMRATE0;
pParams.Channel_8M_Trl[1]=M8_F_TRL_NOMRATE8_1;
pParams.Channel_8M_Trl[2]=M8_F_TRL_NOMRATE16_9;
pParams.State =NODATA;
pParams.EchoPos = pSearch->EchoPos;
pParams.Offset = pSearch->Offset;
pParams.Inv = pSearch->Inv;
pParams.Delta = 0;
flag_spec_inv = 0;
flag_freq_off = 0;
flag = pSearch->Offset*2 + ((pSearch->Inv>>1)&1);
switch (flag)
{
case 0:
trials[0]=NINV_NOFF;
trials[1]= INV_NOFF;
if ( (pParams.Inv == STTUNER_INVERSION_NONE) || (pParams.Inv == STTUNER_INVERSION))
{
num_trials=1;
}
else
num_trials=2;
if ( (pParams.first_lock) && (pParams.Inv == STTUNER_INVERSION_UNK))
{
num_trials=1;
}
break;
case 1:
trials[0]= NINV_NOFF;
trials[1]= INV_NOFF;
num_trials=2;
break;
case 2:
if ((pParams.prev_lock_status)==(LOCK_NO_OFF))
{
trials[0] = NINV_NOFF;
trials[1] = NINV_ROFF;
trials[2] = INV_NOFF;
trials[3] = INV_ROFF;
if ( (pParams.Inv == STTUNER_INVERSION_NONE) || (pParams.Inv == STTUNER_INVERSION))
{
num_trials=2;
}
else num_trials= 4;
if ( (pParams.first_lock) && (pParams.Inv == STTUNER_INVERSION_UNK))
{
num_trials=2;
}
}
else if ((pParams.prev_lock_status)==(LOCK_RI_OFF))
{
trials[0] = NINV_ROFF;
trials[1] = INV_ROFF;
if ( (pParams.Inv == STTUNER_INVERSION_NONE) || (pParams.Inv == STTUNER_INVERSION))
{
num_trials=1;
}
else num_trials= 2;
if ( (pParams.first_lock) && (pParams.Inv == STTUNER_INVERSION_UNK))
{
num_trials=1;
}
}
else
{
trials[0] = NINV_NOFF;
trials[1] = NINV_LOFF;
trials[2] = NINV_ROFF;
trials[3] = INV_NOFF;
trials[4] = INV_LOFF;
trials[5] = INV_ROFF;
if ( (pParams.Inv == STTUNER_INVERSION_NONE) || (pParams.Inv == STTUNER_INVERSION))
{
num_trials=3;
}
else num_trials= 6;
if ( (pParams.first_lock) && (pParams.Inv == STTUNER_INVERSION_UNK))
{
num_trials=3;
}
}
break;
case 3:
default:
if ((pParams.prev_lock_status)==(LOCK_NO_OFF))
{
trials[0] = NINV_NOFF;
trials[1] = NINV_ROFF;
trials[2] = INV_NOFF;
trials[3] = INV_ROFF;
/*
if (pParams.first_lock) num_trials=2;
else num_trials= 4;
*/
num_trials= 4;
}
else if ((pParams.prev_lock_status)==(LOCK_RI_OFF))
{
trials[0] = NINV_ROFF;
trials[1] = INV_ROFF;
/*
if (pParams.first_lock) num_trials=1;
else num_trials= 2;
*/
num_trials= 2;
}
else
{
trials[0] = NINV_NOFF;
trials[1] = NINV_LOFF;
trials[2] = NINV_ROFF;
trials[3] = INV_NOFF;
trials[4] = INV_LOFF;
trials[5] = INV_ROFF;
/*
if (pParams.first_lock) num_trials=3;
else num_trials= 6;
*/
num_trials= 6;
}
break;
}
pResult->SignalStatus=LOCK_KO;
index=0;
pParams.prev_lock_status=NO_LOCK;
while ( ( (index) < num_trials) && (pResult->SignalStatus!=LOCK_OK))
{
inv= trials[index]%2;
if ((!pParams.first_lock)||(pParams.Inv == STTUNER_INVERSION_AUTO) || (pParams.Inv == STTUNER_INVERSION_UNK) )
{
pParams.Sense = inv;
}
else
{
}
delta_freq=(trials[index]/2)*2 - (trials[index]/4)*6; /*circular module */
pParams.Frequency = frequency+delta_freq * STEP;
/** error checking is done here for the fix of the bug GNBvd20315 **/
error=FE_360_Search(DeviceMap,IOHandle,&pParams,pResult,TunerInstance);
if(error != FE_NO_ERROR)
{
return error;
}
if ((pResult->SignalStatus == NOAGC) || (pResult->SignalStatus == NOSYMBOL) ) break;
if ((pResult->SignalStatus==LOCK_OK))
{
switch(delta_freq)
{
case 0:
pParams.prev_lock_status=LOCK_NO_OFF;
break;
case 2:
pParams.prev_lock_status=LOCK_RI_OFF;
break;
case -2:
pParams.prev_lock_status=LOCK_LE_OFF;
break;
default:
pParams.prev_lock_status=LOCK_LE_OFF;
break;
}
}
index++;
}
return error;
}
/*----------------------------------------------------
FUNCTION GetNoiseEstimator (18Oct01)
ACTION
PARAMS IN
PARAMS OUT
RETURN
------------------------------------------------------*/
void FE_360_GetNoiseEstimator(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, U32 *pNoise, U32 *pBer)
{
short unsigned int source,prf;
U32 quoz,error;
U32 snr=0;
error = STTUNER_IOREG_GetField(DeviceMap,IOHandle,ERROR_COUNT1_LO);
error += STTUNER_IOREG_GetField(DeviceMap,IOHandle,ERROR_COUNT1_HI) * 256;
error = error*100;
quoz=1;
if (!STTUNER_IOREG_GetField(DeviceMap,IOHandle,ERRMODE1))
{
source=STTUNER_IOREG_GetField(DeviceMap,IOHandle,ERR_SOURCE1);
quoz=FE_360_PowOf2(12+2*(STTUNER_IOREG_GetField(DeviceMap,IOHandle,NUM_EVENT1)));
switch (source)
{
case 0:
quoz=quoz*8;
prf=STTUNER_IOREG_GetField(DeviceMap,IOHandle,PR);
switch(prf)
{
case 0:
error=(U32)(error*(1/2)); /*gbgbcast*/
break;
case 1:
error=(U32)(error*(2/3)); /*gbgbcast*/
break;
case 2:
error=(U32)(error*(3/4)); /*gbgbcast*/
break;
case 3:
error=(U32)(error*(5/6)); /*gbgbcast*/
break;
case 4:
error=(U32)(error*(6/7)); /*gbgbcast*/
break;
case 5:
error=(U32)(error*(7/8)); /*gbgbcast*/
break;
default:
error=error;
break;
}
break;
case 1:
quoz=quoz*8;
break;
case 2:
break;
case 3:
error=error*188;
break;
default:
error=error;
break;
}
}
snr=STTUNER_IOREG_GetField(DeviceMap,IOHandle,CHC_SNR);
/** fix done here for the bug GNBvd20972 where pNoise is calculated in right percentage **/
*pNoise=((snr/8)*100)/32;
*pBer = error*(100000000/quoz);
return;
}
/*********************************************************
--FUNCTION :: FE_360_Tracking
--ACTION :: Once the chip is locked tracks its state
--PARAMS IN :: period/duration of tracking in seconds
:: Handle to Chip
--PARAMS OUT:: NONE
--RETURN :: NONE
--********************************************************/
void FE_360_Tracking(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_360_SearchResult_t *Result)
{
int change;
int locka,lockb,wd;
int pr,mod,pr_temp;
unsigned short int mode;
unsigned short int guard=3;
short int tempo;
tempo=900;
change=0;
mode=Result->Mode;
guard=Result->Guard;
if (Result->hier==STTUNER_HIER_LOW_PRIO)
{
pr=Result->Lprate;
}
else
{
pr=Result->Hprate;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -