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

📄 lg_yizhi_tuner.c

📁 LG数字一体化高频头TDMK-G5XXD驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "iic.h"
#include "LGIT.h"

#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>

#include "ftypes.h"
#include "..\taskproc\inc\Sys_head.h"
#include "..\inc\Memhead.h"
#include "Frontend.h"

#if LG_C_TUNER

#define DELAY_TIME      22500
#define CHIPADDRESS	0x18
unsigned long              uSysClk=58000000;
float                      m_iIfagcMax=145;//130
float                      m_iIfagcMin=100;//80
float                      m_iRfagcMax=255;
float                      m_iRfagcMin=0;

unsigned long              uIF=36125000;
unsigned char              bSyncReg ;
unsigned char              TunerB[8];
int GLOBALLOCK=0;
unsigned char ii=0;
unsigned long freq_result[]={};
unsigned short Esum;	
float ber_value;
unsigned char _Qammode;


void TunerWrite(_chanFrequency);
void TDA10021_iWrI2c(int address,int data);  
unsigned char TDA10021_iRdI2c(int address) ; 
char FE_Set_Tuner(unsigned long _chanFrequency,unsigned long _chanSymbolRate, unsigned char _Qammode);
int FE_GetLK (void);
unsigned char FE_Get_Quality(void);
void Snrprocess(unsigned char *snrReturn); 
void Powerprocess(unsigned char *powerReturn);
int Berprocess(unsigned char* berReturn);
void Sleep(int x);
void Autosearch();

unsigned char FE_Get_Quality(void)
{
}


void Sleep(int x)
{
	unsigned i, j;
	for(i=0; i<x; i++)
	{
       for(j=0; j< DELAY_TIME; j++)
	   {
	   }
	}
}     


void TDA10021_iWrI2c(int address,int data)        //向TDA10021写数
{
	unsigned char IIC_data[3] ;
	unsigned char buffer1;
	IIC_data[0] = address ;
	IIC_data[1] = data ;
	buffer1 = FD_I2C_Write(&i2cHandle, CHIPADDRESS, IIC_data, 2);	
	if(buffer1 != FD_OK)
	{
		MXT_printf("\n***********tda10021 IIC write error ***********");
	}
}  

unsigned char TDA10021_iRdI2c(int address)       //从TDA10021读数
{
	unsigned char IIC_data[2] ;
	unsigned char buffer1;

	IIC_data[0] = address;
	buffer1 = FD_I2C_Read(&i2cHandle, CHIPADDRESS, &IIC_data[0], 1, &IIC_data[1] , 1);
	if(buffer1 != FD_OK)
	{
		MXT_printf("\n***********tda10021 IIC read error ***********");
	}
	return IIC_data[1] ;
}




char FE_Set_Tuner(unsigned long _chanFrequency,unsigned long _chanSymbolRate, unsigned char _Qammode)
{
	int m_iIfagcread;
	unsigned char  foundgain,buffer; 
    m_fSymbolrate=_chanSymbolRate*1000;
	m_iModulation=_Qammode;
	_chanFrequency=_chanFrequency/100;
	foundgain=0;    	
	unsigned char buffer3;

	MXT_printf("\n******** LG DVB-C ********");
	if((_chanFrequency<10) || (_chanFrequency>900) || (_chanSymbolRate>8000)|| (_chanSymbolRate<1000))
	{
		TunerWrite(0);    //MHZ
		return 0;
	}
	
	TSB_set_tsb1(0);//海信复位问题
	Sleep(10);
	TSB_set_tsb1(1);
	
	TunerWrite(_chanFrequency);    //MHZ
	//Sleep(10);	
	Q10021Init();
	
	Q10021WriteSymbolRate((unsigned long)(m_fSymbolrate));/*Input parameter: Symbol rate*/

	Q10021WriteQam(m_iModulation);         /*Input parameter 64QAM    -->2*/

	Q10021RunAlgo((unsigned long)(m_fSymbolrate),&foundgain,1,1);/*ubAutoGain,ubAutoSpecInv);//ubAutoGain,ubAutoSpecInv-->1,1*/
   	Sleep(2);
	//buffer = TDA10021_iRdI2c(0x17); 
	//MXT_printf("\n******** 111AGC_TUNER=%d********",buffer); 
	 
    FE_GetLK();

}

void Adjust_FrequencyOrder(void)
{
	int i;
	unsigned long tempFreg[200];
	unsigned char LocateNumber = 0;

	for(i=0;i<=Global_Variables.Searchmaxtp;i++)
	{
		if(AutoSearch_TP[i]->transFreq > 40000)
		{
			LocateNumber = i;
			break;
		}
	}
	if(LocateNumber > 0)
	{
		for(i=0;i<=Global_Variables.Searchmaxtp;i++)
		{
			tempFreg[i] = AutoSearch_TP[i]->transFreq;
		}

		for(i=1;i<=Global_Variables.Searchmaxtp;i++)
		{
			if((i+LocateNumber-1) <= Global_Variables.Searchmaxtp)
				AutoSearch_TP[i]->transFreq = tempFreg[(i+LocateNumber-1)%(Global_Variables.Searchmaxtp+1)];
			else
				AutoSearch_TP[i]->transFreq = tempFreg[(i+LocateNumber-1)%Global_Variables.Searchmaxtp];
		}
	}
}

void GetStartTP_StopTP(unsigned int FreqStart ,unsigned int FreqEnd ,unsigned short *StartTP, unsigned short *StopTP)
{
	U32 tempFrequency;
	U32 i;

	if(FreqStart > FreqEnd)
	{
		tempFrequency = FreqStart;
		FreqStart = FreqEnd;
		FreqEnd = tempFrequency;
	}
	for(i=1;i<=100;i++)
	{
		if((FreqStart >= All_Default_Tp[i]->transFreq) && (FreqStart <= All_Default_Tp[i+1]->transFreq))
			*StartTP = i;
		if((FreqEnd >= All_Default_Tp[i]->transFreq) && (FreqEnd <= All_Default_Tp[i+1]->transFreq))
			*StopTP = i;
	}
	MXT_printf("\n*****autosearch***** StartTP:%d StopTP:%d " ,*StartTP,*StopTP);
}

unsigned char autosearch_tuner(int FreqStart ,int FreqEnd ,unsigned short auto_symbolrate, 
								 unsigned char auto_modulation, unsigned char adjust_freq_order)
{
	unsigned long channelfreq;
	unsigned char  k=0,i,m,ii,foundgain,bAGC1,bAGC2,p; 
	U32 tunerWaitTime;
	extern U32 G_FP_ScanTimer;
	U16 StartTP=0,StopTP=0;
	U32 liu;

	FE_Set_Tuner(400*100,auto_symbolrate,auto_modulation);

	if (Global_Variables.AutoSearching != 1)
	{
		Global_Variables.AutoSearching = 1 ;
	}
 	foundgain=0;   
    Q10021Init();
	
	AutoSearch_TP[0]->transFreq = 0;
	AutoSearch_TP[0]->transSymbol = 0 ;
	AutoSearch_TP[0]->transPolor = 0 ;
	Global_Variables.Searchmaxtp = 0 ;

	Q10021WriteSymbolRate(auto_symbolrate*1000);/*Input parameter: Symbol rate*/

	Q10021WriteQam(auto_modulation);         /*Input parameter 64QAM    -->2*/	

	GetStartTP_StopTP(FreqStart*100,FreqEnd*100,&StartTP,&StopTP);

	for(liu = StartTP;liu<=StopTP;liu++)  //必须大于起始频率的10MHZ
	{
		channelfreq = All_Default_Tp[liu]->transFreq/100;
		if (Global_Variables.AutoSearchExit == 1)
		{
			Global_Variables.AutoSearchExit = 0 ;
			MXT_printf("\n*****somekey press and return *********");
			return 0;
		}
		
		TunerWrite(channelfreq);  
		tunerWaitTime = G_FP_ScanTimer;
		while((G_FP_ScanTimer-tunerWaitTime) < 10)
		{
		   //bAGC1 = TDA10021_iRdI2c(0x17); 
		   bAGC2 = TDA10021_iRdI2c(0x2f); 	
	       //MXT_printf("\n******** auto search AGC_TUNER=%d********",bAGC1); 
           //MXT_printf("\n******** auto search AGC_IF=%d********",bAGC2); 		
	       if (bAGC2 < 135)
			   break;		 
		}
		MXT_printf("\n********channelfreq=%d,%d********",channelfreq,bAGC2); 	 
	
		if(bAGC2 < 135){
			MXT_printf("\n********channelfreq=%d********",channelfreq);
			for(p=0;p<3;p++)
			{
				//TunerWrite(channelfreq);  
				//Sleep(5);
				Q10021WriteSymbolRate(auto_symbolrate*1000);/*Input parameter: Symbol rate*/
				Q10021WriteQam(auto_modulation);         /*Input parameter 64QAM    -->2*/
				Q10021RunAlgo(auto_symbolrate*1000,&foundgain,1,1);/*ubAutoGain,ubAutoSpecInv);//ubAutoGain,ubAutoSpecInv-->1,1*/
				
				tunerWaitTime = G_FP_ScanTimer;
				
				while((G_FP_ScanTimer-tunerWaitTime) < 50)
				{
					m=FE_GetLK ();  //锁定标志
					if(m==1)//lock
						break;
				}
				
				if(m==1)//lock
				{
					MXT_printf(" lock");
					//signalfreq[k]=n;
					k++;
					AutoSearch_TP[k]->transFreq = channelfreq*100;
					AutoSearch_TP[k]->transSymbol = auto_symbolrate ;
					AutoSearch_TP[k]->transPolor = auto_modulation ;
					
					Global_Variables.Searchmaxtp ++ ;
					break;
					//signalnumber++;
				}                    //保存频点
			}
		}
		Search_Process(channelfreq,FreqStart,FreqEnd);
	}

	if (adjust_freq_order) {
		Adjust_FrequencyOrder();
	}

	return 1 ;
}




