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

📄 d0361_drv.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 4 页
字号:




		frequency		= pSearch->Frequency;		
		
			












		
			pParams.I2Cspeed = SpeedInit_361(DeviceMap,IOHandle);  
			pParams.prev_lock_status = NO_LOCK;
			pParams.first_lock=0;
			/****Initialize TRLNORMRATE TUNNING FLAG*****/
			pParams.TrlNormRateFineTunning = FALSE ;
			/***Initialize channel bandwidth value with a common value as the particular channel
			    bandwidth still not known*****/
			pParams.ChannelBWStatus = STTUNER_CHAN_BW_NONE ;
		
		/************************/
		
		
	pParams.Frequency=pSearch->Frequency;
	/* debug code */

	/* end debug code */
	pParams.Mode = pSearch->Mode;
	pParams.Guard = pSearch->Guard;
	pParams.Inv= pSearch->Inv;
	pParams.Hierarchy=pSearch->Hierarchy;
	
	pParams.Force=pSearch->Force + STTUNER_IOREG_GetField(DeviceMap,IOHandle,FORCE)*2;
	pParams.ChannelBW = pSearch->ChannelBW; 
	pParams.Tuner=TunerInstance->Driver->ID;
	pParams.Quartz=0;
	if(pParams.ChannelBW != pParams.ChannelBWStatus)
	{
	   pParams.ChannelBWStatus=pParams.ChannelBW;
	   pParams.TrlNormRateFineTunning=FALSE;   
	}
	
	/****Initialize the trl done parameter with false *****/
			pParams.Channel_6M_Trl_Done = FALSE;
			pParams.Channel_7M_Trl_Done = FALSE;
			pParams.Channel_8M_Trl_Done = FALSE;
			/****Initial normrate setting for 6 Mhz bandwidth***/
			pParams.Channel_6M_Trl[0]=M6_F_TRL_NOMRATE0;
			pParams.Channel_6M_Trl[1]=M6_F_TRL_NOMRATE8_1;
			pParams.Channel_6M_Trl[2]=M6_F_TRL_NOMRATE16_9;
			
			/****Initial normrate setting for 7 Mhz bandwidth***/
			pParams.Channel_7M_Trl[0]=M7_F_TRL_NOMRATE0;
			pParams.Channel_7M_Trl[1]=M7_F_TRL_NOMRATE8_1;
			pParams.Channel_7M_Trl[2]=M7_F_TRL_NOMRATE16_9;
			
			/****Initial normrate setting for 8 Mhz bandwidth***/
			pParams.Channel_8M_Trl[0]=M8_F_TRL_NOMRATE0;
			pParams.Channel_8M_Trl[1]=M8_F_TRL_NOMRATE8_1;
			pParams.Channel_8M_Trl[2]=M8_F_TRL_NOMRATE16_9;

	
	pParams.State	=NODATA_361;
	pParams.EchoPos   = pSearch->EchoPos;	
		/**************************/
	
		pParams.Offset	= pSearch->Offset;
		pParams.Inv	= pSearch->Inv;		
		pParams.Delta	= 0;

		flag_spec_inv	= 0;		
		flag_freq_off	= 0;
		flag			= pSearch->Offset*2 + ((pSearch->Inv>>1)&1);		
					
			switch (flag)
			{
			
			case 0:
			trials[0]=NINV_NOFF;
			trials[1]= INV_NOFF;			
			if ( (pParams.Inv == STTUNER_INVERSION_NONE) || (pParams.Inv == STTUNER_INVERSION))
				{
					num_trials=1;
				}
				
			else
				num_trials=2;
			
			if ( (pParams.first_lock)	&& (pParams.Inv == STTUNER_INVERSION_UNK))
				{
					num_trials=1;	
				}
			break;
			
			case 1:
			trials[0]= NINV_NOFF;
			trials[1]=  INV_NOFF;
			num_trials=2;
			break;
			
			case 2:
			if ((pParams.prev_lock_status)==(LOCK_NO_OFF))
				{
				trials[0] = NINV_NOFF;
				trials[1] = NINV_ROFF;
				trials[2] =  INV_NOFF;									
				trials[3] =  INV_ROFF;									
				if ( (pParams.Inv == STTUNER_INVERSION_NONE) || (pParams.Inv == STTUNER_INVERSION))
				{
					num_trials=2;
				}
				else	num_trials= 4;
			
				
				if ( (pParams.first_lock)	&& (pParams.Inv == STTUNER_INVERSION_UNK))
				{
					num_trials=2;	
				}
				
				
				}
			else if ((pParams.prev_lock_status)==(LOCK_RI_OFF))
				{
				
				trials[0] = NINV_ROFF;									
				trials[1] =  INV_ROFF;									
				if ( (pParams.Inv == STTUNER_INVERSION_NONE) || (pParams.Inv == STTUNER_INVERSION))
				{
					num_trials=1;
				}
				
				else	num_trials= 2;
		
				
				if ( (pParams.first_lock)	&& (pParams.Inv == STTUNER_INVERSION_UNK))
					{
						num_trials=1;	
					}
				}
			else
				{
				trials[0] = NINV_NOFF;
				trials[1] = NINV_LOFF;									
				trials[2] = NINV_ROFF;
				trials[3] =  INV_NOFF;
				trials[4] =  INV_LOFF;									
				trials[5] =  INV_ROFF;
				if ( (pParams.Inv == STTUNER_INVERSION_NONE) || (pParams.Inv == STTUNER_INVERSION))
				{
					num_trials=3;
				}
				
				else	num_trials= 6;
				
				
				
				if ( (pParams.first_lock)	&& (pParams.Inv == STTUNER_INVERSION_UNK))
					{
						num_trials=3;	
					}
				}
			break;
			case 3:
			
			default:
			if ((pParams.prev_lock_status)==(LOCK_NO_OFF))
				{
				trials[0] = NINV_NOFF;
				trials[1] = NINV_ROFF;									
				trials[2] =  INV_NOFF;
				trials[3] =  INV_ROFF;									
				/*
				if (pParams->first_lock) num_trials=2;
				else num_trials= 4;
				*/
				num_trials= 4;
				}
			else if ((pParams.prev_lock_status)==(LOCK_RI_OFF))
				{
				
				trials[0] = NINV_ROFF;									
				trials[1] =  INV_ROFF;									
				/*
				if (pParams->first_lock) num_trials=1;
				else num_trials= 2;
				*/
				num_trials= 2;
				}
			else
				{
				trials[0] = NINV_NOFF;
				trials[1] = NINV_LOFF;									
				trials[2] = NINV_ROFF;
				trials[3] =  INV_NOFF;
				trials[4] =  INV_LOFF;									
				trials[5] =  INV_ROFF;
				/*
				if (pParams->first_lock) num_trials=3;
				else num_trials= 6;
				*/
				num_trials= 6;
				}
			
			break;
			
			}
		
			
	
		pResult->SignalStatus=LOCK_KO_361;		
		index=0;
		pParams.prev_lock_status=NO_LOCK;
		
		while ( ( (index) < num_trials) && (pResult->SignalStatus!=LOCK_OK_361)) 		 
		{
			
			inv= trials[index]%2;
			
			if ((!pParams.first_lock)||(pParams.Inv == STTUNER_INVERSION_AUTO) || (pParams.Inv == STTUNER_INVERSION_UNK) ) 
				{
					pParams.Sense	=  inv; 
				}
			else
				{
					
				}
			
			/*
			inv= trials[index]%2;
			
			if ((!pParams->first_lock)||(pSearch->Inv)) 
				{
					pLook.Inv		=  inv;
					pParams->Sense	=  inv; 
				}
			else
				{
					pLook.Inv		=  pParams->Sense;
				}
			*/			
			
			delta_freq=(trials[index]/2)*2 - (trials[index]/4)*6; /*circular module */
			
			pParams.Frequency = frequency+delta_freq * STEP;
			
			
			/** error checking is done here for the fix of the bug GNBvd20315 **/
			error=FE_361_Search(DeviceMap,IOHandle,&pParams,pResult,TunerInstance); 
			if(error != FE_361_NO_ERROR)
			{
			   return error;
			}
			
			
			if ((pResult->SignalStatus == NOAGC_361) || (pResult->SignalStatus == NOSYMBOL_361) ) break;
		
			if ((pResult->SignalStatus==LOCK_OK_361))
			
				{
				
			   	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_361_GetNoiseEstimator(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, U32 *pNoise, U32 *pBer)
{
short unsigned int  source,prf;
U32                 quoz,error;
U32 snr=0;

error  = STTUNER_IOREG_GetField(DeviceMap,IOHandle,ERROR_COUNT1_LO);
error += STTUNER_IOREG_GetField(DeviceMap,IOHandle,ERROR_COUNT1_HI) * 256; 
error  = error*100;

quoz=1;
if (!STTUNER_IOREG_GetField(DeviceMap,IOHandle,ERRMODE1))
{
source=STTUNER_IOREG_GetField(DeviceMap,IOHandle,ERR_SOURCE1); 

quoz=FE_361_PowOf2(12+2*(STTUNER_IOREG_GetField(DeviceMap,IOHandle,NUM_EVENT1)));

switch (source)
{
case 0:
quoz=quoz*8;
prf=STTUNER_IOREG_GetField(DeviceMap,IOHandle,PR);

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

case 1:
error=(U32)(error*(2/3)); /*gbgbcast*/ 
break;

case 2:
error=(U32)(error*(3/4)); /*gbgbcast*/ 
break;

case 3:
error=(U32)(error*(5/6)); /*gbgbcast*/ 
break;

case 4:
error=(U32)(error*(6/7)); /*gbgbcast*/
break;

case 5:
error=(U32)(error*(7/8)); /*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=STTUNER_IOREG_GetField(DeviceMap,IOHandle,CHC_SNR);



/**pNoise = (snr*10) >> 3;*/
/**  fix done here for the bug GNBvd20972 where pNoise is calculated in right percentage **/
*pNoise=((snr/8)*100)/32;
*pBer   = error*(100000000/quoz); /**** (error/quoz) gives my actual BER . We multiply it with
                                        10*e+8 now and 10*e+2 before for scaling purpose so that we can send a integer 
                                        value to application user . So total scaling factor is 10*e+10*****/  
return;
}



/*********************************************************
--FUNCTION	::	FE_361_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_361_Tracking(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_361_SearchResult_t  *Result)
{

int change;
int locka,lockb,wd;
int pr,mod,pr_temp;
unsigned short int mode;
unsigned short int guard=3;
/*FE_361_InternalParams_ts *pParams;*/
short int tempo;
/*D0361_InstanceData_t    *Instance;*/
/*pParams = (FE_361_InternalParams_t *)Instance->FE_361_Handle;*/
                                
				

				tempo=900;
				change=0;
                                
                               	mode=Result->Mode;
				guard=Result->Guard;
				if (Result->Hierarchy==STTUNER_HIER_LOW_PRIO)
			  {
			     pr=Result->Lprate;
			  }
			  else
			  {
				pr=Result->Hprate;
			  }

			/*	pr=(pParams->Results).Hprate;*/
				mod=Result->Modulation;
				
				if (!STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK)  || (!STTUNER_IOREG_GetField(DeviceMap,IOHandle,LK) )  )      
			  	{
			  		
			  		STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0) ;
					
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,1) ;
					
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0) ;
					SystemWaitFor(50); 
					
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,MODE,(STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_MODE))) ;
					
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,GUARD,(STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_GUARD))) ;			
					
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,FORCE,1) ;
					Result->Echo.L1s2va3vp4 = 4;    
					
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,0) ;
					SystemWaitFor(2);   
					
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,1) ;
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0) ;
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,1) ;
					
					SystemWaitFor(30);   
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0) ;
					
					wd=300;
					while ((wd>=0) && (!STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK) ) )
						{
							SystemWaitFor(24);
							wd-=24;
						}
			    
					locka=lockb=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK);
					change=0;
					if (locka)
						{
							if(Result->Hierarchy==STTUNER_HIER_LOW_PRIO)
							{
							   pr_temp=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LPCODE);
							}
							else
							{
							   pr_temp=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_HPCODE);
							}
							if( (pr_temp==pr) && (mod==STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_CONST))   )
								{
									SystemWaitFor(100);
									tempo-=80;
									lockb=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK);
									change=0;
								}
							else 
									change = 1;
						}
					if ((!lockb) && (!change))
						{
							
							STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0);
							STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,1);
							SystemWaitFor(30);
							
							STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0);
							Result->Echo.L1s2va3vp4 = 4; 														
							
							STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,0);
							SystemWaitFor(2); 

							
							STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,1);
							STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0);
							STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,1);
							SystemWaitFor(32);
								
							STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0);							
							wd=300;
							while ((wd>=0) && (!STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK)) )
								{		   
									SystemWaitFor(32);
									wd-=32;
								}
							if (wd>=0)
								{
									if(Result->Hierarchy==STTUNER_HIER_LOW_PRIO)
							     {
							        pr_temp=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LPCODE);
							     }
							     else
							     {
							        pr_temp=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_HPCODE);
							     }

									if( (pr_temp!=pr) || (mod!=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_CONST))	) change=1;
								}
						}   /*end if locka */
				} /* end if chipget.... */
							if ( (STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LOCK))&&(!change))
								{
										if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_GUARD) == 3)
											{
									/*			pParams->L1s2va3vp4 = 4; */
									
									/* 	it replaces the call to echo_proc  */ 
												
												passive_monitoring_361(DeviceMap,IOHandle,&(Result->Echo));
												active_monitoring_361(DeviceMap,IOHandle,&(Result->Echo));
												Echo_long_scan_361(DeviceMap,IOHandle,&(Result->Echo));
												
									/*   ********************************** */			
											
											
												




											}
								}
			if (change)
				{
					if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_CONST)==0) 
						{	
					 		;				
						}
					SystemWaitFor(500);  
					if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_CONST)==0) 
						{	
							SystemWaitFor(400); 			
						}
					
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,MODE,STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_MODE));	
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,GUARD,STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_GUARD));	
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,FORCE,1);	
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0);	
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,1);	
					STTUNER_IOREG_SetField(DeviceMap,IOHandle,OP2_VAL,0);	
					
					if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_CONST)==0) 
					{	
					 ;				
					}
				
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,0);
				STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,1);
				
					if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_CONST)==0) 
					{	
					 ;				
					}
							
				SystemWaitFor(400);
				}
			
			if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,LK) )
				{
				 if(Result->Hierarchy==STTUNER_HIER_LOW_PRIO)
					 {
					    Result->Lprate=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_LPCODE);
					 }
					 else
					 {
					    Result->Hprate=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_HPCODE);
					 }
				  
				mod=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_CONST);				
				  
				Result->Modulation=mod;
				
				}
			
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,FORCE,0);
			
			
			
	return;

}				















⌨️ 快捷键说明

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