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

📄 paltuner.c

📁 车载DVD osdIC TW8816原厂代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "Config.h"
#include	"reg.h"
#include	"typedefs.h"

#if defined (SUPPORT_TV) && defined( PAL_TV )

#include	"i2c.h"
#include	"main.h"
#include	"osdbasic.h"
#include    "dispinfo.h"
#include	"osdmenu.h"
#include	"tuner.h"
#include	"audio.h"
//#include	"eds.h"
//#include    "cc.h"
#include    "printf.h"
#include	"tw88.h"
#include	"etc_eep.h"
#include	"RegMap.h"

//#define  Fpc_NTSC	45750;			// 45.75Mhz

//--------------------------------------------------------------------------

static  IDATA BYTE	MTSType;
		PDATA BYTE	TVChannel, DummyChannel;
	    bit   TVChManual = 0;
 IDATA WORD TVFreq=0;

extern  bit   TVTunerAudioActive;
extern CODE struct RegisterInfo UserRange;
extern	bit	        ChannelEdit_Flag;

//#define EDITTVCHN_TIMEOUT		100		//ljy.EDITTVCHN timeout for each number(in msec)

#define MIN_FREQUENCY	0x54a//0x572	//0x51b//0x54a //580
#define SECAM_L_MIN		0x51b	
#define MAX_FREQUENCY   0x3882		// PAL FREQ INFO
#define FREQ_INC	    16      	// 1Mhz		

// TVPRSYSTEM: X XXX XXXX :  SKIP[bit7] : AUDIO[bit6-4] : COLORSYSTEM[bit3~0]

//---------- Control Code -----------------------------------------------------
#if TVTunerDevice==PHILIPS

CODE	WORD	kLowBand  = 0xCEA0;
CODE	WORD	kMidBand  = 0xCE90;
CODE	WORD	kHighBand = 0xCE30;

#elif TVTunerDevice==ALPS

CODE	WORD	kLowBand  = 0xCE01;
CODE	WORD	kMidBand  = 0xCE02;
CODE	WORD	kHighBand = 0xCE08;

#elif TVTunerDevice==TEMIC

CODE	WORD	kLowBand  = 0x8EA2;
CODE	WORD	kMidBand  = 0x8E94;
CODE	WORD	kHighBand = 0x8E31;

#elif TVTunerDevice==TVAVA

CODE	WORD	kLowBand  = 0x8001;
CODE	WORD	kMidBand  = 0x8002;
CODE	WORD	kHighBand = 0x8008;

#elif TVTunerDevice==LGTUNER	// TAPC-H701F (NTSC Only)

CODE	WORD	kLowBand  = 0x8E01;
CODE	WORD	kMidBand  = 0x8E02;
CODE	WORD	kHighBand = 0x8E08;

#elif TVTunerDevice==SAMSUNGMUTITUNER	// PAL/SECAM
CODE	WORD	kLowBand  = 0x8EA1;
CODE	WORD	kMidBand  = 0x8E91;
CODE	WORD	kHighBand = 0x8E31;

//070406-start
#elif TVTunerDevice==LGTUNER_MK5
CODE	WORD	kLowBand  = 0xCE01;
CODE	WORD	kMidBand  =  0xCE02;
CODE	WORD	kHighBand = 0xCE04;
//070406-end

#endif
//---------- PLL divider ------------------------------------------------------
#if TVTunerDevice==LGTUNER_MK5

#define FreqIF		3800 // 38.00 Mhz
#define FreqSetp	16	 // 

#else
//TVTunerDevice==PHILIPS || TVTunerDevice==ALPS || TVTunerDevice==TEMIC || TVTunerDevice==LGTUNER || TVTunerDevice==SAMSUNGMUTITUNER
#define FreqIF		4575 // Picture Intermediate Freq. in NTSC tuner : 45.75 MHz
#define FreqSetp	16	 // 1Mhz/62.5Khz (RSA=RAB=1) // 1000/62.5 = 16

#endif


