📄 d0362_drv.c
字号:
/* includes ---------------------------------------------------------------- */
/* C libs */
#ifdef ST_OSLINUX
#include "stos.h"
#else
#include <stdlib.h>
#include "sttbx.h"
#endif
/* 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 "tuntdrv.h"
/* common includes */
#include "d0362_echo.h"
#include "d0362.h"
#include "d0362_drv.h"
#include "d0362_map.h"
/* common includes */
/* Current LLA revision */
static ST_Revision_t Revision362 = " STV0362-LLA_REL_3.0(GUI) ";
#define M6_F_GAIN_SRC_HI 0x0A
#define M6_F_GAIN_SRC_LO 0x28
#define M6_F_TRL_NOMRATE0 0x00
#define M6_F_TRL_NOMRATE8_1 0x01
#define M6_F_TRL_NOMRATE16_9 0x41
#define M7_GAIN_SRC_HI 0x0C
#define M7_GAIN_SRC_LO 0xE4 /*For normal IF Mode*/
#define M7_E_GAIN_SRC_HI 0x07
#define M7_E_GAIN_SRC_LO 0x6C /* For long path IF / IQ modes */
#define M7_F_TRL_NOMRATE0 0x00 /* ok */
#define M7_F_TRL_NOMRATE8_1 0xD6 /* ok */
#define M7_F_TRL_NOMRATE16_9 0x4B /* ok */
#define M8_GAIN_SRC_HI 0x0B
#define M8_GAIN_SRC_LO 0xB8 /*For normal IF Mode*/
#define M8_E_GAIN_SRC_HI 0x08
#define M8_E_GAIN_SRC_LO 0x86 /* For long path IF / IQ modes */
#define M8_F_TRL_NOMRATE0 0x01 /* ok */
#define M8_F_TRL_NOMRATE8_1 0xAB /* ok */
#define M8_F_TRL_NOMRATE16_9 0x56 /* ok */
#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))
#if defined (ST_OS21) || defined(ST_OSLINUX)
#define WAIT_N_MS_362(X) task_delay( (signed int)(X * (ST_GetClocksPerSecond() / 1000)) ) /*task_delay(X)*/
#else
#define WAIT_N_MS_362(X) task_delay( (unsigned int)(X * (ST_GetClocksPerSecond() / 1000)) ) /*task_delay(X)*/
#endif
TUNTDRV_InstanceData_t *TUNTDRV_GetInstFromHandle(TUNER_Handle_t Handle);
#define DELTA 666
#define DELTA_T 10
/* dcdc #define CPQ_LIMIT 23*/
#define CPQ_LIMIT 23
U16 CellsCoeffs_8MHz[6][5]={
{0x10EF,0xE205,0x10EF,0xCE49,0x6DA7}, /* CELL 1 COEFFS */
{0x2151,0xc557,0x2151,0xc705,0x6f93}, /* CELL 2 COEFFS */
{0x2503,0xc000,0x2503,0xc375,0x7194}, /* CELL 3 COEFFS */
{0x20E9,0xca94,0x20e9,0xc153,0x7194}, /* CELL 4 COEFFS */
{0x06EF,0xF852,0x06EF,0xC057,0x7207}, /* CELL 5 COEFFS */
{0x0000,0x0ECC,0x0ECC,0x0000,0x3647} /* CELL 6 COEFFS */
} ;
U16 CellsCoeffs_7MHz[6][5]={
{0x12CA,0xDDAF,0x12CA,0xCCEB,0x6FB1}, /* CELL 1 COEFFS */
{0x2329,0xC000,0x2329,0xC6B0,0x725F}, /* CELL 2 COEFFS */
{0x2394,0xC000,0x2394,0xC2C7,0x7410}, /* CELL 3 COEFFS */
{0x251C,0xC000,0x251C,0xC103,0x74D9}, /* CELL 4 COEFFS */
{0x0804,0xF546,0x0804,0xC040,0x7544}, /* CELL 5 COEFFS */
{0x0000,0x0CD9,0x0CD9,0x0000,0x370A} /* CELL 6 COEFFS */
} ;
U16 CellsCoeffs_6MHz[6][5]={
{0x12CA,0xDDAF,0x12CA,0xCCEB,0x6FB1}, /* CELL 1 COEFFS */
{0x2329,0xC000,0x2329,0xC6B0,0x725F}, /* CELL 2 COEFFS */
{0x2394,0xC000,0x2394,0xC2C7,0x7410}, /* CELL 3 COEFFS */
{0x251C,0xC000,0x251C,0xC103,0x74D9}, /* CELL 4 COEFFS */
{0x0804,0xF546,0x0804,0xC040,0x7544}, /* CELL 5 COEFFS */
{0x0000,0x0CD9,0x0CD9,0x0000,0x370A} /* CELL 6 COEFFS */
} ;
/***********************************************************
**FUNCTION :: Drv0362_GetLLARevision
**ACTION :: Returns the 362 LLA driver revision
**RETURN :: Revision362
***********************************************************/
ST_Revision_t Drv0362_GetLLARevision(void)
{
return (Revision362);
}
/*****************************************************
**FUNCTION :: FE_362_Pow
**ACTION :: Compute x^y (where n is an integer)
**PARAMS IN :: number -> n
**PARAMS OUT:: NONE
**RETURN :: x^y
*****************************************************/
int FE_362_Pow(int number1,int number2)
{
int i;
int result=1;
for(i=0;i<number2;i++)
result *=number1;
return result;
}
/*****************************************************
**FUNCTION :: FE_362_Pow
**ACTION :: Compute 2^n (where n is an integer)
**PARAMS IN :: number -> n
**PARAMS OUT:: NONE
**RETURN :: 2^2
*****************************************************/
int FE_362_PowOf2(int number)
{
int i;
int result=1;
for(i=0;i<number;i++)
{
result*=2;
}
}
/*****************************************************
--FUNCTION :: FE_362_AGC_IIR_LOCK_DETECTOR_SET
--ACTION :: Sets Good values for AGC IIR lock detector
--PARAMS IN ::
--PARAMS OUT :: None
--***************************************************/
void FE_362_AGC_IIR_LOCK_DETECTOR_SET(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_LOCK_DETECT_LSB,0x00);
/* Lock detect 1 */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_LOCK_DETECT_CHOICE,0x00);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_LOCK_DETECT_MSB,0x06);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_AUT_AGC_TARGET_LSB,0x04);
/* Lock detect 2 */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_LOCK_DETECT_CHOICE,0x01);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_LOCK_DETECT_MSB,0x06);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_AUT_AGC_TARGET_LSB,0x04);
/* Lock detect 3 */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_LOCK_DETECT_CHOICE,0x02);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_LOCK_DETECT_MSB,0x01);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_AUT_AGC_TARGET_LSB,0x00);
/* Lock detect 4 */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_LOCK_DETECT_CHOICE,0x03);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_LOCK_DETECT_MSB,0x01);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_AUT_AGC_TARGET_LSB,0x00);
}
/*****************************************************
--FUNCTION :: FE_362_IIR_FILTER_INIT
--ACTION ::
--PARAMS IN ::
--PARAMS OUT :: None
--***************************************************/
void FE_362_IIR_FILTER_INIT(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U8 Bandwidth)
{
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_NRST_IIR,0);
switch (Bandwidth)
{
case STTUNER_CHAN_BW_6M:
FE_362_FilterCoeffInit(DeviceMap,IOHandle,CellsCoeffs_6MHz);
break;
case STTUNER_CHAN_BW_7M:
FE_362_FilterCoeffInit(DeviceMap,IOHandle,CellsCoeffs_7MHz);
break;
case STTUNER_CHAN_BW_8M:
FE_362_FilterCoeffInit(DeviceMap,IOHandle,CellsCoeffs_8MHz);
break;
}
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_NRST_IIR,1);
}
/*****************************************************
--FUNCTION :: FE_362_AGC_IIR_RESET
--ACTION :: AGC reset procedure
--PARAMS IN ::
--PARAMS OUT :: None
--***************************************************/
void FE_362_AGC_IIR_RESET(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
U8 com_n;
com_n=STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0362_COM_N);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_COM_N,0x07);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_COM_SOFT_RSTN,0x00);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_COM_AGC_ON,0x00);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_COM_SOFT_RSTN,0x01);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_COM_AGC_ON,0x01);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_COM_N,com_n);
}
/*********************************************************
--FUNCTION :: FE_362_FilterCoeffInit
--ACTION :: Apply filter coeffs values
--PARAMS IN :: Handle to the Chip
--PARAMS OUT:: NONE
--********************************************************/
void FE_362_FilterCoeffInit(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U16 CellsCoeffs[][5])
{
S32 i,j;
for(i=1;i<=6;i++)
{
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_IIR_CELL_NB,i-1);
for(j=1;j<=5;j++)
{
STTUNER_IOREG_SetField(DeviceMap,IOHandle,(F0362_IIR_CX_COEFF1_MSB+2*(j-1)), MSB(CellsCoeffs[i-1][j-1]));
STTUNER_IOREG_SetField(DeviceMap,IOHandle,(F0362_IIR_CX_COEFF1_LSB+2*(j-1)), LSB(CellsCoeffs[i-1][j-1]));
}
}
}
/*****************************************************
--FUNCTION :: FE_362_WaitTuner
--ACTION :: Wait for tuner locked
--PARAMS IN :: TimeOut -> Maximum waiting time (in ms)
--PARAMS OUT:: NONE
--RETURN :: NONE
--***************************************************/
void FE_362_WaitTuner(STTUNER_tuner_instance_t *TunerInstance,U32 TimeOut, BOOL *TunerLocked )
{
int Time=0;
ST_ErrorCode_t Error;
*TunerLocked = FALSE;
while(!*TunerLocked && (Time<TimeOut))
{
WAIT_N_MS_362(1);
Error = (TunerInstance->Driver->tuner_IsTunerLocked)(TunerInstance->DrvHandle, TunerLocked);
Time++;
}
Time--;
}
/*****************************************************
--FUNCTION :: FE_362_Algo
--ACTION :: Search for Signal, Timing, Carrier and then data at a given Frequency,
-- in a given range:
--PARAMS IN ::
--PARAMS OUT::
--RETURN :: Type of the founded signal (if any)
--REMARKS :: This function is supposed to replace FE_362_SearchRun according
-- to last findings on SYR block
--***************************************************/
FE_362_SignalStatus_t FE_362_Algo(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_362_SearchParams_t *pParams,STTUNER_Handle_t TopLevelHandle)
{
FE_362_SignalStatus_t ret_flag;
S16 wd,ii,tempo;
U16 ppm,try,u_var,mode,guard,seuil;
U8 v_search,Rvsearch;
try=0;
do
{
ret_flag=LOCKOK_362;
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_MODE,pParams->Mode);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_GUARD,pParams->Guard);
STTUNER_IOREG_SetField(DeviceMap,IOHandle, F0362_FORCE,pParams->Force);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_CORE_ACTIVE,0);
WAIT_N_MS_362(5);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0362_CORE_ACTIVE,1);
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0362_AGC_LOCK);
wd=70;
while ((u_var==0) && (wd>0))
{
WAIT_N_MS_362(10);
wd-=10;
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0362_AGC_LOCK);
}
if(!u_var)
{
ret_flag=NOAGC_362;
break;
}
#ifdef STTUNER_DEBUG_LOCK_STAGES
STTBX_Print(("\n AGC LOCKED \n"));
#endif
wd=120; /* dcdc modifs gbgb */
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0362_SYR_LOCK);
while ( (!u_var) && (wd>0))
{
WAIT_N_MS_362(5);
wd-=5;
u_var=STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0362_SYR_LOCK);
}
if(!u_var)
{
ret_flag=NOSYMBOL_362;
#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 =STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0362_SYR_MODE) ;
guard=STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0362_SYR_GUARD);
if(mode == STTUNER_MODE_2K)
{
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R0362_CHP_TAPS,0x01); /***For 2k mode the chp_taps reg. must
***always set to 0x01***/
}
else
{
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R0362_CHP_TAPS,0x03);/***For 8k mode the chp_taps reg. must
***always set to 0x03***/
}
tempo=30<<(2*mode);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -