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

📄 d0360_drv.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
			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;
				#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;
				#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);			
			tempo=15<<(2*mode);
			SystemWaitFor(tempo);
		
			
			ppm=0;
			tempo=1<<(2*mode);
			for (ii=0;ii<4;ii++) 
			{
				ppm+=STTUNER_IOREG_GetField(DeviceMap,IOHandle,PPM_CPC);
				SystemWaitFor(tempo);
			}
			
			if (ppm< (CPQ_LIMIT <<(2*mode + 2)) ) 
				{
				#ifdef STTUNER_DEBUG_LOCK_STAGES 
				STTBX_Print(("\n BAD CPQ \n"));
				#endif
				ret_flag=BAD_CPQ;
				
				}
			else
				{
				   try=try;
				}
			try++;
			
	} while ( (try<2) && (ret_flag!=LOCK_OK) );
	
	if ( ret_flag!=LOCK_OK) 
	{
		if (Inst->TRL_IOCTL_Set_Flag==FALSE)
		   {
		if(((ret_flag == BAD_CPQ)||(ret_flag == NOSYMBOL)) && (pParams->TrlNormRateTunning == FALSE) 
	            && (STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_MODE)==STTUNER_MODE_8K))
		{
		   /*SystemWaitFor(200);*/
		   
		   #ifdef STTUNER_DEBUG_LOCK_STAGES
		   STTBX_Print(("\n TRLNORMRATE ALGORITHM CALLED \n"));
		   #endif
		   ret_flag=FE_360_TRLNOMRATE_Tuning(DeviceMap,IOHandle) ;
		  
		   if(ret_flag == LOCK_OK)
		   {
		    
		      pParams->TrlNormRateTunning =TRUE;
		   }
		   else
		   {
		      return ret_flag;   
		   }
		  
		   
		   
	        }
	        else
	        {
		   return ret_flag;
		}
	}
	else	
	{
	   return ret_flag;
	}	
				
	}
	               #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 STTUNER_DEBUG_LOCK_STAGES
		           STTBX_Print(("\n TPS NOT FOUND \n"));
		           #endif
			   return NOTPS;
			}
		        #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(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 STTUNER_DEBUG_LOCK_STAGES
		           STTBX_Print(("\n NO PRF FOUND \n"));
		           #endif
			   return NOPRFOUND;
			}
			
			#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 STTUNER_DEBUG_LOCK_STAGES
		           STTBX_Print(("\n LK NOT LOCKED \n"));
		           #endif
			   return NOPRFOUND;
			}
			#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;  
       
    }
  }/** End of if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_HIERMODE)!=0)***/
  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;
	STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R_VSEARCH,v_search);
	
	/******************************************************************/		
	
	pParams->TrlNormRateTunning =TRUE;
	return	LOCK_OK;
}