//-----------------------------------------------------------------------------

WORD ConvertChDivToFreq(WORD wDiv)
{
	DWORD Temp;
	WORD wFreq; // Chanel Freq X 10

	Temp = (DWORD)(wDiv * 10L / FreqSetp - FreqIF / 10L);
	wFreq = (WORD)Temp;

	return wFreq;
}

void DisplayTVFreq(WORD wFreq)
{
	BYTE freq_str[9], temp_str, i;
	WORD wDisplay_Freq;

	wDisplay_Freq = ConvertChDivToFreq(wFreq);
	utoa( (WORD)wDisplay_Freq, freq_str,10);	
	for(i=0;i<9;i++)
	{
		if(freq_str[i] == 0) 
		{
			temp_str = freq_str[i-1];
			freq_str[i-1] = '.';
			freq_str[i] = temp_str;
			freq_str[i+1] = 'M'; //end string
			freq_str[i+2] = 'H'; //end string
			freq_str[i+3] = 'z'; //end string
			freq_str[i+4] = 0; //end string
			break;
		}
	}
	DisplayChannelFreq(freq_str);		// Display current freq.

}

void DisplayScanChannel(BYTE cChannel)
{
	BYTE str[4];

	utoa( (WORD)cChannel, str,10);	
	DisplayScanTVChannel(str);		// Display Channel
}

void SetTVFreq(WORD FreqDiv)
{
	WORD TVCtrlCode=0;

	TVFreq = FreqDiv;	

	#ifdef DEBUG_TV
	dPuts("\r\n++(SetTVFreq)");
	Printf("\r\CH:%d  ", (WORD)TVChannel);
	#endif

	#ifdef DEBUG_TV
	Printf("\rTVFreqDiv:0x%04x",(WORD)FreqDiv);
	#endif

	// Get Control Code
	if( FreqDiv <= kUpperLowBand)
			TVCtrlCode = kLowBand;
	else
	{
		if( FreqDiv <= kUpperMidBand)
				TVCtrlCode = kMidBand;
		else
				TVCtrlCode = kHighBand;
	}
	
	#ifdef DEBUG_TV
	Printf("  TVCtrlCode:0x%04x", (WORD)TVCtrlCode);
	#endif

	I2CStart();
	I2CWriteData(TVTunerI2CAddress & 0xFE);
	I2CWriteData(FreqDiv>>8);
	I2CWriteData(FreqDiv);
	I2CWriteData(TVCtrlCode>>8);
	I2CWriteData(TVCtrlCode);
	I2CStop();
	
	if( !TVTunerAudioActive )
		AudioAutoStdDetection();

	#ifdef DEBUG_TV
	dPuts("\r\n__(SetTVFreq)");
	#endif
}

//BYTE GetTVChannel(void)
//{
//	return TVChannel;
//}
//---------------------------------------------------------------------------
//Auto Fine Tune
//	if (FINE == 0) {	
	 // +/-1.5Mhz : Data +/-24, : AutoScan 
	 // +/-2.0Mhz : Data +/-32  : ManualScan
	 // Data 1: 62.25Khz
//	}  

// Read Tuner ADC Data
BYTE ReadTuner(void)
{
	BYTE Val;

//070406-start
#if  TVTunerDevice==LGTUNER_MK5 
 	I2CStart();
	I2CWriteData(TVTunerIFI2CAddress | 0x01);
	Val = I2CReadData();
	I2CStop();
	
#else	//TVTunerDevice==LGTUNER_MK5 

 	I2CStart();
	I2CWriteData(TVTunerI2CAddress & 0xFE);
	I2CStart();
	I2CWriteData(TVTunerI2CAddress | 0x01);
	Val = I2CReadData();
	I2CStop();

//	Printf("\r\nTuner ADC:0x%02x",(WORD)Val);

#endif	//TVTunerDevice==LGTUNER_MK5 
//070406-end

	return Val;
}

BYTE AFT( WORD TVFreqDiv )
{
//070406-start
#if  TVTunerDevice==LGTUNER_MK5 

	BYTE AFTStatus=FALSE;
	BYTE val,Check_Cnt = 0;
	
	
	//FreqDiv = FreqDiv & ( ~SKIPCHN_MASK );
	if( IsNoInput() ) return FALSE;  // ???

	do{
		ReadTuner();
		delay(20);	
		val = ReadTuner();
#ifdef DEBUG
	       dPrintf("\r\n AFT value(ch:%d) = 0x%02x; count:%d", (WORD)TVChannel, (WORD)val, (WORD)Check_Cnt);
#endif
		if((val & 0x81)==0x80)	// check bit7=1  for inside AFC,bit0=0 for PONR 
			{
				if(val & 0x40)
					{
						val=val&0x1e;
						if(val == 0x00 ||val == 0x02 || val == 0x1e || val == 0x1c)
							{
								AFTStatus=TRUE;	// inside AFC & Freq locked
								val=0xff;
							}
						else
							{
								val>>=1;
								switch(val)
									{
									case 0x07:
										val=8;
										break;
										
									case 0x06:
										val=4;
										break;
									
									case 0x05:
									case 0x04:
										val=2;
										break;			

									case 0x03:
									case 0x02:
										val=1;
										break;				

									case 0x08:
										val=0x18;
										break;
										
									case 0x09:
										val=0x14;
										break;
									
									case 0x0a:
									case 0x0b:
										val=0x12;
										break;			

									case 0x0c:
									case 0x0d:
									default:
										val=0x11;
										break;			

								}
								if(val>10)
									TVFreqDiv-=(val&0x0f);	
								else
									TVFreqDiv+=val;	
								
								val=0xee;								
							}
					}

			}
		else if((ReadTuner()) & 0xc0)	//double check again
			val=0xee;
		else
			val=0xff;	// outside AFC data

		SetTVFreq(TVFreqDiv);			
		DisplayTVFreq(TVFreqDiv);
		Check_Cnt++;
		if(Check_Cnt>0x20)
			val=0xff;				


		}while(val == 0xee);

		if((AFTStatus==TRUE) && (IsVideoInput()))
			{
				val = ReadTuner();
				val=val&0xc1;
				if((val == 0xc0) || (val == 0xc1) || (val == 0xde) || (val == 0xdd))
					{
						TVFreq = TVFreqDiv;	// Get Data.
//						Printf("\n\rTVFreqH %02xH TVFreqL %02xH",(WORD)(TVFreqDiv>>8),(WORD)(TVFreqDiv&0xff));
//						Printf("Freq ADC%02xH",(WORD)(ReadTuner()));
					}
			}

		return AFTStatus;	

#else	//TVTunerDevice==LGTUNER_MK5 		


	BYTE amount = 8, Check_Cnt=8, val;
	
	//FreqDiv = FreqDiv & ( ~SKIPCHN_MASK );
	if( IsNoInput() ) return FALSE;  // ???

	SetTVFreq(TVFreqDiv);
	delay(30);	
	val = ReadTuner();
	if(((val & 0x07) < 0x03 ) && ((val & 0x07) > 0x01 ))	
			goto true_aft;

	if( (val & 0x07) == 4 ) 	{
		TVFreqDiv -= 12;
		SetTVFreq(TVFreqDiv);
		delay(30);	
		val = ReadTuner();
		if ( (val & 0x07) == 4 ) {
			TVFreqDiv += 24;
			SetTVFreq(TVFreqDiv);
			delay(30);	
			val = ReadTuner();
			if ( (val & 0x07) == 4 ) {
				TVFreqDiv -= 36;
				SetTVFreq(TVFreqDiv);
				delay(30);	
				val = ReadTuner();
				if ( (val & 0x07) == 4 ) {
					TVFreqDiv += 48;
					SetTVFreq(TVFreqDiv);
					delay(30);	
					val = ReadTuner();
					if ( (val & 0x07) == 4 )  goto fail_aft;

⌨️ 快捷键说明

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