📄 d0361_echo.c
字号:
#ifdef ST_OSLINUX
#include "stos.h"
#else
/*C libs */
#include <stdlib.h>
#endif
/* standard ansi includes */
/*#include "math.h"*/
#include "ioreg.h"
#ifdef HOST_PC
#include <utility.h>
#include <ansi_c.h>
/* generic includes */
#include "gen_macros.h"
#include "gen_types.h"
#include "gen_csts.h"
#include "360_Util.h"
#include "system.h"
#include "360_GUI.h"
#include "ApplMain.h"
#include "DRIVMAIN.h"
#include "Tun0360.h"
#else /* include STAPI */
#ifndef ST_OSLINUX
#include "stlite.h" /* Standard includes */
#endif
#include "stddefs.h"
#include "stcommon.h"
#endif
#include "361_map.h"
#include "361_echo.h"
#include "361_drv.h"
#ifndef HOST_PC
#if defined (ST_OS21)||(ST_OSLINUX)
#define UTIL_Delay(micro_sec) task_delay((signed int)(((micro_sec) + 999) / 1000) * ST_GetClocksPerSecond() / 1000)
#else
#define UTIL_Delay(micro_sec) task_delay((unsigned int)(((micro_sec) + 999) / 1000) * ST_GetClocksPerSecond() / 1000)
#endif
#define SystemWaitFor(x) UTIL_Delay((x*1000))
#endif
#define DELTA 2
#define MAX_EPQ_ACQ 30
/*#define LOG_EPQ*/
/* echo compiling options */
#define ECHO_VER2
#define ECHO_VER1
/* end echo compiling options */
S8 sign_361 (int x)
{
if (x>0) return 1;
else if (x<0) return -1;
else return 0;
}
void Echo_Init_361 (STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_361_OFDMEchoParams_t *pParams)
{
int epq_auto=0;
int i,data;
/********* To check the status of auto epq**********/
epq_auto= STTUNER_IOREG_GetField(DeviceMap,IOHandle,AUTO_LE_EN);
if(epq_auto==1)
{
return;
}
/****** here different epq reference value has been set in relation to FFT mode
modulation technique*********/
data=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_CONST);
if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_MODE) )
{
switch(data)
{
case 0 : /*QPSK*/
pParams->best_EPQ_val=35;
pParams->bad_EPQ_val=61;
pParams->EPQ_ref=35;
break;
case 1 : /*16 QAM */
pParams->best_EPQ_val=28;
pParams->bad_EPQ_val=54;
pParams->EPQ_ref=28;
break;
case 2 : /* 64 QAM */
pParams->best_EPQ_val=24;
pParams->bad_EPQ_val=50;
pParams->EPQ_ref=24;
break;
default :
pParams->best_EPQ_val=24;
pParams->bad_EPQ_val=50;
pParams->EPQ_ref=24;
break;
}/* end of switch */
}
else
{
switch(data)
{
case 0 : /*QPSK*/
pParams->best_EPQ_val=9;
pParams->bad_EPQ_val=15;
pParams->EPQ_ref=9;
break;
case 1 : /*16 QAM */
pParams->best_EPQ_val=7;
pParams->bad_EPQ_val=13;
pParams->EPQ_ref=7;
break;
case 2 : /* 64 QAM */
pParams->best_EPQ_val=6;
pParams->bad_EPQ_val=12;
pParams->EPQ_ref=6;
break;
default :
pParams->best_EPQ_val=6;
pParams->bad_EPQ_val=12;
pParams->EPQ_ref=6;
break;
}/* end of switch */
}
for (i=0;i<8;i++)
{
*(pParams->past_EPQ_val+i)=pParams->EPQ_ref;
}
pParams->L1s2va3vp4 = 1;
pParams->I2CSpeed=SpeedInit_361(DeviceMap,IOHandle);
/* init for Error counter number 3 */
/* error rate 2^16 */
data = (0<<7)+(1<<4)+(1<<2)+(2<<0);
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_ERRCTRL3,data);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,RESET_CNTR3,0);
return;
}
int Get_EPQ_361(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U8 Speed)
{
int epq;
epq=STTUNER_IOREG_GetField(DeviceMap,IOHandle,EPQ);
return epq ;
}
/* ********************************************************************* */
#ifndef ECHO_VER1
/* ********************************************************************* */
/* ********************************************************************* */
void Echo_long_scan_361(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_361_OFDMEchoParams_t *pParams)
/* ********************************************************************* */
{
U8 loc_L1,u_var;
U8 LEP_step,LEP_hold,LEP_ave,tps_lock;
U16 epq;
S16 wd;
S8 LEP_val,current_LEP, LEP_idx;
S8 LEP_sens,LEP_start,LEP_stop;
S8 long_echo_protection;
unsigned short int i;
unsigned short int EPQ_val;
unsigned short int tmp_best_EPQ_val,best_EPQ_val,bad_EPQ_val;
short int best_EPQ_val_idx,agc_status,force,mode;
unsigned short int bypass_pga;
U8 cor_modeguard,Rcor_modeguard;
loc_L1 = pParams->L1s2va3vp4;
if ( (loc_L1!=1) && (loc_L1!=2)) return;
#ifdef LOG_EPQ
DebugPrintf("long echo ");
#endif
if (loc_L1==1) LEP_step=1;
else LEP_step=4;
/* programmation core dynamique */
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_CHC_CTL1,0xB1);
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_CRL_CTL,0x4F);
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_CAS_CTL,0x40);
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_FREESTFE_1,0x03);
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_AGC_CTL,0x18);
/* end prog core dynamique */
tps_lock=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK);
wd=(20<<(2*STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_MODE)));
while((wd>=0)&&(!tps_lock))
{
SystemWaitFor(4);
tps_lock=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK);
wd-=4;
}
tps_lock=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK);
if (!tps_lock)
{
force = STTUNER_IOREG_GetField(DeviceMap,IOHandle,FORCE);
/*DebugPrintf("TPs unlocked");*/
mode = STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_MODE);
Rcor_modeguard=STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,R_COR_MODEGUARD);
cor_modeguard = (Rcor_modeguard & 0xf0) | (1<<3)| (mode<<2) | STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_GUARD);
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_COR_MODEGUARD,cor_modeguard);
agc_status=STTUNER_IOREG_GetField(DeviceMap,IOHandle,AGC_LAST);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,AGC_LAST,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,AGC_LAST,agc_status);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,FORCE,force);
wd=75<<(2*mode);
while ((wd>=0) && (!STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK) ) )
{
SystemWaitFor(4);
wd-=4;
}
if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK))
{
SystemWaitFor(14<<(2*mode)); /*wait about 50 symbols after TPS locked */
}
else
{
return;
}
}
#ifdef LOG_EPQ
if (!STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK))
{
wd=80;
}
#endif
/* current LEP val can be adjusted */
current_LEP=STTUNER_IOREG_GetField(DeviceMap,IOHandle,LONG_ECHO);
if (current_LEP >= 0)
{
LEP_sens=-1;
LEP_start=7;
LEP_stop=-8;
}
else
{
LEP_sens=1;
LEP_start=-8;
LEP_stop=7;
}
LEP_ave=8;
LEP_hold=16;
/* re_find start position */
LEP_idx=current_LEP;
while (LEP_idx!=LEP_start)
{
LEP_idx-=LEP_sens*LEP_step;
if ( (LEP_idx*sign_361(LEP_start))> abs(LEP_start)) LEP_idx = LEP_start;
STTUNER_IOREG_SetField(DeviceMap,IOHandle,LONG_ECHO,LEP_idx);
SystemWaitFor(LEP_hold); /* delay to be defined */
}
/* EPQ measurements for different LEP_val*/
LEP_idx=LEP_start-(LEP_sens * LEP_step);
best_EPQ_val=255;
do
{
LEP_idx+=(LEP_sens * LEP_step);
if ( (LEP_idx*sign_361(LEP_stop))> abs(LEP_stop)) LEP_idx = LEP_stop;
STTUNER_IOREG_SetField(DeviceMap,IOHandle,LONG_ECHO,LEP_idx);
SystemWaitFor( (LEP_hold-LEP_ave) * DELTA);
EPQ_val=0;
/* best_EPQ_val_idx = 0;*/
bad_EPQ_val = 0;
epq=0;
for(i=0;i<LEP_ave;i++) /* modifs */
{
epq+=Get_EPQ_361(DeviceMap,IOHandle,pParams->I2CSpeed);
/* if (epq>EPQ_val) EPQ_val=epq; */
SystemWaitFor(DELTA);/*wait 1(DELTA for debug) symbol(s)*/
}
EPQ_val= (epq+(LEP_ave>>1))/LEP_ave;
*((pParams->EPQ_val+(LEP_idx+8)) ) = EPQ_val;/*( (EPQ_val+(LEP_ave>>1))/LEP_ave );*/
/* search best LEP and its index */
if (EPQ_val<=best_EPQ_val)
{
pParams->best_EPQ_val=EPQ_val;
pParams->best_EPQ_val_idx=LEP_idx;
best_EPQ_val=EPQ_val;
best_EPQ_val_idx=LEP_idx;
}
if (EPQ_val > bad_EPQ_val) bad_EPQ_val=EPQ_val;
} while (LEP_idx!=LEP_stop);
pParams->best_EPQ_val=best_EPQ_val;
pParams->best_EPQ_val_idx=best_EPQ_val_idx;
if (bad_EPQ_val <= 3) bad_EPQ_val=3;/* to be detailled in future*/
/* re-find best longechoprotection position */
LEP_sens = -LEP_sens;
/* LEP is in LEP_stop following the previous loop */
for (LEP_idx=LEP_stop;LEP_idx!=best_EPQ_val_idx;LEP_idx+=(LEP_step*LEP_sens) )
{
STTUNER_IOREG_SetField(DeviceMap,IOHandle,LONG_ECHO,LEP_idx);
SystemWaitFor(DELTA); /*wait 500 symbols*/
}
STTUNER_IOREG_SetField(DeviceMap,IOHandle,LONG_ECHO,LEP_idx);
#ifdef LOG_ECHO
fa=fopen("debug_echo.txt","a");
fprintf(fa,"ls LEP %d ",LEP_idx);
fclose(fa);
#endif
#ifdef LOG_EPQ
DebugPrintf(" ls LEP %d ",LEP_idx);
#endif
if (best_EPQ_val> (pParams->EPQ_ref+1))
{
pParams->L1s2va3vp4=1;
#ifdef LOG_ECHO
fa=fopen("debug_echo.txt","a");
fprintf(fa,"ls best_EPQ %d final L1... %d \n",best_EPQ_val,pParams->L1s2va3vp4);
fclose(fa);
#endif
#ifdef LOG_EPQ
/*DebugPrintf ("\n ref: best_EPQ %d best_pos %d \n",best_EPQ_val,best_EPQ_val_idx);*/
DebugPrintf("ls best_EPQ %d best_pos final L1... %d \n",best_EPQ_val,best_EPQ_val_idx,pParams->L1s2va3vp4);
#endif
return;
}
/* verify best_LEP_val */
tmp_best_EPQ_val=0;
SystemWaitFor( (LEP_hold)*DELTA );
epq=0;
for (i=0;i<LEP_ave;i++)
{
epq+=Get_EPQ_361(DeviceMap,IOHandle,pParams->I2CSpeed);
/* if(epq>tmp_best_EPQ_val) tmp_best_EPQ_val = epq;*/
SystemWaitFor(DELTA); /* wait next symbol*/
}
tmp_best_EPQ_val=(epq+(LEP_ave>>1))/LEP_ave;
/* dcdc tmp_best_EPQ_val=(tmp_best_EPQ_val+(LEP_ave>>1))/LEP_ave; */
if (best_EPQ_val>=(tmp_best_EPQ_val-5) ) /* value to be checked */
{
best_EPQ_val=tmp_best_EPQ_val;
pParams->L1s2va3vp4=4;
}
else
{
pParams->L1s2va3vp4=1;
}
pParams->best_EPQ_val=best_EPQ_val;
pParams->best_EPQ_val_idx=best_EPQ_val_idx;
pParams->bad_EPQ_val=bad_EPQ_val;
#ifdef LOG_EPQ
DebugPrintf (" norm :best_EPQ %d best_pos %d tmp_epq %d \n",best_EPQ_val,best_EPQ_val_idx,tmp_best_EPQ_val);
#endif
#ifdef LOG_ECHO
fa=fopen("debug_echo.txt","a");
fprintf(fa,"final L1... %d \n",pParams->L1s2va3vp4);
fclose(fa);
#endif
return;
}
/* ********************************************************************* */
/* ********************************************************************* */
void passive_monitoring_361(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_361_OFDMEchoParams_t *pParams)
/* ********************************************************************* */
/* ********************************************************************* */
{
U8 loc_L1,LEP_step,LEP_ave,LEP_hold;
U16 epq;
S8 LEP_sens,LEP_start,LEP_stop,LEP_val;
unsigned short int tmp_best_EPQ_val,i,force,agc_status,mode;
short int wd;
unsigned int error;
loc_L1 = pParams->L1s2va3vp4;
if (loc_L1==4) LEP_step = 1;
/* programmation NON dynamique ou dynamique si Doppler */
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_CHC_CTL1,0xB1);
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_CRL_CTL,0x4F);
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_CAS_CTL,0x40);
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_FREESTFE_1,0x03);
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_AGC_CTL,0x18);
if (loc_L1 !=4)
{
return;
}
LEP_val=STTUNER_IOREG_GetField(DeviceMap,IOHandle,LONG_ECHO);
if (LEP_val >=0)
{
LEP_sens = -1;
LEP_start = 7;
LEP_stop = -8;
}
else
{
LEP_sens = +1;
LEP_start = -8;
LEP_stop = +7;
}
/* EPQ measurements for current LEP */
LEP_hold=10;
LEP_ave=4;
SystemWaitFor(DELTA);
tmp_best_EPQ_val=0;
for (i=0;i<8;i++)
{
tmp_best_EPQ_val+=*(pParams->past_EPQ_val+i);
}
pParams->best_EPQ_val = (tmp_best_EPQ_val+4)/8;
/*scroll past epq values */
for (i=7;i>0;i--)
{
*(pParams->past_EPQ_val+i)=*(pParams->past_EPQ_val+i-1);
}
tmp_best_EPQ_val=0;
SystemWaitFor(LEP_hold - LEP_ave);
epq=0;
for (i=0;i<LEP_ave;i++)
{
epq+=Get_EPQ_361(DeviceMap,IOHandle,pParams->I2CSpeed);
/* if (epq>tmp_best_EPQ_val) tmp_best_EPQ_val = epq;*/
SystemWaitFor(DELTA*2);
}
/* dcdc cut 2.0 */
tmp_best_EPQ_val=(epq+ (LEP_ave>>1))/LEP_ave;
*(pParams->past_EPQ_val)=tmp_best_EPQ_val;
if (tmp_best_EPQ_val <=(pParams->EPQ_ref))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -