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

📄 d0361_drv.c

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























































































































































































/*****************************************************
--FUNCTION	::	FE_361_SearchRun
--ACTION	::	Search for Signal, Timing, Carrier and then data at a given Frequency, 
--				in a given range:

--PARAMS IN	::	NONE
--PARAMS OUT::	NONE
--RETURN	::	Type of the founded signal (if any)

--REMARKS   ::  This function is supposed to replace FE_361_SearchRun according
--				to last findings on SYR block
--***************************************************/
FE_361_SignalStatus_t FE_361_SearchRun(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_361_InternalParams_t *pParams,STTUNER_tuner_instance_t *TunerInstance)
{

	U8 v_search,Rvsearch;
	int dbg_var;/* debug var */
	
	FE_361_SignalStatus_t ret_flag;	
	short int wd,ii,tempo;
	unsigned short int ppm,try,u_var,mode,guard,seuil;
	#ifdef HOST_PC
	FILE *fp,*fn;
	/* debug variables */
	static unsigned short int dbg_failure=0;
	#endif
	
	#ifdef LOG
	#ifdef HOST_PC
	fp=fopen("debug_driv.txt","a");
	#endif
	#endif
	try=0;
	if (abs(pParams->Frequency-858000)<=2000)
		{
		dbg_var=0;

		}	
	else
		dbg_var=0;
	do
	{
			ret_flag=LOCK_OK_361;     
	               	STTUNER_IOREG_SetField(DeviceMap,IOHandle,MODE,pParams->Mode);
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,GUARD,pParams->Guard);		
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,FORCE,pParams->Force);
	
			STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,0);
			if (dbg_var) STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,0);
			if (dbg_var) STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,0);
			SystemWaitFor(5);


			STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,1);
			if (dbg_var) STTUNER_IOREG_SetField(DeviceMap,IOHandle,CORE_ACTIVE,1);
			if (dbg_var) 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_361;
				#ifdef HOST_PC
				if(dbg_var) printf("no AGC! \n");
				#endif
				#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_361;
				#ifdef HOST_PC
				if(dbg_var) printf("no SYR! \n");
				#endif
				#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);
			if(mode == STTUNER_MODE_2K)
			{
			    /***For 2k mode the chp_taps reg. must
			                                             ***always set to 0x01***/
			    STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_CHP_TAPS,0x01);                                           
			}
			else
			{
			
			   STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_CHP_TAPS,0x03);/***For 8k mode the chp_taps reg. must
			                                               ***always set to 0x03***/
			   		  
			}			
			tempo=15<<(2*mode);
			SystemWaitFor(tempo);
		
			
			ppm=0;
			tempo=1<<(2*mode);
			if(mode == STTUNER_MODE_8K)
			{
			   tempo+=30;
			}
			
			for (ii=0;ii<4;ii++) 
			{
				ppm+=STTUNER_IOREG_GetField(DeviceMap,IOHandle,PPM_CPC);
				SystemWaitFor(tempo);
			}
			
			if (ppm< (CPQ_LIMIT <<(2*mode + 2)) ) 
				{				
				ret_flag=BAD_CPQ_361;
				#ifdef HOST_PC
				if(dbg_var) printf("BAD CPQ! \n");
				#endif
				#ifdef STTUNER_DEBUG_LOCK_STAGES 
				STTBX_Print(("\n BAD CPQ \n"));
				#endif
				}
			else
				{
				try=try;
			}
			
			try++;
			
	} while ( (try<2) && (ret_flag!=LOCK_OK_361) );
	if ( ret_flag!=LOCK_OK_361) 
	{
		#ifdef LOG
		#ifdef HOST_PC
		fprintf(fp,"no lock status %d mode %d guard %d ppm %d   num_trial %d\n",ret_flag, STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_MODE),STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_GUARD),ppm,dbg_num_trial);
		fclose(fp);
		#endif
		#endif
		#ifdef HOST_PC
		if(dbg_var) printf("no something! \n");
		#endif
		return ret_flag;
	}
	
	/* dcdc debug */
	if ((try==2) && (ret_flag==LOCK_OK_361)) 
	{
	#ifdef LOG
	#ifdef HOST_PC
	fprintf(fp,"failure %d trial %d\n",dbg_failure++,dbg_num_trial);
	#endif
	#endif
	}
	
	/*dcdc */
	/*
	#ifdef LOG
	fclose(fp);
	return ret_flag;
	
	#endif
	*/
	
	/* end of dcdc debug */
	
	               #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 LOG
			#ifdef HOST_PC
			fprintf(fp,"trial %d notps mode %d guard %d ppm %d\n",dbg_num_trial,mode,guard,ppm);
			fclose(fp);
			#endif
			#endif
			#ifdef HOST_PC
			if(dbg_var) printf("no TPS! \n");
			#endif
			#ifdef STTUNER_DEBUG_LOCK_STAGES
		        STTBX_Print(("\n TPS NOT FOUND \n"));
		        #endif
			return NOTPS_361;
			}
			#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_361(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 LOG
			#ifdef HOST_PC
			fprintf(fp,"trial %d noprf1 \n",dbg_num_trial);
			fclose(fp);
			#endif
			#endif
			#ifdef STTUNER_DEBUG_LOCK_STAGES
		        STTBX_Print(("\n NO PRF FOUND \n"));
		        #endif
			return NOPRFOUND_361;
			}
			#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 LOG
			#ifdef HOST_PC
			fprintf(fp,"trial %d no lk \n",dbg_num_trial);
			fclose(fp);
			#endif
			#endif
			#ifdef STTUNER_DEBUG_LOCK_STAGES
		        STTBX_Print(("\n LK NOT LOCKED \n"));
		        #endif
			return NOPRFOUND_361;
		}
		#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;  
       
    }
  }/***/
  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; /*use generic function/will be good for readability*/
	STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_VSEARCH,v_search);

	return	LOCK_OK_361;
}




/*****************************************************
--FUNCTION	::	FE_361_SearchTerm
--ACTION	::	
--PARAMS IN	::	
--PARAMS OUT::	NONE
--RETURN	::	NONE
--***************************************************/
FE_361_Error_t FE_361_SearchTerm(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_361_InternalParams_t *pParams,FE_361_SearchResult_t *pResult)
{
	FE_361_Error_t error = FE_361_NO_ERROR;
	U8 constell,counter;
	S8 step;
	
	S32 timing_offset;
	U32 trl_nomrate;
	int offset=0;
        int offsetvar=0;
        char signvalue=0;
	
	U8 trl_ctl1[2],tps_rcvd[3],trl_ctl[5]={0},syr_stat[1],agc2_max[13]={0},Rtrl_ctl;

	
	
	if(pParams != NULL)
	{
		
		
		if(pResult != NULL)
		{
			
		/*	if ((pParams->State==LOCK_OK)|| (pParams->State==NOPRFOUND)) */
		
			if ((pParams->State==LOCK_OK_361))    
		
			{
				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=STTUNER_IOREG_FieldGetVal(DeviceMap,SYR_MODE);*/
				pResult->Mode=(syr_stat[0]&0x04)>>2;
				(pParams->Results).Mode=pResult->Mode;
				/*pResult->Guard=STTUNER_IOREG_FieldGetVal(DeviceMap,SYR_GUARD);*/
				pResult->Guard=syr_stat[0]&0x03;
				(pParams->Results).Guard=pResult->Guard;
				constell = tps_rcvd[0] & 0x03;/*STTUNER_IOREG_FieldGetVal(DeviceMap,TPS_CONST);*/
				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];/*STTUNER_IOREG_FieldGetVal(DeviceMap,TPS_HIERMODE);*/

   			
   			
				pResult->Hprate= tps_rcvd[1] & 0x07;/*STTUNER_IOREG_FieldGetVal(DeviceMap,TPS_HPCODE);*/
				
				(pParams->Results).Hprate=pResult->Hprate;
				pResult->Lprate=(tps_rcvd[1] &0x70)>>4;/*STTUNER_IOREG_FieldGetVal(DeviceMap,TPS_LPCODE);*/
				(pParams->Results).Lprate=pResult->Lprate;
				constell = STTUNER_IOREG_GetField(DeviceMap,IOHandle,PR);;
				if (constell==5)	constell = 4;
				pResult->pr = (FE_361_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);

⌨️ 快捷键说明

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