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

📄 d0360minidrv.c

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

/*	standard ansi includes	*/
/*#include "math.h"*/

#include  <stdlib.h>
#include "chip.h"
#include "sti2c.h"

#include "360_map.h"
#include "360_init.h"
#include "360_echo.h"
#include "360_drv.h"
#include "stlite.h"                     /* Standard includes */ 
#include "stddefs.h"

/* STAPI */
#include "sttuner.h"
#include "sti2c.h"
#include "stcommon.h"
#include "sttbx.h"
#include "stevt.h"

/* local to sttuner */
#include "util.h"       /* generic utility functions for sttuner */ 
#include "dbtypes.h"    /* data types for databases */
#include "sysdbase.h"   /* functions to accesss system data */ 


#include "ioarch.h"     /* I/O for this driver */ 
#include "ioreg.h"      /* I/O for this driver */

#include "d0360.h"      /* top level header for this driver */
#include "tuntdrv.h"

#ifdef STTUNER_MINIDRIVER
#include "iodirect.h"
#endif


/* Current LLA revision	
static ST_Revision_t Revision360  = " STV0360-LLA_REL_2.14E(GUI) ";
*/
#define M6_F_GAIN_SRC_HI        0xE/*0x8*/
#define M6_F_GAIN_SRC_LO        0x10/*0x20*/ 
#define M6_F_TRL_NOMRATE0       0x0
#define M6_F_TRL_NOMRATE8_1     0x00/*0x01*/ 
#define M6_F_TRL_NOMRATE16_9    0x41

#define M7_F_GAIN_SRC_HI        0xA
#define M7_F_GAIN_SRC_LO        0xF0/*0x7B*/ 
#define M7_F_TRL_NOMRATE0       0x1/*0x0*/
#define M7_F_TRL_NOMRATE8_1     0xD5/*0xD7*/  
#define M7_F_TRL_NOMRATE16_9    0x4B/*0x4D*/ 

#define M8_F_GAIN_SRC_HI        0xC /*0xA*/
#define M8_F_GAIN_SRC_LO        0xE4 /*0xB4*/ /*27MHz*/ 
#define M8_F_TRL_NOMRATE0       0x1/*0x0*/
#define M8_F_TRL_NOMRATE8_1     0xAA/*0xAC*/ 
#define M8_F_TRL_NOMRATE16_9    0x56


#ifdef ST_OS21
#define UTIL_Delay(micro_sec) task_delay((signed  int)(((micro_sec) + 999) / 1000) * ST_GetClocksPerSecond() / 1000)
#define Delay(x) task_delay((signed  int)(ST_GetClocksPerSecond()*x));
#else
#define UTIL_Delay(micro_sec) task_delay((unsigned int)(((micro_sec) + 999) / 1000) * ST_GetClocksPerSecond() / 1000)
#define Delay(x) task_delay((unsigned int)(ST_GetClocksPerSecond()*x));
#endif 

#define SystemWaitFor(x) UTIL_Delay((x*1000))
TUNTDRV_InstanceData_t *TUNTDRV_GetInstFromHandle(TUNER_Handle_t Handle);



#define CPQ_LIMIT 23

extern 	unsigned int dbg_num_trial;  

#define RX123 0x22
#define FX_L  0x2
#define FX_S  0x4


#ifdef STTUNER_MINIDRIVER
	extern D0360_InstanceData_t *DEMODInstance;
	static FE_360_InternalParams_t *Params;
#endif

/*****************************************************
**FUNCTION	::	FE_360_PowOf2
**ACTION	::	Compute  2^n (where n is an integer) 
**PARAMS IN	::	number -> n
**PARAMS OUT::	NONE
**RETURN	::	2^n
*****************************************************/
int FE_360_PowOf2(int number)
{
	int i;
	int result=1;
	
	for(i=0;i<number;i++)
		result*=2;
		
	return result;
}


/*********************************************************
--FUNCTION	::	SpeedInit
--ACTION	::	calculate I2C speed (for SystemWait ...)
				
--PARAMS IN	::	Handle to the Chip
--PARAMS OUT::	NONE
--RETURN	::	#ms for an I2C reading access ..
--********************************************************/
int SpeedInit(void)
{									
unsigned int i,tempo;
#ifdef ST_OS21
osclock_t     time1,time2,time_diff;
#else
clock_t     time1,time2,time_diff;
#endif

time1 = time_now();
for (i=0;i<16;i++) ChipDemodGetField(PPM_CPC); time2 = time_now();
time_diff = time_minus(time2,time1);

tempo = (time_diff * 1000 ) / ST_GetClocksPerSecond() + 4; /* Duration in milliseconds, + 4 for rounded value */
tempo = tempo << 4;
return tempo;


}

