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

📄 d0360minidrv.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
			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( U32 *pNoise, U32 *pBer)
{
short unsigned int  source,prf;
U32                 quoz,error;
U32 snr=0;

error  = ChipDemodGetField(ERROR_COUNT1_LO);
error += ChipDemodGetField(ERROR_COUNT1_HI) * 256; 
error  = error*100;

quoz=1;
if (!ChipDemodGetField(ERRMODE1))
{
source=ChipDemodGetField(ERR_SOURCE1); 
quoz=FE_360_PowOf2(12+2*(ChipDemodGetField(NUM_EVENT1)));

switch (source)
{
case 0:
quoz=quoz*8;
prf=ChipDemodGetField(PR);

switch(prf)
{
case 0:
error=(U32)(error*(1.0/2.0)); /*gbgbcast*/ 
break;

case 1:
error=(U32)(error*(2.0/3.0)); /*gbgbcast*/ 
break;

case 2:
error=(U32)(error*(3.0/4.0)); /*gbgbcast*/ 
break;

case 3:
error=(U32)(error*(5.0/6.0)); /*gbgbcast*/ 
break;

case 4:
error=(U32)(error*(6.0/7.0)); /*gbgbcast*/
break;

case 5:
error=(U32)(error*(7.0/8.0)); /*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=ChipDemodGetField(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(FE_360_InternalParams_t *pParams)
{
int change;
int locka,lockb,wd;
int pr,mod;
unsigned short int mode;
unsigned short int guard=3;

short int tempo;



			/*	hChip = pParams->hChip;*/
				tempo=900;
				change=0;
				
				mode=(pParams->Results).Mode;
				guard=(pParams->Results).Guard;
				pr=(pParams->Results).Hprate;
				mod=(pParams->Results).Modulation;
				
				if (!ChipDemodGetField(TPS_LOCK) || (!ChipDemodGetField(LK))  )      
			  	{
					ChipDemodSetField(OP2_VAL,0);	
					ChipDemodSetField(OP2_VAL,1);
					ChipDemodSetField(OP2_VAL,0);	
					SystemWaitFor(50); 
					ChipDemodSetField(MODE,ChipDemodGetField(SYR_MODE));
					ChipDemodSetField(GUARD,ChipDemodGetField(SYR_GUARD));				
					ChipDemodSetField(FORCE,1);
					pParams->Echo.L1s2va3vp4 = 4;    
					ChipDemodSetField(CORE_ACTIVE,0);
					SystemWaitFor(2);   
					ChipDemodSetField(CORE_ACTIVE,1);
					ChipDemodSetField(OP2_VAL,0);	
					ChipDemodSetField(OP2_VAL,1);
					SystemWaitFor(30);   
					ChipDemodSetField(OP2_VAL,0);
					wd=300;
					while ((wd>=0) && (!ChipDemodGetField(TPS_LOCK)) )
						{
							SystemWaitFor(24);
							wd-=24;
						}
			    
					locka=lockb=ChipDemodGetField(TPS_LOCK);
					change=0;
					if (locka)
						{
							if( (ChipDemodGetField(TPS_HPCODE)==pr) && (mod==ChipDemodGetField(TPS_CONST))   )
								{
									SystemWaitFor(100);
									tempo-=80;
									lockb=ChipDemodGetField(TPS_LOCK);
									change=0;
								}
							else 
									change = 1;
						}
					if ((!lockb) && (!change))
						{
							ChipDemodSetField(OP2_VAL,0);	
							ChipDemodSetField(OP2_VAL,1);
							SystemWaitFor(30);
							ChipDemodSetField(OP2_VAL,0);
							pParams->Echo.L1s2va3vp4 = 4; 														
							ChipDemodSetField(CORE_ACTIVE,0);
							SystemWaitFor(2); 

							ChipDemodSetField(CORE_ACTIVE,1);
							ChipDemodSetField(OP2_VAL,0);	
							ChipDemodSetField(OP2_VAL,1);
							SystemWaitFor(32);
							ChipDemodSetField(OP2_VAL,0);								
							wd=300;
							while ((wd>=0) && (!ChipDemodGetField(TPS_LOCK)) )
								{		   
									SystemWaitFor(32);
									wd-=32;
								}
							if (wd>=0)
								{
									if( (ChipDemodGetField(TPS_HPCODE)!=pr) || (mod!=ChipDemodGetField(TPS_CONST))	) change=1;
								}
						}   /*end if locka */
				} /* end if chipget.... */
							if ( (ChipDemodGetField(TPS_LOCK ))&&(!change))
								{
										if ( ChipDemodGetField(SYR_GUARD) == 3)
											{
									/*			pParams->L1s2va3vp4 = 4; */
									
									/* 	it replaces the call to echo_proc  */ 
												
												passive_monitoring(&(pParams->Echo));
												active_monitoring(&(pParams->Echo));
												Echo_long_scan(&(pParams->Echo));
									/*   ********************************** */			
											/*	eco_proc(hChip,&(pParams->Echo));*/
											
												
											}
								}
			if (change)
				{
					if (ChipDemodGetField(TPS_CONST)==0) 
						{	
					 		;				
						}
					SystemWaitFor(500);  
					if (ChipDemodGetField(TPS_CONST)==0) 
						{	
							SystemWaitFor(400); 			
						}
					ChipDemodSetField(MODE,ChipDemodGetField(SYR_MODE));
					ChipDemodSetField(GUARD,ChipDemodGetField(SYR_GUARD));				
					ChipDemodSetField(FORCE,1);
					ChipDemodSetField(OP2_VAL,0);	
					ChipDemodSetField(OP2_VAL,1);
					ChipDemodSetField(OP2_VAL,0);
					if (ChipDemodGetField(TPS_CONST)==0) 
					{	
					 ;				
					}
				ChipDemodSetField(CORE_ACTIVE,0);
				ChipDemodSetField(CORE_ACTIVE,1);
				
					if (ChipDemodGetField(TPS_CONST)==0) 
					{	
					 ;				
					}
							
				SystemWaitFor(400);
				}
			
			if (ChipDemodGetField(LK) )
				{
				pr=ChipDemodGetField(TPS_HPCODE);
				mod=ChipDemodGetField(TPS_CONST);				
				(pParams->Results).Hprate=pr;
				(pParams->Results).Modulation=mod;
				
				}
			ChipDemodSetField(FORCE,0);   	
			
	return;

}



/**************************************************************************************/
/***** SET TRLNOMRATE REGISTERS *******************************/

void SET_TRLNOMRATE_REGS(short unsigned int value)
{
div_t divi;   

divi=div(value,512); 
ChipDemodSetField(TRL_NOMRATE_HI,divi.quot);
ChipDemodSetField(TRL_NOMRATE_LO,(divi.rem/2));
ChipDemodSetField(TRL_NOMRATE_LSB,(divi.rem%2));

}
/*************************************************************/
short unsigned int GET_TRLNOMRATE_VALUE(void)
{
short unsigned int value;   
value=  ChipDemodGetField(TRL_NOMRATE_HI)*512+ChipDemodGetField(TRL_NOMRATE_LO)*2+ChipDemodGetField(TRL_NOMRATE_LSB);	

return value;
}
/**************************************************************/
signed int GET_TRL_OFFSET(void)
{
	unsigned int  u_var;
    signed int    s_var;
	signed int i_int;
 
	ChipDemodSetField(FREEZE,1);								  
	/*ChipGetRegisters(hChip,R_TRL_NOMRATE1,4);*/
	ChipDemodSetField(FREEZE,0);
	/*s_var= 256* ChipGetFieldImage(hChip,TRL_TOFFSET_HI)+ChipGetFieldImage(hChip,TRL_TOFFSET_LO);*/
	s_var= 256* ChipDemodGetField(TRL_TOFFSET_HI)+ChipDemodGetField(TRL_TOFFSET_LO);
	if (s_var > 32768 ) s_var = s_var - 65536;
	
	u_var=  (512*ChipDemodGetField(TRL_NOMRATE_HI)+ChipDemodGetField(TRL_NOMRATE_LO)*2 + ChipDemodGetField(TRL_NOMRATE_LSB));
	i_int=((signed)(1000000/u_var)*s_var)/2048;


	return i_int;
}

void FE_360_Core_Switch(void)
{
ChipDemodSetField(CORE_ACTIVE,0);
ChipDemodSetField(CORE_ACTIVE,1);
SystemWaitFor(350);
return;
}

FE_360_SignalStatus_t FE_360_TRLNOMRATE_Tuning(void)
{
short unsigned int TRL_center,TRL_value ;
signed int OFFSET1,OFFSET2;
int i;

int Count=0;
        if(ChipDemodGetField(TPS_LOCK)==1)
        {
	   return LOCK_OK ;
	}
	else /** first else**/
	{
	TRL_center= GET_TRLNOMRATE_VALUE();
	TRL_value=TRL_center;
	for(i=0;i<5;i++)
		{
			TRL_value+=5;
			SET_TRLNOMRATE_REGS(TRL_value);
			FE_360_Core_Switch();
			if(ChipDemodGetField(TPS_LOCK)==1)
			break;
		}
	if (ChipDemodGetField(TPS_LOCK)==1)
	return LOCK_OK;
	else /**second else**/
	{
	   TRL_value=TRL_center;
	   
	for(i=0;i<5;i++)
	{
		TRL_value-=5;
		SET_TRLNOMRATE_REGS(TRL_value);
		FE_360_Core_Switch();
		if(ChipDemodGetField(TPS_LOCK)==1)
		break;
	}
	if (ChipDemodGetField(TPS_LOCK)==1)
	{
	   OFFSET1=GET_TRL_OFFSET();
	   if (OFFSET1 >=-5 && OFFSET1 <= 5)
	   {
	      return LOCK_OK;
	   }
	   else
	   {
	      if (OFFSET1>5  )
	      {
	      	do 
	        {
		   OFFSET2=OFFSET1; 
		   SET_TRLNOMRATE_REGS(GET_TRLNOMRATE_VALUE()+1);
		   FE_360_Core_Switch(); 
		   OFFSET1= GET_TRL_OFFSET();
		   Count+=1;
		  
	         }while (((OFFSET1>5) || (OFFSET1<-5))&&(Count<10));
	            return LOCK_OK;
									    
	      }
	      else if( OFFSET1<-5 )
	      {
	         OFFSET2= OFFSET1;
	         do 
	         {
	            OFFSET1=OFFSET2; 
	            SET_TRLNOMRATE_REGS(GET_TRLNOMRATE_VALUE()-1);
                    OFFSET2= GET_TRL_OFFSET();
	            Count+=1;
	          }while (((OFFSET1>5) || (OFFSET1<-5))&&(Count<10));
	        /*  printf(".........TRLNOMRATE VALUE HI ......%x\n",GET_TRLNOMRATE_VALUE(hChip)/512);
	         printf(".........TRLNOMRATE VALUE LOW ......%x\n",(GET_TRLNOMRATE_VALUE(hChip)%512)/2);
	          printf(".........TRLNOMRATE VALUE LOW ......%x\n",(GET_TRLNOMRATE_VALUE(hChip)%512)%2);*/
	          return LOCK_OK;
								    
	      }
	   }/* end of else of if (OFFSET1==0)*/
	}/* end of if (ChipDemodGetField(TPS_LOCK)==1)*/
	
	   return NOTPS;
	
        }/* end of second else */
        }/* end of first else*/
}



				















⌨️ 快捷键说明

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