/*****************************************************
--FUNCTION	::	FE_360_SearchTerm
--ACTION	::	
--PARAMS IN	::	
--PARAMS OUT::	NONE
--RETURN	::	NONE
--***************************************************/
FE_360_Error_t FE_360_SearchTerm(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_360_InternalParams_t *pParams,FE_360_SearchResult_t *pResult)
{
	FE_360_Error_t error = FE_NO_ERROR;
	U8 constell,counter;
	S8 step;
	
	S32 timing_offset;
	U32 trl_nomrate;
	int offset=0;
        int offsetvar=0;
        char signvalue=0;
	U8 tps_rcvd[3]={0},agc2_max[13]={0},trl_ctl[5]={0},trl_ctl1[2],syr_stat[1]={0},Rtrl_ctl;
	
	
	
	
	if(pParams != NULL)
	{
		
		
		if(pResult != NULL)
		{
			
		/*	if ((pParams->State==LOCK_OK)|| (pParams->State==NOPRFOUND)) */
		
			if ((pParams->State==LOCK_OK))    
		
			{
				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=(syr_stat[0]&0x04)>>2;
				
				(pParams->Results).Mode=pResult->Mode;
				pResult->Guard=syr_stat[0]&0x03;
				
				(pParams->Results).Guard=pResult->Guard;
				constell = tps_rcvd[0] & 0x03;
				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]&0x70)>>4;
				pResult->Hprate=tps_rcvd[1] & 0x07;
				(pParams->Results).Hprate=pResult->Hprate;
				pResult->Lprate=(tps_rcvd[1] &0x70)>>4;
				(pParams->Results).Lprate=pResult->Lprate;
				constell = STTUNER_IOREG_GetField(DeviceMap,IOHandle,PR);
				if (constell==5)	constell = 4;
				pResult->pr = (FE_360_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);
                        offset=STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,R_CRL_FREQ3);
		                    



                        offset <<=16;
                        offsetvar=STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,R_CRL_FREQ2);
                         
            /*task_delay(time_ticks_per_sec());*/



                        offsetvar <<=8;
                        offset = offset | offsetvar;
                        offsetvar=0;
                        offsetvar=STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,R_CRL_FREQ1);
                        



                        offset =offset | offsetvar ;
                        if(signvalue==1)
                        {
                           offset |=0xff000000;/*** Here sign extension made for the negative number**/
                        }
                        offset =offset /16384;/***offset calculation done according to data sheet of STV0360***/
                        if(pResult->Mode==0)
                        {
                           /*******it is 2k mode***************/
                           offset=((offset*4464)/1000);/*** 1 FFT BIN=4.464khz***/
                        }
                        else
                        {
                            /*******it is 8k mode***************/
                             

                            offset=((offset*11)/10);/*** 1 FFT BIN=1.1khz***/
                        }
                         /****This block of code ensures the frequency to be corrected only when***
                         *** the offset is in range between 140khz to 180khz both positive and negative***
                         ****direction . This takes care of 166khz offset which sometimes needed******
                         ****to get far away from some interfering analog carrier in some European countries.*****/
                        
                       /* if(((offset>=140) && (offset<=180)) ||((offset<=-140) && (offset>=-180)))
                        {
                            pParams->Frequency-=offset;
                                     
                         }*/
                         /*** Here +/-166 khz offset taken into consideration and the excess
                              offset lying between +/- 140 to 180 khz will be returned to 
                              user for fine tunning ****/
                         
                         if((offset>=140) && (offset<=180))
                         {
                         	 if(pResult->Sense==0)
                         	 {
                         	    pParams->Frequency +=166;
                         	 }
                         	 else
                         	 {
                               pParams->Frequency -=166;
                            }   
                         }
                         else if((offset<=-140) && (offset>=-180))
                         {
                         	 if(pResult->Sense==0)
                         	 {
                         	    pParams->Frequency -=166;
                         	 }
                         	 else
                         	 {
                               pParams->Frequency +=166;
                            }
                         }
                         /***pResult data structure retains the recent data after tuner locks***/
                         pResult->Frequency=pParams->Frequency;
                     /************************************************************************/   
			pResult->Echo_pos=STTUNER_IOREG_GetField(DeviceMap,IOHandle,LONG_ECHO);
			
			if(pParams->TrlNormRateFineTunning == FALSE) 
			{
			   /* fine tuning of timing offset if required */
			   STTUNER_IOREG_GetContigousRegisters(DeviceMap,IOHandle,R_TRL_CTL,5,trl_ctl);
			   
			   timing_offset=trl_ctl[3] + 256*trl_ctl[4];
			   
			   if (timing_offset>=32768) timing_offset-=65536;
		           /*	timing_offset=(timing_offset+10)/20; */ /* rounding */
		        
			   trl_nomrate=  (512*trl_ctl[2]+trl_ctl[1]*2 + ((trl_ctl[0]&0x80)>>7));
	
			   timing_offset=((signed)(1000000/trl_nomrate)*timing_offset)/2048;
			   if (timing_offset<=0) 
				{
				timing_offset=(timing_offset-11)/22;
				step=-1;
				}
			   else
				{
				timing_offset=(timing_offset+11)/22;
				step=1;
				}
			for (counter=0;counter<abs(timing_offset);counter++)
				{
					trl_nomrate+=step;
					
					
					Rtrl_ctl=STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,R_TRL_CTL);
					trl_ctl1[0]=((trl_nomrate%2)<<7) | (Rtrl_ctl&0X7F) ;
					trl_ctl1[1]=trl_nomrate/2;
					STTUNER_IOREG_SetContigousRegisters(DeviceMap,IOHandle,R_TRL_CTL,trl_ctl1,2);
					SystemWaitFor(1);
				}
			
			pParams->TrlNormRateFineTunning =TRUE;
		      
		      if(pParams->ChannelBWStatus == STTUNER_CHAN_BW_6M)
		      { 
		         pParams->Channel_6M_Trl_Done = TRUE; 

⌨️ 快捷键说明

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