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