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

📄 paltuner.c

📁 显示屏驱动源代码
💻 C
字号:
#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;
static  IDATA DWORD 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  = 0x8E01;
CODE	WORD	kMidBand  =  0x8E02;
CODE	WORD	kHighBand = 0x8E04;
//070406-end

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

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

#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

//-----------------------------------------------------------------------------
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;
	
	
	//FreqDiv = FreqDiv & ( ~SKIPCHN_MASK );
	if( IsNoInput() ) return FALSE;  // ???

	do{
		ReadTuner();
		delay(30);	
		val = ReadTuner();
		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=6;
										break;
										
									case 0x06:
										val=3;
										break;
									
									case 0x05:
									case 0x04:
										val=2;
										break;			

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

									case 0x08:
										val=0x16;
										break;
										
									case 0x09:
										val=0x13;
										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);			

		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;
			    }
			}
		}
	}

	do{
		SetTVFreq(TVFreqDiv);
		delay(30);	
		val = ReadTuner();
		if ( (val & 0x07) > 2 )  
			TVFreqDiv += amount;
		else if( (val & 0x07) < 2 )  
			TVFreqDiv -= amount;
		else goto true_aft; // == 2 ?

		amount = (amount==1 ? 1 : amount >> 1 );

	  }while( Check_Cnt-- > 0 );
	  goto fail_aft;

	if(((val & 0x07) < 0x03 ) && ((val & 0x07) > 0x01 )) goto true_aft;

fail_aft:
		return FALSE;

true_aft:
		if( IsNoInput() ) return FALSE;
		if(IsVideoInput()){
			TVFreq = TVFreqDiv;	// Get Data.
			return TRUE;
		}
		else return FALSE;

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

void SetTVChannel(void)
{
	//WORD TVFreq;
	char Fine;

	//BYTE val;
	//val = ReadDecoder(MISC3);
	//WriteDecoder(MISC3, val|0x08);  // Force to output blue or black Screen
	PanelBlack(1);
	CheckAndClearMuteOn();
	AudioOff();	// to remove Pop Noise.
	delay(5);

	TVFreq = GetTVFreqEE(TVChannel);
	Fine = GetFineTuneEE(TVChannel);// - 31;
	#ifdef DEBUG_TV
	Printf("\rTVFreqDiv:0x%04x",(WORD)Fine);
	#endif
	if( Fine ) SetTVFreq( TVFreq + Fine); // 
	else{
	
		//if( AFT(TVFreq)) ;
		//else 
			SetTVFreq( TVFreq ); // AFT Fail
	}
	
	delay(10);
	
	//SWReset();
	//WriteDecoder(MISC3, val);	// Disable Blue/black Screen
	//WriteDecoder(0x2f, 0x91); // Rewrite Clroma low pass filter data for Noinput color killer problem.
	if(!ChannelEdit_Flag)  DisplayTVChannel(TVChannel,1);		
	SetTVPrEE();
	PanelBlack(0);

	AudioOn();			//SetMSPVol();

}
//=======================  Called from outside ==============================================
void ChangeTVChannel(BYTE NewCh)
{
	TVChManual = 0;

	if( NewCh <= TOTAL_PR )
	{
		TVChannel = DummyChannel = NewCh;
		SetTVChannel();
	}
}

BYTE UpDownTVChannel(BYTE flag)
{
	BYTE i=0, OldTVChannel;
	BYTE MinChannel=START_PR;
	BYTE MaxCount;

	if(!ChannelEdit_Flag)
		ClearOSDInfo();

	MaxCount = TOTAL_PR ;

	OldTVChannel = TVChannel;

	do {
		i++;
		if( i > MaxCount ) 
		{
			TVChannel = DummyChannel = OldTVChannel;
			break;
		}	

		if(flag == UP)	 DummyChannel = ( TVChannel-MinChannel + 1 ) % MaxCount + MinChannel; 
		else  DummyChannel = ( TVChannel - MinChannel + MaxCount - 1) % MaxCount + MinChannel; 
		
		TVChannel = DummyChannel;

		if(ChannelEdit_Flag) break;	

	} while( GetTVPrSystem(TVChannel) & SKIPCHN_MASK);
	
	SetTVChannel();
	return TRUE;
}

// TV Channel Scan..
void ManualTune(BYTE flag)
{
	DWORD TEMP_TVFREQ;
	
	AudioOff();
	
	TEMP_TVFREQ = TVFreq;

	DisplayManualScanTVProg(flag);
	SetTVFreq( TEMP_TVFREQ ); 
	if( IsVideoInput() ) {
			if( flag == UP ) 	TEMP_TVFREQ += FREQ_INC;
			else 	TEMP_TVFREQ -= FREQ_INC;
	}

	while(1)
	{
			if( WantToStopTVScan() )
			break;

			if( flag == UP ) 	TEMP_TVFREQ += FREQ_INC;
			else 	TEMP_TVFREQ -= FREQ_INC;

			SetTVFreq( TEMP_TVFREQ ); 
		    delay(20);	// Wait for 150mS

			if( IsVideoInput() ) 
				if(AFT(TEMP_TVFREQ)) break;

			if( (TEMP_TVFREQ > MAX_FREQUENCY ) || (TEMP_TVFREQ < MIN_FREQUENCY)) break;
	};

	if( IsAudioMuteOn() )	DisplayMuteInfo();
	else AudioOn();

}

void ScanTVChannel(void)
{
	BYTE i;
	BYTE str[4];
	WORD addr;
	DWORD TEMP_TVFREQ;

	TVChannel = 0;

	AudioOff();

	//if( Colorsystem == SECAM_L_BAND ) TEMP_TVFREQ = SECAM_L_MIN; 
	//else
	TEMP_TVFREQ = MIN_FREQUENCY;

	for( ; TEMP_TVFREQ < MAX_FREQUENCY; TEMP_TVFREQ += FREQ_INC ) //1Mhz++
	{
		if( WantToStopTVScan() ) break;

		SetTVFreq( TEMP_TVFREQ ); 
		delay(20);	// Wait for 200mS

		if( IsVideoInput() ) {
			if(AFT(TEMP_TVFREQ)){
			//TVFreq = TEMP_TVFREQ;	
			TEMP_TVFREQ = TVFreq;	
			TEMP_TVFREQ += FREQ_INC*2;//32++; 2Mhz++
			TVChannel++;

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

			SetTVFreqEE( TVChannel, TVFreq );
			SetTVPrSystem(TVChannel, 0);	// Not skip
			SetFineTuneEE(TVChannel, 0);	// FineTune = 0

			addr = FIRST_SAVEDPR+TVCHNAME + TVChannel*BYTEPERCHANNEL;	// Channel Name = "-----" (Default)
			for(i=0; i<5; i++, addr++)
				WriteEEP( addr, '-' );
		} 

		if( TVChannel > TOTAL_PR )	break;
			}			

		}//for

	i=TVChannel+1;

	TVChannel = DummyChannel = 1; // First Channel

//070406-start
#if  TVTunerDevice==LGTUNER_MK5 
	ClearScanTV();	// for fast clear scantv osd
#endif	//TVTunerDevice==LGTUNER_MK5 
//070406-end

	SetTVChannel();

	if( IsAudioMuteOn() )	DisplayMuteInfo();
	else AudioOn();

	// Erase remain channel data 
	for( ; i <= TOTAL_PR; i++ ){
		SetTVFreqEE( i, 0x0fff );
		SetTVPrSystem(i, SKIPCHN_MASK);	// skip
		WriteEEP(FIRST_SAVEDPR+TVCHNAME + i*BYTEPERCHANNEL, 0xff);	// First char of the name = 0xff;
		SetFineTuneEE(i, 0);	// FineTune = 0
	}

}

/*
void SaveChannel( BYTE chn )
{
	TVChannel = chn;
	SetTVFreqEE( TVChannel, TVFreq );
	SetTVChannel();
}
*/
CODE struct RegisterInfo OSDFineTuneRange={ -31, 31, 0 };
BYTE GetFineTune(void)
{
	char val;
	int rd;
	val =  GetFineTuneEE(TVChannel) ;
	Mapping1( val, &OSDFineTuneRange, &rd, &UserRange );
	return (BYTE)rd;
}

BYTE ChangeFineChannel(BYTE flag)
{
	int rd;
	char val;
	WORD Freq;

	val = GetFineTuneEE(TVChannel) ;
	Printf("\r\nFine Tune:%d", (WORD)val);

//	if( val & 0x80 )	rd = -(val&0x7f)
	val = ( flag==UP ?  val+1  :  val-1  );		
	if( val < OSDFineTuneRange.Min || val > OSDFineTuneRange.Max )
		return 0; // Retry!!
	Freq = GetTVFreqEE(TVChannel);

	Freq = Freq + val;
	SetTVFreq( Freq );   
	SetFineTuneEE(TVChannel, (BYTE)val);

	Mapping1( val, &OSDFineTuneRange, &rd, &UserRange );
	return (BYTE)rd;
}


void GetFirstChannel(void)
{
	TVChannel = DummyChannel = GetTVPrEE();
	SetTVChannel();
}

BYTE IsSavedCurChn(void)
{                                                                  
	return( ( GetTVPrSystem( TVChannel ) & SKIPCHN_MASK ) ? CLEARED_CHN : SAVED_CHN   );
}
/*
BYTE StoreClearCurChn(void)
{
	BYTE val,cleared;

	val = GetTVPrSystem( TVChannel );
	if( val & SKIPCHN_MASK )	{	val &= ( ~SKIPCHN_MASK );	cleared = SAVED_CHN ;    }
	else						{	val |= SKIPCHN_MASK;	    cleared = CLEARED_CHN ; 	}
	
	SetTVPrSystem( TVChannel, val );
	return cleared;
}
*/
void EditTVChn(BYTE _RemoDataCode)
{
	WORD TempChannel; 
	TempChannel = DummyChannel ;

	if( TVChManual ) {
		TempChannel*= 10;
		TempChannel+= _RemoDataCode;

		if	(TempChannel > TOTAL_PR )
		{			
			while( TempChannel >= 10 )
				TempChannel -= 10;
		}
	}
	else {
		TempChannel = _RemoDataCode;
	}
	
	DummyChannel = TempChannel;
	DisplayTVChannel(DummyChannel, 0);
	TVChManual = 1;		// Request to run channel after timeout.
}

void InitTV(void)
{
//070406-start
#if  TVTunerDevice==LGTUNER_MK5 

	BYTE TVSysIndex=0;
	CODE BYTE PALSECAMTunerSysReg[] = {
										0x56,0x72,0x49,	//for B/G
										0x56,0x72,0x4a,	//for I
										0x56,0x72,0x4b,	//for D/K
										0x46,0x50,0x4b,	//for L
										0xc6,0x50,0x53	//for L'
					};
	MTSType             = MTS_STEREO;



	#ifdef DEBUG_TV
	dPrintf("\r\n++(InitTV) TunerI2CAddress:0x%04x", (WORD)TVTunerI2CAddress);
	#endif

	TVSysIndex=GetVInputStdDetectModeEE();
	WriteI2C(TVTunerIFI2CAddress, 0x00, PALSECAMTunerSysReg[TVSysIndex*3]);
	WriteI2C(TVTunerIFI2CAddress, 0x01, PALSECAMTunerSysReg[TVSysIndex*3+1]);		
	WriteI2C(TVTunerIFI2CAddress, 0x02, PALSECAMTunerSysReg[TVSysIndex*3+2]);		

#else	//TVTunerDevice==LGTUNER_MK5 

	MTSType             = MTS_STEREO;

	#ifdef DEBUG_TV
	dPrintf("\r\n++(InitTV) TunerI2CAddress:0x%04x", (WORD)TVTunerI2CAddress);
	#endif

	#if TVTunerDevice==TVAVA
	WriteI2C(0x86, 0x00, 0x30);
	WriteI2C(0x86, 0x01, 0x10);		//Set NTSC audio
	WriteI2C(0x86, 0x02, 0x0c);		//Set NTSC Video
	#endif

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

}



void ResetTVValue(void)
{

}

#endif	//defined( PAL_TV ) && defined(SUPPORT_TV) 

⌨️ 快捷键说明

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