/*********************************************************
--FUNCTION	::	CheckEPQ
--ACTION	::	calculate I2C speed (for SystemWait ...)
--PARAMS IN	::	Handle to the Chip
--PARAMS OUT::	NONE
--RETURN	::	
--********************************************************/
void CheckEPQ(FE_OFDMEchoParams_t *Echo)
{													



unsigned short int epq=0,mode,epq_limit,data;
unsigned short int epq_avg , i;
/****** Here according to FFT Mode and Modualtion different EPQ values has been set****/
mode=ChipDemodGetField(SYR_MODE);
data=ChipDemodGetField(TPS_CONST);
for(i=0;i<4;i++)
{
   epq+=Get_EPQ(0);
   if(mode == 0)
   {
      SystemWaitFor(25); /* wait for 25 msec for 2k mode to get the epq over a range of time so that the
                           average is better*/   
   }
   else
   {
      SystemWaitFor(100);/* wait for 100 msec for 8k mode to get the epq over a range of time so that the
                           average is better*/
   }
   
}
epq_avg=epq/4;

/*epq_limit=(6<<(2*mode));*/
if(mode==0)
{
switch(data)
{
	case 0 : /* QPSK */
      epq_limit=9;
      break;
   case 1 : /* 16 QAM */
      epq_limit=7;
      break;
   case 2 : /* 64 QAM */
      epq_limit=6;
      break;
   default :
      epq_limit=6;
      break;
}/* end of switch */
}
else
{
switch(data)
{
	case 0 : /* QPSK */
      epq_limit=35;
      break;
   case 1 : /* 16 QAM */
      epq_limit=28;
      break;
   case 2 : /* 64 QAM */
      epq_limit=24;
      break;
   default :
      epq_limit=24;
      break;
}/* end of switch */

}

if ( epq_avg > epq_limit )
{
Ack_long_scan();
}

return;


}


/*****************************************************
--FUNCTION	::	FE_360_TunerSet
--ACTION	::	Search for a valid transponder
--PARAMS IN	::	Handle	==>	Front End Handle
				pSearch ==> Search parameters
				pResult ==> Result of the search
--PARAMS OUT::	NONE
--RETURN	::	Error (if any)
--***************************************************/
FE_360_Error_t	FE_360_TunerSet(TUNER_Handle_t Handle, FE_360_InternalParams_t* pParams)

{

FE_360_Error_t error = FE_NO_ERROR;   
U32 Frequency;
int returned_freq;
#ifndef HOST_PC
TUNTDRV_InstanceData_t *Instance;
#endif

STTUNER_TunerType_t      Tuner;
/*U32 Freq; */

Frequency=pParams->Frequency; 
Tuner= pParams->Tuner;

#ifndef HOST_PC
Instance = TUNTDRV_GetInstFromHandle(Handle);  
Instance->ChannelBW=pParams->ChannelBW;
#endif
returned_freq=Frequency ;


/*else if (Tuner==STTUNER_TUNER_DTT7592)  	*/
	
		tuner_tuntdrv_Select(STTUNER_TUNER_DTT7592,0xC0);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency((int)Frequency,(U32*)&returned_freq);
		
/***********New tuner added ED5058**************/		

/* *Freq=returned_freq; */
(pParams->Frequency)=returned_freq;
return error; 
}


/*****************************************************
--FUNCTION	::	FE_360_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_360_SearchRun according
--				to last findings on SYR block
--***************************************************/
FE_360_SignalStatus_t FE_360_SearchRun(FE_360_InternalParams_t *pParams,STTUNER_tuner_instance_t *TunerInstance)
{


	int dbg_var;/* debug var */
	/*STCHIP_Handle_t hChip;*/
	FE_360_SignalStatus_t ret_flag;	
	short int wd,ii,tempo;
	unsigned short int ppm,try,u_var,mode,guard,seuil;
		

	try=0;
	dbg_var=0;
	do
	{
			ret_flag=LOCK_OK;     
	
			ChipDemodSetField(MODE,pParams->Mode);
			ChipDemodSetField(GUARD,pParams->Guard);		
			ChipDemodSetField( FORCE,pParams->Force);
	
			ChipDemodSetField(CORE_ACTIVE,0);
			SystemWaitFor(5);


			ChipDemodSetField(CORE_ACTIVE,1);
			u_var=ChipDemodGetField(AGC_LOCK);
			wd=70;
		
			while ((u_var==0) && (wd>0))
			{
				SystemWaitFor(10);	
				wd-=10;
				u_var=ChipDemodGetField(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=ChipDemodGetField(SYR_LOCK);
	
			while ( (!u_var) && (wd>0))
			{
				SystemWaitFor(5);
				wd-=5;
				u_var=ChipDemodGetField(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 =ChipDemodGetField(SYR_MODE) ;
			guard=ChipDemodGetField(SYR_GUARD);			
			tempo=15<<(2*mode);
			SystemWaitFor(tempo);
		
			
			ppm=0;
			tempo=1<<(2*mode);
			for (ii=0;ii<4;ii++) 
			{
				ppm+=ChipDemodGetField(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(((ret_flag == BAD_CPQ)||(ret_flag == NOSYMBOL)) && (pParams->TrlNormRateTunning == FALSE) 
	            && (ChipDemodGetField(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() ;
		  
		   if(ret_flag == LOCK_OK)
		   {
		    
		      pParams->TrlNormRateTunning =TRUE;
		   }
		   else
		   {
		      return ret_flag;   
		   }
		  
		   
		   
	        }
	        else
	        {
		   return ret_flag;
		}
				
	}
	               #ifdef STTUNER_DEBUG_LOCK_STAGES
		       STTBX_Print(("\n GOOD CPQ FOUND \n"));
		       #endif
	               u_var=ChipDemodGetField(TPS_LOCK);
			
			
			wd=65<<(2*mode); 
			tempo=4<<(2*mode);			
			while ((!u_var) && (wd>0))
			{
			SystemWaitFor(tempo);
			wd-= tempo;
			u_var=ChipDemodGetField(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=ChipDemodGetField(SYR_GUARD);
			if (guard== (unsigned short int )STTUNER_GUARD_1_4) CheckEPQ(&pParams->Echo);
			wd=36<<(2*mode);		

⌨️ 快捷键说明

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