📄 d0361_drv.c
字号:
/*****************************************************
--FUNCTION :: FE_361_SearchRun
--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)
--REMARKS :: This function is supposed to replace FE_361_SearchRun according
-- to last findings on SYR block
--***************************************************/
FE_361_SignalStatus_t FE_361_SearchRun(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_361_InternalParams_t *pParams,STTUNER_tuner_instance_t *TunerInstance)
{
U8 v_search,Rvsearch;
int dbg_var;/* debug var */
FE_361_SignalStatus_t ret_flag;
short int wd,ii,tempo;
unsigned short int ppm,try,u_var,mode,guard,seuil;
#ifdef HOST_PC
FILE *fp,*fn;
/* debug variables */
static unsigned short int dbg_failure=0;
#endif
#ifdef LOG
#ifdef HOST_PC
fp=fopen("debug_driv.txt","a");
#endif
#endif
try=0;
if (abs(pParams->Frequency-858000)<=2000)
{
dbg_var=0;
}
else
dbg_var=0;
do
{
ret_flag=LOCK_OK_361;
STTUNER_IOREG_SetField(DeviceMap,IOHandle,MODE,pParams->Mode);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,GUARD,pParams->Guard);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,FORCE,pParams->Force);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,0);
if (dbg_var) STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,0);
if (dbg_var) STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,0);
SystemWaitFor(5);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,1);
if (dbg_var) STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,1);
if (dbg_var) STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,1);
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,AGC_LOCK);
wd=70;
while ((u_var==0) && (wd>0))
{
SystemWaitFor(10);
wd-=10;
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,AGC_LOCK);
}
if(!u_var)
{
ret_flag=NOAGC_361;
#ifdef HOST_PC
if(dbg_var) printf("no AGC! \n");
#endif
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n AGC NOT LOCKED \n"));
#endif
break;
}
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n AGC LOCKED \n"));
#endif
wd=120; /* dcdc modifs gbgb */
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_LOCK);
while ( (!u_var) && (wd>0))
{
SystemWaitFor(5);
wd-=5;
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_LOCK);
}
if(!u_var)
{
ret_flag=NOSYMBOL_361;
#ifdef HOST_PC
if(dbg_var) printf("no SYR! \n");
#endif
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n SYMBOL NOT LOCKED \n"));
#endif
break;
}
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n SYMBOL LOCKED \n"));
#endif
mode =STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_MODE) ;
guard=STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_GUARD);
if(mode == STTUNER_MODE_2K)
{
/***For 2k mode the chp_taps reg. must
***always set to 0x01***/
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_CHP_TAPS,0x01);
}
else
{
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_CHP_TAPS,0x03);/***For 8k mode the chp_taps reg. must
***always set to 0x03***/
}
tempo=15<<(2*mode);
SystemWaitFor(tempo);
ppm=0;
tempo=1<<(2*mode);
if(mode == STTUNER_MODE_8K)
{
tempo+=30;
}
for (ii=0;ii<4;ii++)
{
ppm+=STTUNER_IOREG_GetField(DeviceMap,IOHandle,PPM_CPC);
SystemWaitFor(tempo);
}
if (ppm< (CPQ_LIMIT <<(2*mode + 2)) )
{
ret_flag=BAD_CPQ_361;
#ifdef HOST_PC
if(dbg_var) printf("BAD CPQ! \n");
#endif
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n BAD CPQ \n"));
#endif
}
else
{
try=try;
}
try++;
} while ( (try<2) && (ret_flag!=LOCK_OK_361) );
if ( ret_flag!=LOCK_OK_361)
{
#ifdef LOG
#ifdef HOST_PC
fprintf(fp,"no lock status %d mode %d guard %d ppm %d num_trial %d\n",ret_flag, STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_MODE),STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_GUARD),ppm,dbg_num_trial);
fclose(fp);
#endif
#endif
#ifdef HOST_PC
if(dbg_var) printf("no something! \n");
#endif
return ret_flag;
}
/* dcdc debug */
if ((try==2) && (ret_flag==LOCK_OK_361))
{
#ifdef LOG
#ifdef HOST_PC
fprintf(fp,"failure %d trial %d\n",dbg_failure++,dbg_num_trial);
#endif
#endif
}
/*dcdc */
/*
#ifdef LOG
fclose(fp);
return ret_flag;
#endif
*/
/* end of dcdc debug */
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n GOOD CPQ FOUND \n"));
#endif
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK);
wd=65<<(2*mode);
tempo=4<<(2*mode);
while ((!u_var) && (wd>0))
{
SystemWaitFor(tempo);
wd-= tempo;
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK);
}
if (!u_var)
{
#ifdef LOG
#ifdef HOST_PC
fprintf(fp,"trial %d notps mode %d guard %d ppm %d\n",dbg_num_trial,mode,guard,ppm);
fclose(fp);
#endif
#endif
#ifdef HOST_PC
if(dbg_var) printf("no TPS! \n");
#endif
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n TPS NOT FOUND \n"));
#endif
return NOTPS_361;
}
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n TPS LOCKED \n"));
#endif
tempo= (14<<(2*mode));
SystemWaitFor(tempo); /* dcdc wait for EPQ to be reliable*/
guard=STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_GUARD);
if (guard== (unsigned short int )STTUNER_GUARD_1_4) CheckEPQ_361(DeviceMap,IOHandle,&pParams->Echo);
wd=36<<(2*mode);
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,PRF);
tempo=4<<(2*mode);
while ( (!u_var) && (wd>=0))
{
SystemWaitFor(tempo);
wd-=(tempo);
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,PRF);
}
if(!u_var)
{
#ifdef LOG
#ifdef HOST_PC
fprintf(fp,"trial %d noprf1 \n",dbg_num_trial);
fclose(fp);
#endif
#endif
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n NO PRF FOUND \n"));
#endif
return NOPRFOUND_361;
}
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n PRF FOUND \n"));
#endif
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,LK);
wd=75<<(2*mode);/* a revoir */
tempo=4<<(2*mode) ;
while ((!u_var) && (wd>=0))
{
SystemWaitFor( tempo);
wd-=tempo;
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,LK);
}
if(!u_var)
{
#ifdef LOG
#ifdef HOST_PC
fprintf(fp,"trial %d no lk \n",dbg_num_trial);
fclose(fp);
#endif
#endif
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n LK NOT LOCKED \n"));
#endif
return NOPRFOUND_361;
}
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n LK LOCKED \n"));
#endif
/*********Code Added For Hierarchical Modulation****************/
if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_HIERMODE)!=0)
{
if ((pParams->Hierarchy== STTUNER_HIER_PRIO_ANY) || (pParams->Hierarchy== STTUNER_HIER_HIGH_PRIO)|| (pParams->Hierarchy== STTUNER_HIER_NONE))
{
/* lock/secure the FEC for HP*/
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_HPCODE);
pParams->Hierarchy=STTUNER_HIER_HIGH_PRIO;
}/** End of if ((pParams->Hierarchy== STTUNER_HIER_PRIO_ANY) || (pParams->Hierarchy== STTUNER_HIER_HIGH_PRIO)|| (pParams->Hierarchy== STTUNER_HIER_NONE))**/
else
{
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LPCODE);
pParams->Hierarchy=STTUNER_HIER_LOW_PRIO;
}
}/***/
else
{
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_HPCODE);
pParams->Hierarchy=STTUNER_HIER_NONE;
}
if (pParams->Hierarchy==STTUNER_HIER_LOW_PRIO)
{
STTUNER_IOREG_SetField(DeviceMap,IOHandle,BDI_LPSEL,0x01);
}
else
{
STTUNER_IOREG_SetField(DeviceMap,IOHandle,BDI_LPSEL,0x00);
}
if (u_var==4 ) u_var=5;
switch(u_var)
{
case 0:
seuil=STTUNER_IOREG_GetField(DeviceMap,IOHandle,VTH0);
if (seuil <60) STTUNER_IOREG_SetField(DeviceMap,IOHandle,VTH0,45);
break;
case 1:
seuil=STTUNER_IOREG_GetField(DeviceMap,IOHandle,VTH1);
if (seuil < 40) STTUNER_IOREG_SetField(DeviceMap,IOHandle,VTH1,30);
break;
case 2:
seuil=STTUNER_IOREG_GetField(DeviceMap,IOHandle,VTH2);
if (seuil < 30) STTUNER_IOREG_SetField(DeviceMap,IOHandle,VTH2,23);
break;
case 3:
seuil=STTUNER_IOREG_GetField(DeviceMap,IOHandle,VTH3);
if (seuil < 18) STTUNER_IOREG_SetField(DeviceMap,IOHandle,VTH3,14);
break;
case 5:
seuil=STTUNER_IOREG_GetField(DeviceMap,IOHandle,VTH5);
if (seuil < 10) STTUNER_IOREG_SetField(DeviceMap,IOHandle,VTH5,8);
break;
default:
break;
}
u_var= (1<<u_var);
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_PR,u_var);
Rvsearch=STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,R_VSEARCH);
v_search=((1<<7) | Rvsearch) & 0xbf; /*use generic function/will be good for readability*/
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_VSEARCH,v_search);
return LOCK_OK_361;
}
/*****************************************************
--FUNCTION :: FE_361_SearchTerm
--ACTION ::
--PARAMS IN ::
--PARAMS OUT:: NONE
--RETURN :: NONE
--***************************************************/
FE_361_Error_t FE_361_SearchTerm(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_361_InternalParams_t *pParams,FE_361_SearchResult_t *pResult)
{
FE_361_Error_t error = FE_361_NO_ERROR;
U8 constell,counter;
S8 step;
S32 timing_offset;
U32 trl_nomrate;
int offset=0;
int offsetvar=0;
char signvalue=0;
U8 trl_ctl1[2],tps_rcvd[3],trl_ctl[5]={0},syr_stat[1],agc2_max[13]={0},Rtrl_ctl;
if(pParams != NULL)
{
if(pResult != NULL)
{
/* if ((pParams->State==LOCK_OK)|| (pParams->State==NOPRFOUND)) */
if ((pParams->State==LOCK_OK_361))
{
pResult->Locked = TRUE;
STTUNER_IOREG_GetContigousRegisters(DeviceMap,IOHandle,R_TPS_RCVD2,3,tps_rcvd);
STTUNER_IOREG_GetContigousRegisters(DeviceMap,IOHandle,R_SYR_STAT,1,syr_stat);
/*pResult->Mode=STTUNER_IOREG_FieldGetVal(DeviceMap,SYR_MODE);*/
pResult->Mode=(syr_stat[0]&0x04)>>2;
(pParams->Results).Mode=pResult->Mode;
/*pResult->Guard=STTUNER_IOREG_FieldGetVal(DeviceMap,SYR_GUARD);*/
pResult->Guard=syr_stat[0]&0x03;
(pParams->Results).Guard=pResult->Guard;
constell = tps_rcvd[0] & 0x03;/*STTUNER_IOREG_FieldGetVal(DeviceMap,TPS_CONST);*/
if (constell == 0) pResult->Modulation = STTUNER_MOD_QPSK;
else if (constell==1) pResult->Modulation= STTUNER_MOD_16QAM;
else pResult->Modulation= STTUNER_MOD_64QAM;
(pParams->Results).Modulation=pResult->Modulation;
pResult->hier=pParams->Hierarchy;
(pParams->Results).hier=pResult->hier;
pResult->Hierarchy_Alpha =tps_rcvd[0];/*STTUNER_IOREG_FieldGetVal(DeviceMap,TPS_HIERMODE);*/
pResult->Hprate= tps_rcvd[1] & 0x07;/*STTUNER_IOREG_FieldGetVal(DeviceMap,TPS_HPCODE);*/
(pParams->Results).Hprate=pResult->Hprate;
pResult->Lprate=(tps_rcvd[1] &0x70)>>4;/*STTUNER_IOREG_FieldGetVal(DeviceMap,TPS_LPCODE);*/
(pParams->Results).Lprate=pResult->Lprate;
constell = STTUNER_IOREG_GetField(DeviceMap,IOHandle,PR);;
if (constell==5) constell = 4;
pResult->pr = (FE_361_Rate_t) constell;
(pParams->Results).pr=pResult->pr;
pResult->Sense=STTUNER_IOREG_GetField(DeviceMap,IOHandle,INV_SPECTR);
/* dcdc modifs per Gilles*/
pResult->Tuner=pParams->Tuner;
pParams->first_lock=1;
/* modifs Tuner */
STTUNER_IOREG_GetContigousRegisters(DeviceMap,IOHandle,R_AGC2MAX,13,agc2_max);
pResult->Agc_val= (agc2_max[9]<<16) +
((agc2_max[10]&0x0f)<<24) +
agc2_max[11] +
((agc2_max[12]&0x0f)<<8);
/************To get exact frequency offset******************/
signvalue=STTUNER_IOREG_GetField(DeviceMap,IOHandle,SEXT);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -