📄 d0360_drv.c
字号:
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;
#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;
#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);
tempo=15<<(2*mode);
SystemWaitFor(tempo);
ppm=0;
tempo=1<<(2*mode);
for (ii=0;ii<4;ii++)
{
ppm+=STTUNER_IOREG_GetField(DeviceMap,IOHandle,PPM_CPC);
SystemWaitFor(tempo);
}
if (ppm< (CPQ_LIMIT <<(2*mode + 2)) )
{
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n BAD CPQ \n"));
#endif
ret_flag=BAD_CPQ;
}
else
{
try=try;
}
try++;
} while ( (try<2) && (ret_flag!=LOCK_OK) );
if ( ret_flag!=LOCK_OK)
{
if (Inst->TRL_IOCTL_Set_Flag==FALSE)
{
if(((ret_flag == BAD_CPQ)||(ret_flag == NOSYMBOL)) && (pParams->TrlNormRateTunning == FALSE)
&& (STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_MODE)==STTUNER_MODE_8K))
{
/*SystemWaitFor(200);*/
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n TRLNORMRATE ALGORITHM CALLED \n"));
#endif
ret_flag=FE_360_TRLNOMRATE_Tuning(DeviceMap,IOHandle) ;
if(ret_flag == LOCK_OK)
{
pParams->TrlNormRateTunning =TRUE;
}
else
{
return ret_flag;
}
}
else
{
return ret_flag;
}
}
else
{
return ret_flag;
}
}
#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 STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n TPS NOT FOUND \n"));
#endif
return NOTPS;
}
#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(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 STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n NO PRF FOUND \n"));
#endif
return NOPRFOUND;
}
#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 STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n LK NOT LOCKED \n"));
#endif
return NOPRFOUND;
}
#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;
}
}/** End of if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_HIERMODE)!=0)***/
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;
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_VSEARCH,v_search);
/******************************************************************/
pParams->TrlNormRateTunning =TRUE;
return LOCK_OK;
}
/*****************************************************
--FUNCTION :: FE_360_SearchTerm
--ACTION ::
--PARAMS IN ::
--PARAMS OUT:: NONE
--RETURN :: NONE
--***************************************************/
FE_360_Error_t FE_360_SearchTerm(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_360_InternalParams_t *pParams,FE_360_SearchResult_t *pResult)
{
FE_360_Error_t error = FE_NO_ERROR;
U8 constell,counter;
S8 step;
S32 timing_offset;
U32 trl_nomrate;
int offset=0;
int offsetvar=0;
char signvalue=0;
U8 tps_rcvd[3]={0},agc2_max[13]={0},trl_ctl[5]={0},trl_ctl1[2],syr_stat[1]={0},Rtrl_ctl;
if(pParams != NULL)
{
if(pResult != NULL)
{
/* if ((pParams->State==LOCK_OK)|| (pParams->State==NOPRFOUND)) */
if ((pParams->State==LOCK_OK))
{
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=(syr_stat[0]&0x04)>>2;
(pParams->Results).Mode=pResult->Mode;
pResult->Guard=syr_stat[0]&0x03;
(pParams->Results).Guard=pResult->Guard;
constell = tps_rcvd[0] & 0x03;
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]&0x70)>>4;
pResult->Hprate=tps_rcvd[1] & 0x07;
(pParams->Results).Hprate=pResult->Hprate;
pResult->Lprate=(tps_rcvd[1] &0x70)>>4;
(pParams->Results).Lprate=pResult->Lprate;
constell = STTUNER_IOREG_GetField(DeviceMap,IOHandle,PR);
if (constell==5) constell = 4;
pResult->pr = (FE_360_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);
offset=STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,R_CRL_FREQ3);
offset <<=16;
offsetvar=STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,R_CRL_FREQ2);
/*task_delay(time_ticks_per_sec());*/
offsetvar <<=8;
offset = offset | offsetvar;
offsetvar=0;
offsetvar=STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,R_CRL_FREQ1);
offset =offset | offsetvar ;
if(signvalue==1)
{
offset |=0xff000000;/*** Here sign extension made for the negative number**/
}
offset =offset /16384;/***offset calculation done according to data sheet of STV0360***/
if(pResult->Mode==0)
{
/*******it is 2k mode***************/
offset=((offset*4464)/1000);/*** 1 FFT BIN=4.464khz***/
}
else
{
/*******it is 8k mode***************/
offset=((offset*11)/10);/*** 1 FFT BIN=1.1khz***/
}
/****This block of code ensures the frequency to be corrected only when***
*** the offset is in range between 140khz to 180khz both positive and negative***
****direction . This takes care of 166khz offset which sometimes needed******
****to get far away from some interfering analog carrier in some European countries.*****/
/* if(((offset>=140) && (offset<=180)) ||((offset<=-140) && (offset>=-180)))
{
pParams->Frequency-=offset;
}*/
/*** Here +/-166 khz offset taken into consideration and the excess
offset lying between +/- 140 to 180 khz will be returned to
user for fine tunning ****/
if((offset>=140) && (offset<=180))
{
if(pResult->Sense==0)
{
pParams->Frequency +=166;
}
else
{
pParams->Frequency -=166;
}
}
else if((offset<=-140) && (offset>=-180))
{
if(pResult->Sense==0)
{
pParams->Frequency -=166;
}
else
{
pParams->Frequency +=166;
}
}
/***pResult data structure retains the recent data after tuner locks***/
pResult->Frequency=pParams->Frequency;
/************************************************************************/
pResult->Echo_pos=STTUNER_IOREG_GetField(DeviceMap,IOHandle,LONG_ECHO);
if(pParams->TrlNormRateFineTunning == FALSE)
{
/* fine tuning of timing offset if required */
STTUNER_IOREG_GetContigousRegisters(DeviceMap,IOHandle,R_TRL_CTL,5,trl_ctl);
timing_offset=trl_ctl[3] + 256*trl_ctl[4];
if (timing_offset>=32768) timing_offset-=65536;
/* timing_offset=(timing_offset+10)/20; */ /* rounding */
trl_nomrate= (512*trl_ctl[2]+trl_ctl[1]*2 + ((trl_ctl[0]&0x80)>>7));
timing_offset=((signed)(1000000/trl_nomrate)*timing_offset)/2048;
if (timing_offset<=0)
{
timing_offset=(timing_offset-11)/22;
step=-1;
}
else
{
timing_offset=(timing_offset+11)/22;
step=1;
}
for (counter=0;counter<abs(timing_offset);counter++)
{
trl_nomrate+=step;
Rtrl_ctl=STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,R_TRL_CTL);
trl_ctl1[0]=((trl_nomrate%2)<<7) | (Rtrl_ctl&0X7F) ;
trl_ctl1[1]=trl_nomrate/2;
STTUNER_IOREG_SetContigousRegisters(DeviceMap,IOHandle,R_TRL_CTL,trl_ctl1,2);
SystemWaitFor(1);
}
pParams->TrlNormRateFineTunning =TRUE;
if(pParams->ChannelBWStatus == STTUNER_CHAN_BW_6M)
{
pParams->Channel_6M_Trl_Done = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -