📄 d0360_drv.c
字号:
/* 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 + -