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

📄 drv399e.c

📁 st7710的tuner标准驱动
💻 C
📖 第 1 页 / 共 5 页
字号:


/* -------------------------------------------------------------------------
File Name: drv399E.c

Description: 399E driver LLA

Copyright (C) 2003-2004 STMicroelectronics

author: SD

History:

15-07-2004
Comments: First time Integrated in STTUNER STAPI
Revision 1.0.0
---------------------------------------------------------------------------- */


/* includes ---------------------------------------------------------------- */

/*	generic includes	*/
#include "gen_macros.h"
#include "sysdbase.h"
#include "tunsdrv.h"

#ifdef HOST_PC
	#include <utility.h>
	#include <stdio.h>
	#include "math.h"
	#include "stdlib.h"
	#ifndef NO_GUI
		#include "Appl.h"
		#include "UserPar.h"
		#include "Pnl_report.h"
		#include "399_Report_Msg.h"
		#define REPORTMSG(a,b,c) Report399(a,b,c);
	#else
		#define REPORTMSG(a,b,c)
	#endif
#else
	#define REPORTMSG(a,b,c) 
#endif

/* common includes */ 
#include"sttuner.h"
#include "399_drv.h"
#include"399_util.h"
#include "util399E.h"


#define MINIMUM_GAP 18000 /* Minimum gap size between master clock harmonic and tuner frequency (KHz) */
#define MINIMUM_GAP_low 10000
#define MINIMUM_GAP_2 33000

#ifndef STTUNER_MINIDRIVER
/* Current LLA revision	*/
static const ST_Revision_t Revision399  = "STV0399-LLA_REL_2.2.0";
#endif

 
static FE_399_LOOKUP_t FE_399_RF_LookUp =	{
												16,
												{
													-100,	-200,
													-150,	-190,
													-200,	-140,
													-250,	-90,
													-300,	-40,
													-350,	10,
													-400,	60,
													-450,	110,
													-500,	140,
													-550,	190,
													-600,	235,
													-650,	285,
													-700,	340,
													-750,	390,
													-800,	435,
													-840,	475
												}
											};

											
static FE_399_LOOKUP_t FE_399_CN_LookUp =	{
												20,
												{
													15,	9600,
													20,	9450,
													30,	9000,
													40,	8250,
													50,	7970,
													60,	7360,
													70,	6770,
													80,	6200,
													90,	5670,
													100,5190,
													110,4740,
													120,4360,
													130,4010,
													140,3710,
													150,3440,
													160,3210,
													170,3020,
													180,2860,
													190,2700,
													200,2600
												}
											};







/* structures -------------------------------------------------------------- */ 




#ifdef STTUNER_MINIDRIVER
		extern D0399_InstanceData_t *DEMODInstance;
#endif
	
#ifndef STTUNER_MINIDRIVER
/***********************************************************
**FUNCTION	::	Drv0399_GetLLARevision
**ACTION	::	Returns the 399 LLA driver revision
**RETURN	::	Revision399
***********************************************************/
ST_Revision_t Drv0399_GetLLARevision(void)
{
	return (Revision399);
}

#endif
/*****************************************************
**FUNCTION	::	XtoPowerY
**ACTION	::	Compute  x^y (where x and y are integers) 
**PARAMS IN	::	Number -> x
**				Power -> y
**PARAMS OUT::	NONE
**RETURN	::	2^n
*****************************************************/
#ifndef STTUNER_MINIDRIVER
U32 XtoPowerY(U32 Number, U32 Power)
{
	int i;
	long result = 1;
	
	for(i=0;i<Power;i++)
		result *= Number;
		
	return (U32)result;
}
#endif
S32 InRange(S32 x,S32 y,S32 z) 
{
	return ((x<=y && y<=z) || (z<=y && y<=x))?1:0;
}

