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

📄 d0360_drv.c

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

/*	standard ansi includes	*/
/*#include "math.h"*/
#ifdef ST_OSLINUX
  #include "stos.h"
#else
/* Standard includes */
   #include "stlite.h"
 /* STAPI */
   #include "sttbx.h"
 /*C libs */
   #include <stdlib.h> /* for abs() */
#endif

#include "ioreg.h"


#include "360_map.h"

#include "360_echo.h"
#include "360_drv.h"
#include "stddefs.h"

/* STAPI */
#include "sttuner.h"
#include "sti2c.h"
#include "stcommon.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"

/* 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/*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;  
#ifdef ST_OSLINUX

   typedef struct div_s
   {
	   int quot;
	   int rem;
   }div_t;

   div_t div(int divisor, int divider)
   {
	   div_t ldiv;
	   ldiv.quot = divisor/divider;
	   ldiv.rem  = divisor%divider;
	   return ldiv;
   }
#endif


/***********************************************************
**FUNCTION	::	Drv0360_GetLLARevision
**ACTION	::	Returns the 360 LLA driver revision
**RETURN	::	Revision360
***********************************************************/
ST_Revision_t Drv0360_GetLLARevision(void)
{
	return (Revision360);
}



/*****************************************************
**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(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{									
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++) STTUNER_IOREG_GetField(DeviceMap,IOHandle,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(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,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=STTUNER_IOREG_GetField(DeviceMap,IOHandle,SYR_MODE);
data=STTUNER_IOREG_GetField(DeviceMap,IOHandle,TPS_CONST);
for(i=0;i<4;i++)
{
   epq+=Get_EPQ(DeviceMap,IOHandle,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(DeviceMap,IOHandle);
}

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 ;

if 		(Tuner==STTUNER_TUNER_TDLB7)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_TDLB7,0xC0);
			if ((Frequency<470000) || (Frequency>862000)) error = FE_BAD_PARAMETER;
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}
else if (Tuner==STTUNER_TUNER_DTT7572)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_DTT7572,0xC0);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else
			{
				 tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
			}
		}
else if (Tuner==STTUNER_TUNER_EAL2780)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_EAL2780,0xC0);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}

else if (Tuner==STTUNER_TUNER_DTT7578 )  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_DTT7578,0xC0);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}
else if (Tuner==STTUNER_TUNER_DTT7592)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_DTT7592,0xC0);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}
else if (Tuner==STTUNER_TUNER_ENG47402G1)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_ENG47402G1,0xC0);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}
else if (Tuner==STTUNER_TUNER_TDA6650)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_TDA6650,0xC2);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}
else if (Tuner==STTUNER_TUNER_TDM1316)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_TDM1316,0xC2);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}
else if (Tuner==STTUNER_TUNER_TDEB2)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_TDEB2,0xC2);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}
else if (Tuner==STTUNER_TUNER_TDED4)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_TDED4,0xC2);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}

/***********New tuner added ED5058**************/		
else if (Tuner==STTUNER_TUNER_ED5058)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_ED5058,0xC2);
			if ((Frequency<430000) || (Frequency>858000)) /* PARAMETRES A REGLER*/
			{
			error = FE_BAD_PARAMETER;   
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}
/************New tuner MIVAR*****************/
else if (Tuner==STTUNER_TUNER_MIVAR)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_MIVAR,0xC2);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}
/************New tuner DTT7102*****************/
else if (Tuner==STTUNER_TUNER_DTT7102)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_DTT7102,0xC2);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}
/************New tuner TECC2849PG*****************/
else if (Tuner==STTUNER_TUNER_TECC2849PG)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_TECC2849PG,0xC2);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}
		
/************New tuner TDCC2345*****************/
else if (Tuner==STTUNER_TUNER_TDCC2345)  	
		{
		tuner_tuntdrv_Select(Handle,STTUNER_TUNER_TDCC2345,0xC2);
			if ((Frequency<51000) || (Frequency>896000)) 
			{
			error = FE_BAD_PARAMETER;
			}
			else tuner_tuntdrv_SetFrequency(Handle,(int)Frequency,(U32*)&returned_freq);
		}
		

/* *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(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_360_InternalParams_t *pParams,STTUNER_tuner_instance_t *TunerInstance)
{

STTUNER_InstanceDbase_t     *Inst;
	int dbg_var;/* debug var */
	
	FE_360_SignalStatus_t ret_flag;	
	short int wd,ii,tempo;
	unsigned short int ppm,try,u_var,mode,guard,seuil;
		
	U8 v_search,Rvsearch;
	try=0;
	dbg_var=0;
	Inst = STTUNER_GetDrvInst();
	
	do
	{
			ret_flag=LOCK_OK;     
	
			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);
			SystemWaitFor(5);


⌨️ 快捷键说明

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