📄 devtuner.c
字号:
/******************************************************************************
Copyright (c) 2005 MStar Semiconductor, Inc.
All rights reserved.
[Module Name]: DevTuner.c
[Date]: 30-JUN-2004
[Comment]:
TV tuner subroutines.
[Reversion History]:
*******************************************************************************/
#define _DEVTUNER_C_
#include "types.h"
#include "global.h"
#if TV_ENABLE
#include "DevTuner.h"
#include "i2c.h"
#include "misc.h"
#include "DEBUG.h"
#include "tv.h"
#include "devvd.h"
#include "msVD.h"
#include "panel.h"
#include "mstar.h"
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void DevTunerWrite(WORD wFreq)
{
#if (TUNER_TYPE==TUNER_XUGUANG_VFT_5A_118)
BYTE controltemp;
#endif
g_bTunerParm.ProgDivide = wFreq+(WORD)(TN_FREQ_IF*1000)/TN_FREQ_SS;
if( wFreq < TN_LOWBAND_END ) // low bank
g_bTunerParm.ControlInfo2 = TN_LOW_BAND;
else if( wFreq < TN_MIDBAND_END) // middle band
g_bTunerParm.ControlInfo2 = TN_MID_BAND;
else
g_bTunerParm.ControlInfo2 = TN_HIGH_BAND;
//printf("\r\nwFreq = %x", wFreq);
//printf("\r\ng_TuneFreqIF = %x", g_TuneFreqIF);
#if (TUNER_TYPE==TUNER_XUGUANG_VFT_5A_118)
controltemp=g_bTunerParm->ControlInfo2;
controltemp&=0x3F;
switch((chData.ucChannelMisc&SoundSysMask)%TV_SOUND_NUMS)
{
case TV_SOUND_BG:
controltemp|=0x80;
break;
case TV_SOUND_I:
controltemp|=0x40;
break;
case TV_SOUND_M:
case TV_SOUND_DK:
default:
controltemp|=0xC0;
break;
}
g_bTunerParm.ControlInfo2=controltemp;
#endif
i2c_AccessStart(TN_PROG_I2C_ADDR, I2C_WRITE);
i2c_SendByte(g_bTunerParm.ProgDivide>>8);
Delay1ms(1);
i2c_SendByte(g_bTunerParm.ProgDivide&0xff);
Delay1ms(1);
i2c_SendByte(TN_CTL_BYTE);
Delay1ms(1);
i2c_SendByte(g_bTunerParm.ControlInfo2);
Delay1ms(1);
i2c_Stop();
}
#if TUNER_2IN1
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void devTunerSetChromaToPal(void)
{
i2cWriteByte(TN_IF_I2C_ADDR,TN_SWITCHING_SUBADDR,SwitchDataPAL);//0xd6);
i2cWriteByte(TN_IF_I2C_ADDR,TN_ADJUST_SUBADDR,AdjustDataPAL|g_VideoSetting.TunerAGC);//0x70);
}
void devTunerSetChromaToNtsc(void)
{
i2cWriteByte(TN_IF_I2C_ADDR,TN_SWITCHING_SUBADDR,SwitchDataNTSC);//0x16);
i2cWriteByte(TN_IF_I2C_ADDR,TN_ADJUST_SUBADDR,AdjustDataNTSC|g_VideoSetting.TunerAGC);//0x30);
}
void devTunerSetChromaToSECAM(void)
{
i2cWriteByte(TN_IF_I2C_ADDR,TN_SWITCHING_SUBADDR,SwitchDataSECAM);//0x16);
i2cWriteByte(TN_IF_I2C_ADDR,TN_ADJUST_SUBADDR,AdjustDataSECAM|g_VideoSetting.TunerAGC);//0x30);
}
BYTE devTunerGetStatus(BYTE ucLoopCount)
{
BYTE ucStatus; // tuner status
BYTE AfcWinCounter=0;
while(ucLoopCount--) // loop to detect
{
i2cBurstCurrentBytes(TN_IF_I2C_ADDR,&ucStatus,1);
if (ucStatus & TN_READ_AFCWIN) // check inside AFC Window
AfcWinCounter++;
if(AfcWinCounter>ucLoopCount/2)
break;
Delay1ms(1);
}
return ucStatus;
}
void devTunerSetSoundToPalBG(void)
{//devTunerSetChromaToPal();
i2cWriteByte(TN_IF_I2C_ADDR,TN_DATA_SUBADDR,SoundPALBG);
}
void devTunerSetSoundToPalI(void)
{//devTunerSetChromaToPal();
i2cWriteByte(TN_IF_I2C_ADDR,TN_DATA_SUBADDR,SoundPALI);
}
void devTunerSetSoundToPalDK(void)
{//devTunerSetChromaToPal();
i2cWriteByte(TN_IF_I2C_ADDR,TN_DATA_SUBADDR,SoundPALDK);
}
void devTunerSetSoundToNTSCMN(void)
{//devTunerSetChromaToNtsc();
i2cWriteByte(TN_IF_I2C_ADDR,TN_DATA_SUBADDR,SoundNTSC);
}
void devTunerSetSoundToSECAML(void)
{//devTunerSetChromaToSECAM();
i2cWriteByte(TN_IF_I2C_ADDR,TN_DATA_SUBADDR,SoundSECAML);
}
void devTunerSetAGCValue(value)
{
BYTE uctemp;
if (chData.ucChannelMisc==TV_SOUND_M)
uctemp=AdjustDataNTSC;
else
uctemp=AdjustDataPAL;
uctemp&=0xE0;
i2cWriteByte(TN_IF_I2C_ADDR,TN_ADJUST_SUBADDR,uctemp|value);
}
#else
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void devTunerSetSoundToPalBG(void)
{
BYTE tempvalue;
tempvalue=P4;
tempvalue&=0xFC;
tempvalue|=0x03;
P4=tempvalue;
}
void devTunerSetSoundToPalI(void)
{
BYTE tempvalue;
tempvalue=P4;
tempvalue&=0xFC;
tempvalue|=0x02;
P4=tempvalue;
}
void devTunerSetSoundToPalDK(void)
{
BYTE tempvalue;
tempvalue=P4;
tempvalue&=0xFC;
tempvalue|=0x01;
P4=tempvalue;
}
void devTunerSetSoundToNTSCMN(void)
{
P4&=0xFC;
}
#endif //TUNER_2IN1
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#define SlopeCount 1
BYTE devTunerAutoTuneFreq( WORD wOriFreq, WORD* pwResultFreq )
{
TnAutoDrctType cDirect; // +/- direct
char cOffset; // frequency offset
BYTE ucDummy; // loop dummy
BYTE ucBestAfc; // found best freq. flag
BYTE ucAbidanceCount;//identify personate channel
*pwResultFreq = wOriFreq; // intialize
cDirect = TN_AUTO_TGL;
cOffset = 0;
ucDummy = TN_SCAN_STEP+5; // initialize dummy
ucBestAfc = 0x07; // initialize AFC
ucAbidanceCount=0;
do
{
BYTE ucStatus; // status buffer
BYTE ucAFC; // AFC status
BYTE ucAfcDelta;
BYTE ucLastAfc;
DevTunerWrite( wOriFreq + cOffset); // setting parameteer
DrawScanProgress(wOriFreq + cOffset); //2006-8-21
//Delay1ms(30);
//SystemDelay_translate_To_Dsp_Processor(2);
ucStatus = devTunerGetStatus(10);
if((ucStatus & TN_READ_AFCWIN) == 0x00) // No signal
return TN_SCAN_ERR;
ucLastAfc=ucAFC;
ucAFC = (ucStatus & TN_READ_AFC) >> 1; // b4-b1
if (ucAFC < 0x08) // 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07
ucAfcDelta = ucAFC;
else //if(ucAFC >= 0x08) // 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d 0x0e, 0x0f
ucAfcDelta = ucAFC ^ 0x0f;
if (ucBestAfc > ucAfcDelta) // found better AFC
{
ucBestAfc = ucAfcDelta;
*pwResultFreq = wOriFreq + cOffset; // save freq.
}
// Setup the direction of search
if (cDirect == TN_AUTO_TGL)
{
if( ucAFC < 0x08 ) // 0x03, 0x04, 0x05, 0x06, 0x07
cDirect = TN_AUTO_PLS; // increase
else // 0x08, 0x09, 0x0a, 0x0b, 0x0c
cDirect = TN_AUTO_MNS; // decrease
}
if (cDirect == TN_AUTO_PLS) // increase
{
if( ucAFC >= 0x08 ) // over -
{
if (ucBestAfc <= 0x02) // 0x00, 0x01, 0x02 or 0x0d 0x0e, 0x0f
{
if(ucAbidanceCount>SlopeCount)//||ucBestAfc == 0x00)
goto succeed;
else
{
if(ucLastAfc>ucAFC)
ucAbidanceCount++;
else
ucAbidanceCount=0;
}
}
}
cOffset++;
}
if (cDirect == TN_AUTO_MNS) // decrease
{
if( ucAFC < 0x08 ) // over +
{
if (ucBestAfc <= 0x02) // 0x00, 0x01, 0x02 or 0x0d 0x0e, 0x0f
{
if(ucAbidanceCount>SlopeCount)//||ucBestAfc == 0x00)
goto succeed;
else
{
if(ucLastAfc<ucAFC)
ucAbidanceCount++;
else
ucAbidanceCount=0;
}
}
}
cOffset--;
}
} while(ucDummy--);
return TN_SCAN_ERR;
succeed:
DevTunerWrite( *pwResultFreq+STEPS_1M*2);
SystemDelay_translate_To_Dsp_Processor(1);
DevTunerWrite( *pwResultFreq); // setting parameteer
SystemDelay_translate_To_Dsp_Processor(1);
msVDReset();
SystemDelay_translate_To_Dsp_Processor(1);
if (!(msVDGetSyncStable(10,20)))
return TN_SCAN_ERR;
g_bSaveChannel = TRUE;
return TRUE; // find Channel
}
void devSetSWF(BYTE ColorSoundSystem)
{
BYTE tempchroamvalue;
BYTE tempsoundvalue;
tempchroamvalue=(((g_TVChSetting.TvCurChannelMisc&ColorSysMask)>>4)%CHROMA_NUMS);
tempsoundvalue=((ColorSoundSystem&SoundSysMask)%TV_SOUND_NUMS);
#if TV_SYSTEM==TV_NTSC
tempchroamvalue=CHROMA_NTSC;
ColorSoundSystem=TV_SOUND_M;
#endif
switch(tempchroamvalue)
{
case CHROMA_PAL:
if (tempsoundvalue==TV_SOUND_M||tempsoundvalue==TV_SOUND_N)
{
devTunerSetChromaToNtsc();
}
else
{
devTunerSetChromaToPal();
}
break;
case CHROMA_NTSC:
devTunerSetChromaToNtsc();
break;
case CHROMA_SECAM:
devTunerSetChromaToPal();
break;
case CHROMA_AUTO:
default:
devTunerSetChromaToPal();
break;
}
switch(tempsoundvalue)
{
case TV_SOUND_BG:
devTunerSetSoundToPalBG();
break;
case TV_SOUND_I:
devTunerSetSoundToPalI();
break;
case TV_SOUND_M:
case TV_SOUND_N:
if(tempchroamvalue==CHROMA_AUTO||tempchroamvalue==CHROMA_NTSC)
devTunerSetChromaToNtsc();
devTunerSetSoundToNTSCMN();
break;
case TV_SOUND_L:
if(tempchroamvalue==CHROMA_AUTO||tempchroamvalue==CHROMA_SECAM)
devTunerSetChromaToSECAM();
devTunerSetSoundToSECAML();
break;
default:
case TV_SOUND_DK:
devTunerSetSoundToPalDK();
break;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -