📄 drv0299.c
字号:
/*----------------------------------------------------------------------------
File Name : drv0299.c
Description : STV0299 front-end driver routines.
Copyright (C) 2000 STMicroelectronics
version: 3.1.0
Revision History :
04/02/00 Code based on original implementation by CBB.
21/03/00 Received code modifications that eliminate compiler
warnings.
Added defensive check to Mclk == 0 during parameter
initialization routine to avoid potential divide by
zero exceptions.
04/07/2005 Minidriver Updates
Reference:
----------------------------------------------------------------------------*/
/* Includes ---------------------------------------------------------------- */
#ifdef ST_OSLINUX
#include "stos.h"
#else
/* C libs */
#include <string.h>
#include <stdlib.h> /* for abs() */
/* STAPI common includes */
#include "stlite.h" /* Standard includes */
#include "sttbx.h"
#endif
#include "stddefs.h"
/* STAPI */
#include "sttuner.h"
#include "sti2c.h"
#include "stcommon.h"
#include "stevt.h"
/* local to sttuner */
#ifdef STTUNER_MINIDRIVER
#include "iodirect.h"
#endif
#ifndef STTUNER_MINIDRIVER
#include "util.h" /* generic utility functions for sttuner */
#include "dbtypes.h" /* data types for databases */
#include "drv0299.h" /* header for this file */
#include "ioarch.h" /* I/O for this driver */
#include "ioreg.h" /* I/O for this driver */
#endif
#include "reg0299.h" /* register mappings for the stv0299 */
#include "d0299.h" /* top level header for this driver */
#include "sysdbase.h" /* functions to accesss system data */
#include "tunsdrv.h"
/* defines ----------------------------------------------------------------- */
#define DRV0299_INTERPOLATE( LutLow, LutHigh, RealLow, RealHigh, Real) \
(LutLow + (((Real - RealLow) * (LutHigh - LutLow)) / \
(RealHigh - RealLow)))
/* Delay routine */
#define SystemWaitFor(x) STV0299_Delay((x*1000))
/* Add carrieroffset to SCPC transponder */
#define CARRIEROFFSET 2000
extern TUNSDRV_InstanceData_t *TUNSDRV_GetInstFromHandle(TUNER_Handle_t Handle);
#ifdef STTUNER_MINIDRIVER
long Reg0299_RegSetSymbolRate(long SymbolRate);
extern ST_ErrorCode_t tuner_tunsdrv_SetFrequency (U32 Frequency, U32 *ReturnFrequency, U32 SymbolRate);
extern BOOL Tuner_GetStatus(void);
#endif
/* private types ----------------------------------------------------------- */
typedef struct
{
S32 Real;
S32 Lookup;
} DRV0299_LUT_t;
/* Current LLA revision */
#ifndef STTUNER_MINIDRIVER
static ST_Revision_t Revision299 = " STV0299-LLA_REL_3.2(GUI) ";
#endif
static const DRV0299_LUT_t BerLUT[] =
{
{ ((U16)-1), 200000 },
{ 9600, 160000 },
{ 9450, 120000 }, /* 2 */
{ 9260, 97000 }, /* 2.5 */
{ 9000, 82000 }, /* 3 */
{ 8760, 73000 }, /* 3.5 */
{ 8520, 61500 }, /* 4 */
{ 8250, 51000 }, /* 4.5 */
{ 7970, 42000 }, /* 5 */
{ 7690, 34000 }, /* 5.5 */
{ 7360, 26000 }, /* 6 */
{ 7080, 20600 }, /* 6.5 */
{ 6770, 15000 }, /* 7 */
{ 6470, 11200 }, /* 7.5 */
{ 6200, 8000 }, /* 8 */
{ 5900, 5400 }, /* 8.5 */
{ 5670, 3600 }, /* 9 */
{ 5420, 2320 }, /* 9.5 */
{ 5190, 1450 }, /* 10 */
{ 4960, 840 }, /* 10.5 */
{ 4740, 480 }, /* 11 */
{ 4550, 225 }, /* 11.5 */
{ 4360, 130 }, /* 12 */
{ 4170, 60 }, /* 12.5 */
{ 4010, 30 }, /* 13 */
{ 3860, 12 }, /* 13.5 */
{ 3710, 4 }, /* 14 */
{ 3580, 1 }, /* 14.5 */
{ 3440, 0 }, /* 15 */
{ 0, 0 },
{ ((U32)-1), 0 } /* End */
};
static const DRV0299_LUT_t SignalNoiseLUT[] =
{
{ ((U16)-1), 0 }, /* 1 */
{ 9600, 19 }, /* 1.5 */
{ 9450, 22 }, /* 2 */
{ 9260, 25 }, /* 2.5 */
{ 9000, 28 }, /* 3 */
{ 8760, 31 }, /* 3.5 */
{ 8520, 34 }, /* 4 */
{ 8250, 37 }, /* 4.5 */
{ 7970, 40 }, /* 5 */
{ 7690, 43 }, /* 5.5 */
{ 7360, 46 }, /* 6 */
{ 7080, 49 }, /* 6.5 */
{ 6770, 52 }, /* 7 */
{ 6470, 55 }, /* 7.5 */
{ 6200, 58 }, /* 8 */
{ 5900, 61 }, /* 8.5 */
{ 5670, 64 }, /* 9 */
{ 5420, 67 }, /* 9.5 */
{ 5190, 70 }, /* 10 */
{ 4960, 73 }, /* 10.5 */
{ 4740, 76 }, /* 11 */
{ 4550, 79 }, /* 11.5 */
{ 4360, 82 }, /* 12 */
{ 4170, 85 }, /* 12.5 */
{ 4010, 88 }, /* 13 */
{ 3860, 91 }, /* 13.5 */
{ 3710, 94 }, /* 14 */
{ 3580, 97 }, /* 14.5 */
{ 3440, 100 }, /* 15 */
{ 0, 100 },
{ ((U32)-1), 0 } /* End */
};
#ifndef STTUNER_MINIDRIVER
static const DRV0299_LUT_t AgcLUT[] =
{
{ 127, 100 }, /* 0dBm */
{ 115, 90 }, /* -20dBm */
{ 75, 70 }, /* -25dBm */
{ 65, 20 }, /* -30dBm */
{ 52, -50 }, /* -35dBm */
{ 44, -100 }, /* -40dBm */
{ 34, -150 }, /* -45dBm */
{ 25, -250 }, /* -50dBm */
{ 14, -300 }, /* -55dBm */
{ -16, -350 }, /* -60dBm */
{ -41, -400 }, /* -65dBm */
{ -69, -450 }, /* -70dBm */
{ -82, -500 }, /* -75dBm */
{ -92, -550 }, /* -80dBm */
{ -100, -600 }, /* -81dBm */
{ -128, -650 }, /* -129 actually cannot returned by AGCINTEGRATOR, but it is to stop the while loop above -128, which is the least value to be returned*/
{ ((U32)-1), 0 } /* End */
};
#endif
/* variables --------------------------------------------------------------- */
/* Used to turn on the infinite test loop in the search to simulate delay on search */
BOOL TestLoopActive=FALSE;
#ifndef STTUNER_MINIDRIVER
/* functions --------------------------------------------------------------- */
/***********************************************************
**FUNCTION :: Drv0299_GetLLARevision
**ACTION :: Returns the 299 LLA driver revision
**RETURN :: Revision299
***********************************************************/
ST_Revision_t Drv0299_GetLLARevision(void)
{
return (Revision299);
}
/*----------------------------------------------------
FUNCTION Drv0299_WaitTuner
ACTION Wait for tuner locked
PARAMS IN TimeOut -> Maximum waiting time (in ms)
PARAMS OUT NONE
RETURN NONE (Handle == THIS_INSTANCE.Tuner.DrvHandle)
------------------------------------------------------*/
void Drv0299_WaitTuner(STTUNER_tuner_instance_t *TunerInstance, int TimeOut)
{
int Time = 0;
BOOL TunerLocked = FALSE;
ST_ErrorCode_t Error;
while(!TunerLocked && (Time < TimeOut))
{
SystemWaitFor(1);
Error = (TunerInstance->Driver->tuner_IsTunerLocked)(TunerInstance->DrvHandle, &TunerLocked);
Time++;
}
Time--;
}
#endif
#ifdef STTUNER_MINIDRIVER
/*----------------------------------------------------
FUNCTION CheckTiming
ACTION Check for timing locked
PARAMS IN Params->Ttiming => Time to wait for timing loop locked
PARAMS OUT Params->State => result of the check
RETURN E299_NOTIMING if timing not locked, E299_TIMINGOK otherwise
------------------------------------------------------*/
D0299_SignalType_t Drv0299_CheckTiming(D0299_SearchParams_t *Params)
{
int locked,timing;
U8 nsbuffer[2];
/**********Delay of 100K Symbols************************/
task_delay((100000/(U32)(Params->SymbolRate/1000))*(ST_GetClocksPerSecond()/1000));
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R0299_TLIR, F0299_TLIR, F0299_TLIR_L, nsbuffer, 1, FALSE);
locked = nsbuffer[0];
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R0299_RTF, F0299_RTF, F0299_RTF_L, nsbuffer, 1, FALSE);
timing = abs((S8)nsbuffer[0]);
if(locked >= 43)
{
if((locked > 48) && (timing >= 110))
Params->State = E299_ANALOGCARRIER;
else
Params->State = E299_TIMINGOK;
}
else
Params->State = E299_NOTIMING;
return(Params->State);
}
#endif
#ifndef STTUNER_MINIDRIVER
/*----------------------------------------------------
FUNCTION Drv0299_SetAgc1Ref
ACTION Optimize AGC1 reference value after signal is found at very low AGC1 reference level
PARAMS IN DeviceMap,IOHandle
RETURN Error
------------------------------------------------------*/
ST_ErrorCode_t Drv0299_SetAgc1Ref(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle )
{
char Agc1Ref = 0x1f, agcintvalue;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0299
const char *identity = "STTUNER d0299.c demod_d0299_SetAgc1Value()";
#endif
ST_ErrorCode_t Error = ST_NO_ERROR;
Error = STTUNER_IOREG_SetField(DeviceMap, IOHandle, F0299_AGC1_REF, 0x1f); /* set AGC_Ref as maximum*/
if(Error != ST_NO_ERROR)
{
return Error;
}
do
{
Agc1Ref -= 5; /* decrease AGC1_Ref by step of 5 */
STTUNER_IOREG_SetField(DeviceMap, IOHandle, F0299_AGC1_REF, Agc1Ref);
agcintvalue = (char)STTUNER_IOREG_GetField(DeviceMap, IOHandle, F0299_AGCINTEGRATORVALUE);
}while((agcintvalue==-128) && (Agc1Ref >= 5));
return Error;
}
/*----------------------------------------------------
FUNCTION CheckAgc1
ACTION Check agc1 value
PARAMS IN Params -> Pointer to SEARCHPARAMS structure, TunerID added GNBvd26185
PARAMS OUT Params->State is modified
RETURN E299_NOAGC1 if AGC1=-128, E299_AGC1SATURATION
if AGC1=127, E299_AGC1OK otherwise
------------------------------------------------------*/
D0299_SignalType_t Drv0299_CheckAgc1(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, D0299_SearchParams_t *Params, STTUNER_TunerType_t TunerType)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_DRV0299
const char *identity = "STTUNER drv0299.c Drv0299_CheckAgc1()";
#endif
int AGC1Value;
int Agc1Threshold = -128;
if(TunerType!=STTUNER_TUNER_MAX2116)
{
AGC1Value = STTUNER_IOREG_GetField(DeviceMap, IOHandle, F0299_AGCINTEGRATORVALUE);
#ifdef STTUNER_DEBUG_MODULE_SATDRV_DRV0299
STTBX_Print(("%s AGC1Value = %d (", identity, AGC1Value));
#endif
if (AGC1Value == Agc1Threshold )
{
Params->State = E299_NOAGC1;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_DRV0299
STTBX_Print(("E299_NOAGC1)\n"));
#endif
}
else if(AGC1Value == 127)
{
Params->State = E299_AGC1SATURATION;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_DRV0299
STTBX_Print(("E299_AGC1SATURATION)\n"));
#endif
}
else
{
Params->State = E299_AGC1OK;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_DRV0299
STTBX_Print(("E299_AGC1OK)\n"));
#endif
}
}
else Params->State = E299_AGC1OK;
return(Params->State);
}
/*----------------------------------------------------
FUNCTION CheckTiming
ACTION Check for timing locked
PARAMS IN Params->Ttiming => Time to wait for timing loop locked
PARAMS OUT Params->State => result of the check
RETURN E299_NOTIMING if timing not locked, E299_TIMINGOK otherwise
------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -