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

📄 drv0299.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
/*----------------------------------------------------------------------------
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 + -