⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d0361_echo.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
	}
	
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,LONG_ECHO,LEP_stop);
		SystemWaitFor(LEP_hold>>(2 - 2*mode));

for (i=LEP_stop;i!=LEP_start;i-=LEP_sense)
	{
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,LONG_ECHO,i);
		
		SystemWaitFor(LEP_hold>>(2 - 2*mode));
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,RESET_CNTR3,1);
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,RESET_CNTR3,0);		
		SystemWaitFor(10<<(2*mode));
		error= STTUNER_IOREG_GetField(DeviceMap,IOHandle,ERROR_COUNT3_LO)+
					(STTUNER_IOREG_GetField(DeviceMap,IOHandle,ERROR_COUNT3_HI)*256);
					
		if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,LK)  && (STTUNER_IOREG_GetField(DeviceMap,IOHandle,LINE_OK)) ) vect_ber[i+8]=error;
		else vect_ber[i+8]=65535;
	}
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,LONG_ECHO,LEP_start);
		
		SystemWaitFor(LEP_hold>>(2 - 2*mode));
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,RESET_CNTR3,1);
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,RESET_CNTR3,0);		
		SystemWaitFor(10<<(2*mode));
		error= STTUNER_IOREG_GetField(DeviceMap,IOHandle,ERROR_COUNT3_LO)+
					(STTUNER_IOREG_GetField(DeviceMap,IOHandle,ERROR_COUNT3_HI)*256);
		
		if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,LK) ) vect_ber[LEP_start+8]=error;
		else vect_ber[LEP_start+8]=65535;
	
	best_EPQ=65535;
	for (i=0;i<16;i++)
		{
		if (best_EPQ > vect_ber[i]) 
			{
				best_EPQ=vect_ber[i];
				best_EPQ_pos=i-8;
			}
		}

	for (i=LEP_start;i!=best_EPQ_pos;i+=LEP_sense)
		{
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,LONG_ECHO,i);
		SystemWaitFor(1<<(2*mode));
		}
		STTUNER_IOREG_SetField(DeviceMap,IOHandle,LONG_ECHO,best_EPQ_pos);		
		STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_ERRCTRL3,mode_BER);













}


#endif			 
#endif






#ifdef ECHO_VER2

#ifdef ECHO_VER3
/* ********************************************************************* */
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;



loc_L1 = pParams->L1s2va3vp4;
if ( (loc_L1!=1)  && (loc_L1!=2)) return;
#ifdef LOG_EPQ
DebugPrintf("\nlong echo ");
#endif

	
 
if (!STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK)) return;
	
	

if (loc_L1==1) LEP_step=1;
else LEP_step=4;

/* programmation core dynamique */


/* end prog core dynamique */



#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=4;
LEP_hold=16;
LEP_hold=8; /* modif */ 

/* 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/2);
	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
	STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0);	    
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
STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0);	
								
return;
}	

#endif


/* ********************************************************************* */
void Echo_long_scan_361(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_361_OFDMEchoParams_t *pParams)
/* ********************************************************************* */

{
U8 loc_L1;
U8 LEP_step,LEP_hold,LEP_ave;
U16 epq;
U8 tempo;

U16 SNR_max,snr;
S8  SNR_max_pos;
S8 current_LEP, LEP_idx;
S8 LEP_sens,LEP_start,LEP_stop;

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;
U8 epq_auto=0;

/********* To check the status of auto epq**********/
epq_auto=STTUNER_IOREG_GetField(DeviceMap,IOHandle,AUTO_LE_EN);

if(epq_auto==1)
{
   return;
}

loc_L1 = pParams->L1s2va3vp4;
if ( (loc_L1!=1)  && (loc_L1!=2))
{
	 return;
}

#ifdef LOG_EPQ
DebugPrintf("\nlong echo ");
#endif

	
 
if (!STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK)) return;
	






	
SystemWaitFor(10);
if (loc_L1==1) LEP_step=1;
else LEP_step=3;


/* 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=4;
LEP_hold=16;
LEP_hold=8; /* modif */ 

/* 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;
SNR_max=0;
bad_EPQ_val = 0;  
tempo= ( (LEP_hold-LEP_ave) * DELTA/2);
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( tempo );
	EPQ_val=0;
	epq=0;
	snr=0;
	for(i=0;i<LEP_ave;i++)		  /* modifs */
		{
		epq+=Get_EPQ_361(DeviceMap,IOHandle,pParams->I2CSpeed);
		snr+=STTUNER_IOREG_GetField(DeviceMap,IOHandle,CHC_SNR);

		}
		EPQ_val= (epq+(LEP_ave>>1))/LEP_ave;
	*((pParams->EPQ_val+(LEP_idx+8)) ) = EPQ_val;/*( (EPQ_val+(LEP_ave>>1))/LEP_ave );*/
	
	if (snr>=SNR_max)
		{
			SNR_max		=	snr;
			SNR_max_pos	=	LEP_idx;
		}
	
/* 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);


if ((best_EPQ_val<30) && ((bad_EPQ_val-best_EPQ_val) <=4))
	 {
	 	best_EPQ_val		= 	*((pParams->EPQ_val+(SNR_max_pos+8)) );
		best_EPQ_val_idx	=	SNR_max_pos;	 	
	 }

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
/*	STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0);*/ 	    
return;
}

/* verify best_LEP_val */

tmp_best_EPQ_val=0;
tempo=(LEP_hold)*DELTA;
SystemWaitFor( tempo );
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;
}	




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -