📄 paltuner.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 + -