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

📄 d0360minidrv.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
			u_var=ChipDemodGetField(PRF);
			tempo=4<<(2*mode);
			while ( (!u_var) && (wd>=0.0))
			{
			
			SystemWaitFor(tempo);
			wd-=(tempo);
			u_var=ChipDemodGetField(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=ChipDemodGetField(LK);
			
			wd=75<<(2*mode);/* a revoir */   
			tempo=4<<(2*mode) ;
			while ((!u_var) && (wd>=0))
			{
			SystemWaitFor( tempo);
			wd-=tempo;
			u_var=ChipDemodGetField(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
			
	/* lock/secure the FEC for HP*/
	u_var=ChipDemodGetField(TPS_HPCODE);
	if (u_var==4 ) u_var=5;
	switch(u_var)
	{
	case 0:
	seuil=ChipDemodGetField(VTH0);
	
	if (seuil <60) ChipDemodSetField(VTH0,45);
	break;
	case 1:
	seuil=ChipDemodGetField(VTH1);
	if (seuil < 40) ChipDemodSetField(VTH1,30);
	break;
	case 2:
	seuil=ChipDemodGetField(VTH2);
	if (seuil < 30) ChipDemodSetField(VTH2,23);
	break;
	case 3:
	seuil=ChipDemodGetField(VTH3);
	if (seuil < 18) ChipDemodSetField(VTH3,14);
	break;
	case 5:
	seuil=ChipDemodGetField(VTH5);
	if (seuil < 10) ChipDemodSetField(VTH5,8);
	break;
	default:
	break;
	
						   
	}
	
	/* lock/secure the FEC for LP (if needed)*/
	if (ChipDemodGetField(TPS_HIERMODE)!=0)
	{
		u_var=ChipDemodGetField(TPS_LPCODE);
		if (u_var==4 ) u_var=5;
		switch(u_var)
		{
		case 0:
		seuil=ChipDemodGetField(VTH0);
	
		if (seuil <60) ChipDemodSetField(VTH0,45);
		break;
		case 1:
		seuil=ChipDemodGetField(VTH1);
		if (seuil < 40) ChipDemodSetField(VTH1,30);
		break;
		case 2:
		seuil=ChipDemodGetField(VTH2);
		if (seuil < 30) ChipDemodSetField(VTH2,23);
		break;
		case 3:
		seuil=ChipDemodGetField(VTH3);
		if (seuil < 18) ChipDemodSetField(VTH3,14);
		break;
		case 5:
		seuil=ChipDemodGetField(VTH5);
		if (seuil < 10) ChipDemodSetField(VTH5,8);
		break;
		default:
		break;
	
		}
	}	
	
	
	if (ChipDemodGetField(TPS_HIERMODE)==0)	
		{
		u_var=ChipDemodGetField(TPS_HPCODE);
		if (u_var==4 ) u_var=5;    
		u_var= (1<<u_var);
		ChipDemodSetField(R_PR,u_var);  
		/*ChipSetFieldImage(PR_AUTO,1);
		ChipSetFieldImage(PR_FREEZE,0);
		ChipSetRegisters(hChip,R_VSEARCH,1);*/ 
	    ChipDemodSetField (PR_AUTO_N_PR_FREEZE, 0x10);
	}
	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(FE_360_InternalParams_t *pParams,FE_360_SearchResult_t *pResult)
{
	FE_360_Error_t error = FE_NO_ERROR;
	U8 constell,counter;
	S8 step;
	U8 nsbuffer[6],bfr;
	S32 timing_offset;
	U32 trl_nomrate, Error;
	int offset=0;
        int offsetvar=0;
        char signvalue=0;
	
		
	
	if(pParams != NULL)
	{
		
		
		if(pResult != NULL)
		{
			
		/*	if ((pParams->State==LOCK_OK)|| (pParams->State==NOPRFOUND)) */
		
			if ((pParams->State==LOCK_OK))    
		
			{
				/*ChipGetRegisters(hChip,R_TPS_RCVD2,3);
				ChipGetRegisters(hChip,R_SYR_STAT,1);				
				pResult->Mode=ChipGetFieldImage(hChip,SYR_MODE);
				pResult->Guard=ChipGetFieldImage(hChip,SYR_GUARD);
				constell = ChipGetFieldImage(hChip,TPS_CONST);*/

                Error=STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R_TPS_RCVD2, 0,0, nsbuffer, 3, FALSE);
                bfr= ChipDemodGetField(R_SYR_STAT) ;
                pResult->Mode=bfr & 0x04;	/*SYR_MODE)*/
				pResult->Guard=bfr & 0x03;	/*SYR_GUARD*/
				constell = nsbuffer[0]&0x03 ; /*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;
				
				pResult->hier  = nsbuffer[0]&0x70;   /*HIERMODE*/
				pResult->Hprate= nsbuffer[1]&0x07 ;  /*TPS_HPCODE*/
				pResult->Lprate= nsbuffer[1]&0x70;  /*TPS_LPCODE*/ 
				constell = ChipDemodGetField(PR);
				if (constell==5)	constell = 4;
				pResult->pr = (FE_360_Rate_t) constell;

				pResult->Sense=ChipDemodGetField(INV_SPECTR);
				
				/* dcdc modifs per Gilles*/
				pResult->Tuner=pParams->Tuner;
				pParams->first_lock=1;
				/* modifs Tuner */
				
				/* ChipGetRegisters(hChip,R_AGC2MAX,6);*/
				 Error=STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R_AGC2MAX, 0,0, nsbuffer, 6, FALSE);/* checknab*/
				 /*pResult->Agc_val=	(ChipGetFieldImage(hChip,AGC1_VAL_LO)<<16) 	+  
									(ChipGetFieldImage(hChip,AGC1_VAL_HI)<<24) +
									ChipGetFieldImage(hChip,AGC2_VAL_LO) +  
									(ChipGetFieldImage(hChip,AGC2_VAL_HI)<<8);*/

				pResult->Agc_val=	(ChipDemodGetField(AGC1_VAL_LO)<<16) 	+  
									(ChipDemodGetField(AGC1_VAL_HI)<<24) +
									ChipDemodGetField(AGC2_VAL_LO) +  
									(ChipDemodGetField(AGC2_VAL_HI)<<8);
				
		      /************To get exact frequency offset******************/
		        signvalue=ChipDemodGetField(SEXT);
                        offset=ChipDemodGetField(R_CRL_FREQ3);
                        offset <<=16;
                        offsetvar=ChipDemodGetField(R_CRL_FREQ2);
                        offsetvar <<=8;
                        offset = offset | offsetvar;
                        offsetvar=0;
                        offsetvar=ChipDemodGetField(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=ChipDemodGetField(LONG_ECHO);
			
			if(pParams->TrlNormRateFineTunning == FALSE) 
			{
			   /* fine tuning of timing offset if required 
			   ChipGetRegisters(hChip,R_TRL_CTL,5);*/

			   Error=STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R_TRL_CTL, 0,0, nsbuffer, 5, FALSE);
			   timing_offset=nsbuffer[3] /*TRL_TOFFSET_LO*/ + 256*nsbuffer[4];/*TRL_TOFFSET_HI*/
			   if (timing_offset>=32768) timing_offset-=65536;
		           /*	timing_offset=(timing_offset+10)/20; */ /* rounding */
		        
			   /*trl_nomrate=  (512*ChipGetFieldImage(hChip,TRL_NOMRATE_HI)+ChipGetFieldImage(hChip,TRL_NOMRATE_LO)*2 + ChipGetFieldImage(hChip,TRL_NOMRATE_LSB));*/
			   trl_nomrate=  (512*nsbuffer[2]/*TRL_NOMRATE_HI*/+nsbuffer[1]*2/*TRL_NOMRATE_LO*/ + (nsbuffer[0] &0x80)/*TRL_NOMRATE_LSB*/);
			   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;
				/*	ChipSetFieldImage(hChip,TRL_NOMRATE_LSB,trl_nomrate%2);
					ChipSetFieldImage(hChip,TRL_NOMRATE_LO,trl_nomrate/2);
					ChipSetRegisters(hChip,R_TRL_CTL,2);*/

					ChipDemodSetField(TRL_NOMRATE_LSB,trl_nomrate%2);
					ChipDemodSetField(TRL_NOMRATE_LO,trl_nomrate/2);
					SystemWaitFor(1);
				}
			
			pParams->TrlNormRateFineTunning =TRUE;
		      
		      if(pParams->ChannelBWStatus == STTUNER_CHAN_BW_6M)
		      { 
		         pParams->Channel_6M_Trl_Done = TRUE; 
		         pParams->Channel_6M_Trl[0] = ChipDemodGetField(TRL_NOMRATE_LSB);
		         pParams->Channel_6M_Trl[1] = ChipDemodGetField(TRL_NOMRATE_LO);
		         pParams->Channel_6M_Trl[2] = ChipDemodGetField(TRL_NOMRATE_HI);
		        
		      }
		      
		      if(pParams->ChannelBWStatus == STTUNER_CHAN_BW_7M)
		      { 
		         pParams->Channel_7M_Trl_Done = TRUE;  
		         pParams->Channel_7M_Trl[0] = ChipDemodGetField(TRL_NOMRATE_LSB);
		         pParams->Channel_7M_Trl[1] = ChipDemodGetField(TRL_NOMRATE_LO);
		         pParams->Channel_7M_Trl[2] = ChipDemodGetField(TRL_NOMRATE_HI);
		         		        
		      }
		      
		      if(pParams->ChannelBWStatus == STTUNER_CHAN_BW_8M)
		      { 
		         pParams->Channel_8M_Trl_Done = TRUE;  
		         pParams->Channel_8M_Trl[0] = ChipDemodGetField(TRL_NOMRATE_LSB);
		         pParams->Channel_8M_Trl[1] = ChipDemodGetField(TRL_NOMRATE_LO);
		         pParams->Channel_8M_Trl[2] = ChipDemodGetField(TRL_NOMRATE_HI);
		         		        
		      }
			}/*** End of if(pParams->TrlNormRateTunning == FALSE) ***/
			
			
			/* 			end of fine tuning				*/
			}
		
				
			else
				error = FE_SEARCH_FAILED;
		}
		else
			error = FE_BAD_PARAMETER;
	}
	else
		error = FE_INVALID_HANDLE;
	
	pResult->SignalStatus = pParams->State;
	pResult->State  = ChipDemodGetField(CORE_STATE_STAT);
	ChipDemodSetField(FORCE, (pParams->Force & 2)>>1);
	return error;
}


/*****************************************************
--FUNCTION	::	FE_360_Init
--ACTION	::	Initialisation of the STV0360 chip
--PARAMS IN	::	pInit	==>	pointer to FE_360_InitParams_t structure
--PARAMS OUT::	NONE
--RETURN	::	Handle to STV0360
--***************************************************/


 FE_360_Handle_t	FE_360_Init(void)

{
	Params = memory_allocate_clear(DEMODInstance->MemoryPartition, 1, sizeof( FE_360_InternalParams_t ));	
	
 	
/*	pParams->Echo = EchoParams;*/			 /* POUR STAPI passer un multiinstance */
	if(Params != NULL)
	{
		/* Chip initialisation */
 /* in internal struct chip is stored */
		
		
/*		pParams->hChip = STV0360_Init(pInit->hDemod);*/
		
		/*if(pParams->hChip != NULL)
		{*/
			/*pParams->Tuner = (STTUNER_TunerType_t)pInit->Tuner;*/
			Params->I2Cspeed = SpeedInit();  
			Params->prev_lock_status = NO_LOCK;
			Params->first_lock=0;
			/****Initialize TRLNORMRATE TUNNING FLAG*****/
			Params->TrlNormRateTunning = FALSE ;
			Params->TrlNormRateFineTunning = FALSE ;
			/***Initialize channel bandwidth value with a common value as the particular channel
			    bandwidth still not known*****/
			Params->ChannelBWStatus = STTUNER_CHAN_BW_NONE ;
			/****Initialize the trl done parameter with false *****/
			Params->Channel_6M_Trl_Done = FALSE;
			Params->Channel_7M_Trl_Done = FALSE;
			Params->Channel_8M_Trl_Done = FALSE;
			/****Initial normrate setting for 6 Mhz bandwidth***/
			Params->Channel_6M_Trl[0]=M6_F_TRL_NOMRATE0;
			Params->Channel_6M_Trl[1]=M6_F_TRL_NOMRATE8_1;
			Params->Channel_6M_Trl[2]=M6_F_TRL_NOMRATE16_9;
			
			/****Initial normrate setting for 7 Mhz bandwidth***/
			Params->Channel_7M_Trl[0]=M7_F_TRL_NOMRATE0;
			Params->Channel_7M_Trl[1]=M7_F_TRL_NOMRATE8_1;
			Params->Channel_7M_Trl[2]=M7_F_TRL_NOMRATE16_9;
			
			/****Initial normrate setting for 8 Mhz bandwidth***/
			Params->Channel_8M_Trl[0]=M8_F_TRL_NOMRATE0;
			Params->Channel_8M_Trl[1]=M8_F_TRL_NOMRATE8_1;
			Params->Channel_8M_Trl[2]=M8_F_TRL_NOMRATE16_9;

		/*}
		else
		{
		
			#ifdef CHIP_STAPI
			memory_deallocate(pInit->hDemod->Chip->MemoryPartition, pParams);
			#endif

			pParams = NULL;
		}*/
	}
	
	return (FE_360_Handle_t) Params;
}

/*****************************************************
--FUNCTION	::	FE_360_SearchInit
--ACTION	::	Set Params fields that are used by the search algorithm   
--PARAMS IN	::	Frequency	=>	Frequency used to start search 
--PARAMS OUT::	NONE
--RETURN	::	NONE
--***************************************************/
FE_360_Error_t FE_360_SearchInit(FE_360_InternalParams_t  *pParams,FE_360_SearchParams_t	*pSearch,STTUNER_tuner_instance_t *TunerInstance )
{

FE_360_Error_t error = FE_NO_ERROR;	
U8 temp_image[3];
/*
do initialization of the chip, for  instance put core in std_by and so on ...
*/

if (pParams==NULL)

⌨️ 快捷键说明

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