void TunerWrite(_chanFrequency)
{	
	unsigned long m_fRfin;
	m_fRfin=_chanFrequency;
	int i,j, k ,err    ;
	int status;
	//CHAR buff[128];	
	long maincounter;
	double error;
	int pllic_lock;
	unsigned char buffer;
	/*******************************************************************/
	/**************       Make PLL 7 Byte Data      ********************/
	/*******************************************************************/		
	maincounter=(long)((m_fRfin+36.125)/(62.5f*0.001));
	error=(double)(m_fRfin+36.125)*1000-(double)(maincounter*(long)62.5);
	if(error>(double)62.5/2)maincounter+=1;
	
	//TunerB[1]=TUNER_ADDRESS;
	TunerB[0]=(unsigned char)((maincounter>>8)&0x007f) ;
	TunerB[1]=(unsigned)(maincounter&0x00ff);	
	TunerB[2]=0x86;
	
	if(m_fRfin<150.0)	TunerB[3]=0x01;
	else if(m_fRfin>448.0)  TunerB[3]=0x04;
	else                    TunerB[3]=0x02;	

    //ChipWriteMasked(0x0f,0x80,0x80); /* iic sw on(Bypass Tuner)*/
	buffer = TDA10021_iRdI2c(0x0f);
  	buffer= buffer|0x80;           //BYPIIC=1
	TDA10021_iWrI2c(0x0f,buffer);

	Sleep(5);  /*msec delay*/
	//I2cReadWrite(WRITE,TunerB[1],&TunerB[2],4);
	buffer=FD_I2C_Write(&i2cHandle, 0xc2, TunerB, 4);
		if(buffer != FD_OK)
	{
		MXT_printf("\n***********pll IIC write error ***********");
	}
	Sleep(5);  /*msec delay*/

	//ChipWriteMasked(0x0f,0x80,0x00); /* iic sw off(Bypass Tuner)*/
	buffer = TDA10021_iRdI2c(0x0f);
 	buffer= buffer&0x7f;           //BYPIIC=0
	TDA10021_iWrI2c(0x0f,buffer);
	
	/*Pll lock check */
	
	status=TunerRead();

	Sleep(5);

	if(status) pllic_lock=1; else pllic_lock=0;
}

unsigned char TunerRead()
{
	int err ;
	int i   ;
	i = 0 ;
	err = -1 ;
    unsigned char buffer;
    unsigned char TunerS[2];
	buffer = TDA10021_iRdI2c(0x0f);
  	buffer= buffer|0x80;           //BYPIIC=1
	TDA10021_iWrI2c(0x0f,buffer);

	FD_I2C_Read(&i2cHandle, 0xc2, &TunerS[0], 0, &TunerS[1] , 1);
	//MXT_printf("\n********Tuner Status=0x%x********",TunerS[1]); 
	buffer = TDA10021_iRdI2c(0x0f);
 	buffer= buffer&0x7f;           //BYPIIC=0
	TDA10021_iWrI2c(0x0f,buffer);
	if((TunerS[1]&0x40)==0x40)
		return(1);
	else 
		return(0);	
	Sleep(10);

}


void Q10021Init()
{
	int i;
	unsigned char pByte[3], bByte,buffer;
	long lDeltaF;

	pByte[0]  = 0x1c;/*AC_sConfig.bPLL_M_Factor;*/
	pByte[1]  = 0;   /*AC_sConfig.bPLL_N_Factor;*/
	pByte[2]  = 0x11;/*AC_sConfig.bPLL_P_Factor;*/

	/* write the PLL registers with PLL bypassed*/
	TDA10021_iWrI2c(0x28,pByte[0]);
    TDA10021_iWrI2c(0x29,pByte[1]);
	TDA10021_iWrI2c(0x2a,pByte[2]);
    
	//	ChipWriteMasked(0x2a, 0x10, 0);
	buffer = TDA10021_iRdI2c(0x2a);
	buffer= buffer&0xef;      
	TDA10021_iWrI2c(0x2a,buffer);
	//buffer = TDA10021_iRdI2c(0x2a);
	//MXT_printf("\n********in pll Status=0x%x********",buffer); 
	
	/* enable AGC2 and set PWMREF*/
	buffer = TDA10021_iRdI2c(0x2e);
	buffer= buffer|0x08;      

⌨️ 快捷键说明

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