#ifndef STTUNER_MINIDRIVER
S32 RoundToNextHighestInteger(S32 Number,U32 Digits)
{
	S32 result = 0,
		highest = 0;
	
	highest = XtoPowerY(10,Digits);
	result = Number / highest;
	
	if((Number - (Number/highest)*highest) > 0)
		result += 1;
	
	return result;
}
#endif
/*****************************************************
**FUNCTION	::	FE_399E_PowOf2
**ACTION	::	Compute  2^n (where n is an integer) 
**PARAMS IN	::	number -> n
**PARAMS OUT::	NONE
**RETURN	::	2^n
*****************************************************/

long FE_399E_PowOf2(int number)
{
	int i;
	long result=1;
	
	for(i=0;i<number;i++)
		result*=2;
		
	return result;
}

#ifndef STTUNER_MINIDRIVER
/*****************************************************
**FUNCTION	::	FE_399E_GetPowOf2
**ACTION	::	Compute  x according to y with y=2^x 
**PARAMS IN	::	number -> y
**PARAMS OUT::	NONE
**RETURN	::	x
*****************************************************/
long FE_399E_GetPowOf2(int number)
{
	int i=0;
	
	while(FE_399E_PowOf2(i)<number) i++;
		
	return i;
}
#endif
#ifndef STTUNER_MINIDRIVER
BOOL FE_399_Harmonic(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U32 MasterClock,U32 RfFrequency,U32 OFFSET)
{
	S32 gap;
	
	gap = RfFrequency % (MasterClock / 1000);
	
	/*if((gap <= MINIMUM_GAP) || (gap >= (MasterClock / 1000)-MINIMUM_GAP))*/
	if((gap <= OFFSET) || (gap >= (MasterClock / 1000)-OFFSET))
		return TRUE;
	else
		return FALSE;
}
#endif
#ifdef STTUNER_MINIDRIVER
BOOL FE_399_Harmonic(U32 MasterClock,U32 RfFrequency,U32 OFFSET)
{
	S32 gap;
	
	gap = RfFrequency % (MasterClock / 1000);
	
	/*if((gap <= MINIMUM_GAP) || (gap >= (MasterClock / 1000)-MINIMUM_GAP))*/
	if((gap <= OFFSET) || (gap >= (MasterClock / 1000)-OFFSET))
		return TRUE;
	else
		return FALSE;
}
#endif
BOOL FE_399_Triple(S32 MasterClock,S32 SymbolRate) 
{
	S32 ratio;
	
	ratio = MasterClock/(SymbolRate/1000);
	
	if((ratio >= 2990) && (ratio <= 3010))
		return TRUE;
	else
		return FALSE;
}


U32 FE_399_SelectOffset(S32 SymbolRate)
{

U32 OFFSET;
if(SymbolRate <= 10000000)
   {
    OFFSET = MINIMUM_GAP_low;
   }
   
else
  {
   OFFSET =MINIMUM_GAP; 
  }
  
return OFFSET;
}

#ifdef STTUNER_MINIDRIVER
S32 FE_399_SelectMclk(U32 RfFrequency,S32 SymbolRate,S32 ExtClk)
{
	BOOL harmonic,triple;
	U32 pll_div;
	U32 coef_div;
	/*S32 clock[2][2]={{65571428,13},{70615384,14}};*/
	S32 clock[2][2];
	S32 index = 0;
	S32 ratio;
	
	
	pll_div = FE_399_Get_PLL_mult_coeff( );
	
	if((pll_div == 34)&&(SymbolRate <= 10000000))
	{
	 coef_div=12;
	}
	
	else if((pll_div == 34)&&(SymbolRate > 10000000)&&(SymbolRate <= 20000000))
	{
	 coef_div=9;
	}
	
	else if((pll_div == 34)&&(SymbolRate > 20000000))
	{
	 coef_div=6;
	}
	
	else if((pll_div == 32)&&(SymbolRate <= 10000000))
	{
	 coef_div=12;
	}
	
	else if((pll_div == 32)&&(SymbolRate > 10000000)&&(SymbolRate <= 20000000))
	{
	 coef_div=9;
	}
	
	else if((pll_div == 32)&&(SymbolRate > 20000000))
	{
	 coef_div=6;
	}
	clock[0][0]=pll_div*27000000/coef_div;
	clock[0][1]=coef_div; 
	clock[1][0]=pll_div*27000000/(coef_div+1); 
	clock[1][1]=coef_div+1; 
	
	ratio = FE_399_GetDivRatio( );
	if((ratio>=6) && (ratio<=13))
	{
		do
		{
			harmonic = FE_399_Harmonic(clock[index][0],RfFrequency,FE_399_SelectOffset(SymbolRate));
			triple = FE_399_Triple(clock[index][0],SymbolRate);
			index++;
		}
		while((harmonic || triple) && (index<2));
	
		if(harmonic || triple)
			FE_399_SetDivRatio(coef_div);
		else
			FE_399_SetDivRatio(clock[index-1][1]);
	}
	
	return FE_399_GetMclkFreq(ExtClk);
	
}
#endif

#ifndef STTUNER_MINIDRIVER
S32 FE_399_SelectMclk(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U32 RfFrequency,S32 SymbolRate,S32 ExtClk)
{
	BOOL harmonic,triple;
	U32 pll_div;
	U32 coef_div;
	/*S32 clock[2][2]={{65571428,13},{70615384,14}};*/
	S32 clock[2][2];
	S32 index = 0;
	S32 ratio;
	
		
	pll_div = FE_399_Get_PLL_mult_coeff(DeviceMap, IOHandle);
	
	if((pll_div == 34)&&(SymbolRate <= 10000000))
	{
	 coef_div=12;
	}
	
	else if((pll_div == 34)&&(SymbolRate > 10000000)&&(SymbolRate <= 20000000))
	{
	 coef_div=9;
	}
	
	else if((pll_div == 34)&&(SymbolRate > 20000000))
	{
	 coef_div=6;
	}
	
	else if((pll_div == 32)&&(SymbolRate <= 10000000))
	{
	 coef_div=12;
	}
	
	else if((pll_div == 32)&&(SymbolRate > 10000000)&&(SymbolRate <= 20000000))
	{
	 coef_div=9;
	}
	
	else if((pll_div == 32)&&(SymbolRate > 20000000))
	{
	 coef_div=6;
	}
	
	
	
	clock[0][0]=pll_div*27000000/coef_div;
	clock[0][1]=coef_div; 
	clock[1][0]=pll_div*27000000/(coef_div+1); 
	clock[1][1]=coef_div+1; 
	
	ratio = FE_399_GetDivRatio(DeviceMap, IOHandle);
	if((ratio>=6) && (ratio<=13))
	{
		do
		{

		
			
			harmonic = FE_399_Harmonic(DeviceMap, IOHandle,clock[index][0],RfFrequency,FE_399_SelectOffset(SymbolRate));
			triple = FE_399_Triple(clock[index][0],SymbolRate);
			index++;
		}
		while((harmonic || triple) && (index<2));
	
		if(harmonic || triple)
			FE_399_SetDivRatio(DeviceMap, IOHandle,coef_div);
		else
			FE_399_SetDivRatio(DeviceMap, IOHandle,clock[index-1][1]);
	}
	
	return FE_399_GetMclkFreq(DeviceMap, IOHandle,ExtClk);
	
}

#endif
/*****************************************************
**FUNCTION	::	FE_399_CalcAGC1Gain
**ACTION	::	Compute the AGC1 gain
**PARAMS IN	::  regvalue	==>	register value
**PARAMS OUT::	NONE
**RETURN	::	AGC1 gain multiplied by two
*****************************************************/
S32 FE_399_CalcAGC1Gain(U8 regvalue)
{
	S32 gain = 0;
	
	gain = (S32)((regvalue >> 2) & 0x1F);
	
	if(!(regvalue & 0x80))
		gain += 16;
		
	return gain;
}

/*****************************************************
**FUNCTION	::	FE_399_CalcAGC1Integrator
**ACTION	::	Compute the AGC1 gain
**PARAMS IN	::  gain	==>	gain multiplied by two
**PARAMS OUT::	NONE
**RETURN	::	AGC1 integrator value
*****************************************************/
U8 FE_399_CalcAGC1Integrator(S32 gain)
{
	U8 integrator = 0x00;
	
	if(gain > 31)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -