tv.c
来自「CS8955控制TV软件。用MCU做模拟电视的控制。」· C语言 代码 · 共 2,016 行 · 第 1/5 页
C
2,016 行
/******************************************************************************\
Project Version: MTKCARDVD()
********************************************************************************
Filename: Tv.c
Author: Alan Chan
Company: CoreTek/ACT Company
********************************************************************************
File Version: 1.01
File Created: July 2007
Compiled Using: keil uVision2 Version 2.23
********************************************************************************
Files Required:
********************************************************************************
File Description:
********************************************************************************
File History:
--------------------------------------------------------------------------------
Date Name Description
--------------------------------------------------------------------------------
Mar. 2007 Alan Chan File Created
\******************************************************************************/
#include "global.h"
#include "E2prom.h"
#include "irkey.h"
#include "Tv.h"
//#ifdef OPEN_PRINTF
extern void DRS232LogB(BYTE bV1, BYTE bV2, BYTE bV3, BYTE bV4); //26Aug08
extern void DRS232LogS(char *pcStr);
//#endif
#ifdef ENABLE_TV
sChannelList ReadTVChannel(BYTE ChInd)
{
sChannelList chlist;
ReadE2prom(TV_CH_START_POS+((ChInd-1)*TV_ONE_CH_SIZE),(BYTE *) &chlist,TV_ONE_CH_SIZE);
return(chlist);
}
void WriteTVChannel(BYTE ChInd,sChannelList sCh)
{
WriteE2prom(TV_CH_START_POS+((ChInd-1)*TV_ONE_CH_SIZE),(BYTE *) &sCh,TV_ONE_CH_SIZE);
}
void LoadTVData(void)
{
BYTE bTmp;
bTunerDeafultVal=(TV_TYPE_DEFAULT <<6)||(TV_SOUND_DEFAULT <<3) ||(TV_SYSTEM_DEFAULT); //0xd0; //test
fgTunerType=TV_TYPE_DEFAULT;
ReadE2prom(TV_TUNER_TYPE_POS, &bTmp, 1); //11Sep08
bTunerDeafultVal = bTmp; //11Sep08
fgTunerType=(bTunerDeafultVal & 0x40 )>>6;
// bTunerVal =0xc0; //11Sep08
// bTunerVal |= (bTunerDeafultVal & 0x3f); //11Sep08
// IF_SWITCH_DEFAUL=bTunerVal;
bTvCurrSound=(bTunerDeafultVal & 0x38 )>>3;
ReadE2prom(TV_TOTAL_CH_POS, &bTmp, 1);
bTvTotalCh = bTmp;
if (bTvTotalCh>TV_CH_MAX)
{
bTvTotalCh = 0;
WriteE2prom(TV_TOTAL_CH_POS, &bTvTotalCh, 1);
}
if(bTvTotalCh == 0)
{
bTvTotalCh = 0;
sTvCurrChannel.bSystem=(0xc0 |bTunerDeafultVal);//bTunerVal;//11Sep08 IF_SWITCH_DEFAUL; //13Aug08
bTvCurrSound=(sTvCurrChannel.bSystem & 0x38) >>3; //13Aug08
bTvCurrChIndex = 1; //01Sep08 0;
sTvCurrChannel.wFreq =VHF_LOW_BOT;
}
else
{
ReadE2prom(TV_LAST_CH_POS, &bTmp, 1);
bTvCurrChIndex = bTmp;
if((bTvCurrChIndex < 0x01)||(bTvCurrChIndex > TV_CH_MAX)) //29Aug08
{
bTvCurrChIndex=0x01;
WriteE2prom(TV_LAST_CH_POS, &bTvCurrChIndex, 1);
}
if (bTvCurrChIndex <= bTvTotalCh)
{
sTvCurrChannel = ReadTVChannel(bTvCurrChIndex);
if((sTvCurrChannel.bSystem & 0x07)> SV_PAL_N) //16Sep08
{
sTvCurrChannel.bSystem =(0xc0 |bTunerDeafultVal); //bTunerVal; //16Sep08
}
bTvCurrSound=(sTvCurrChannel.bSystem & 0x38) >>3;//17Jul08 sTvCurrChannel.bSound ;
}
else
{
sTvCurrChannel.wFreq =VHF_LOW_BOT;
sTvCurrChannel.bSystem=(0xc0 |bTunerDeafultVal);//bTunerVal; //11Sep08 IF_SWITCH_DEFAUL; //13Aug08
bTvCurrSound=(sTvCurrChannel.bSystem & 0x38) >>3; //13Aug08
bTvCurrChIndex = 1; //01Sep08 0;
WriteE2prom(TV_LAST_CH_POS, &bTvCurrChIndex, 1);
}
}
#ifdef SUPPORT_UART_PRINTF
DRS232LogS("Read E2prom OK.\n");
#endif
}
void LoadDefaultTVData(void)
{
bTvTotalCh = 0;
bTvCurrChIndex = 1; //01Sep08 0;
bTvCurrSound = TV_SOUND_DEFAULT; //martin 14May08
WriteE2prom(TV_TOTAL_CH_POS, &bTvTotalCh, 1);
WriteE2prom(TV_LAST_CH_POS, &bTvCurrChIndex, 1);
#ifdef MARTIN_SUPPORT_SHOW_TV_VERSION //31Jul08
fgTvVersion= TV_VERSION_VALUE; //31Jul08
WriteE2prom(TV_VERSION_POS, &fgTvVersion, 1);
#else
WriteE2prom(TV_LAST_CH_AUDIO_POS, &bTvCurrSound, 1);
#endif
}
BYTE bTV_ADC_Read(void)
{
BYTE bTmp;
IICSW_Read(0, I2C_TVADC_ADDR,0,0,&bTmp,1);
return bTmp;
}
BYTE bTV_IF_Read(void)
{
BYTE bTmp;
IICSW_Read(0, I2C_TVIF_ADDR,0,0,&bTmp,1);
return bTmp;
}
BYTE bTV_PLL_Read(void)
{
BYTE bTmp;
IICSW_Read(0, I2C_TVPLL_ADDR,0,0,&bTmp,1);
return bTmp;
}
void vTV_PLL_Write(BYTE *databuf)
{
IICSW_Write(0, I2C_TVPLL_ADDR,0,0,databuf,4);
}
void vTV_IF_Write(BYTE *databuf)
{
IICSW_Write(0, I2C_TVIF_ADDR,0,0,databuf,4);
}
/*
BYTE bBand()
{
if((_sTunerPLL.wDB>=VHF_LOW_BOT) && (_sTunerPLL.wDB<VHF_LOW_TOP))
return (VHF_LOW_BAND);
else if((_sTunerPLL.wDB>=VHF_HIGH_BOT) && (_sTunerPLL.wDB<VHF_HIGH_TOP))
return (VHF_HIGH_BAND);
else if((_sTunerPLL.wDB>=UHF_BOT) &&(_sTunerPLL.wDB <UHF_TOP))
return (UHF_BAND);
else
return (VHF_HIGH_BAND);
}
*/
#ifndef TUNER_USE_TNJ7355 //martin 14May08
void vTVTunerInit(void)
{
BYTE bData[4];
bData[0] = IF_RESERVED;
bData[1] = IF_SWITCH_PAL;
bData[2] = IF_ADJUST_DEFAUL;
if (bTvCurrSound==SV_DK) //TV_SOUND_DK
bData[3] = IF_DATA3;
else if (bTvCurrSound==SV_I) //TV_SOUND_I
bData[3] = IF_DATA2;
else
bData[3] = IF_DATA1;
vTV_IF_Write(bData);
}
#endif
// Init TV
void vInitTV(void)
{
#ifdef SUPPORT_UART_PRINTF
DRS232LogS("Init Tuner Start.\n");
#endif
Delay1ms(100);
mTVEnable();
Delay1ms(100);
#ifdef MARTIN_ADD_SEARCH_TUNER_MUTE
fgTVSearhMute=0; //05Aug08
#endif
if(bTvTotalCh)
{
_sTunerPLL.wDB = sTvCurrChannel.wFreq;
_sTunerPLL.bCB = TUNER_CB1;
_bSearchState = S_STATE_IDLE; //31Jul08 S_STATE_CHK_VIDEO;
_bSearchCnt = 0; //31Jul08 S_TV_VERIFY_TIME;
}
else
{
_sTunerPLL.wDB = VHF_LOW_BOT; //0x27db; ?????????? martin 12May08
sTvCurrChannel.wFreq = _sTunerPLL.wDB;
_sTunerPLL.bBB = TUNER_BB1;//TUNER_BB3; martin 14May08
sTvCurrChannel.bSystem=(0xc0 |bTunerDeafultVal);// bTunerVal; //11Seo08 IF_SWITCH_DEFAUL;
bTvCurrSound=TV_SOUND_DEFAULT;
_sTunerPLL.bCB = TUNER_CB1;
_bSearchState = S_STATE_IDLE; //13Aug08 S_STATE_CHK_VIDEO;
_bSearchCnt = 0; //13Aug08 S_TV_VERIFY_TIME;
}
_bSearchMode = SEARCH_IDLE;
fgAFCADJState=FREQUENCY_ADJ_IDLE; //13Aug08
#ifdef MARTIN_SUPPORT_SHOW_TV_VERSION
fgTvVersion= TV_VERSION_VALUE; //31Jul08
_bSearchPercent=fgTvVersion;
#else
_bSearchPercent=0x00; //01Jul08
#endif
// bDataUpdateEn=0; //04jun08
DataOutValid=0; //02Jun08
vTvSetCh(); //29Aug08
bTvLastChannel=bTvCurrChIndex; //07Oct08
#ifdef SUPPORT_UART_PRINTF
DRS232LogS("Init Tuner Ok.\n");
#endif
}
void vFreqSwitch(BIT dir) //martin 13May08
{
if(dir == UP_SEARCH)
{
if(fgTunerType == 0x01) //tuner:xf6a
{
if((_sTunerPLL.wDB>VHF_LOW_TOP_XF6A) && (_sTunerPLL.wDB<VHF_HIGH_BOT_XF6A))
{
_sTunerPLL.wDB =VHF_HIGH_BOT_XF6A;
}
else if((_sTunerPLL.wDB>VHF_HIGH_TOP_XF6A) && (_sTunerPLL.wDB<UHF_BOT_XF6A))
{
_sTunerPLL.wDB = UHF_BOT_XF6A;
}
}
else //tuner:TNJ7355
{
if((_sTunerPLL.wDB>VHF_LOW_TOP) && (_sTunerPLL.wDB<VHF_HIGH_BOT))
{
_sTunerPLL.wDB =VHF_HIGH_BOT;
}
else if((_sTunerPLL.wDB>VHF_HIGH_TOP) && (_sTunerPLL.wDB<UHF_BOT))
{
_sTunerPLL.wDB = UHF_BOT;
}
}
}
else //DOWN SEARCH
{
if(fgTunerType == TV_TYPE_XF6A) //tuner:xf6a
{
if((_sTunerPLL.wDB>VHF_LOW_TOP_XF6A) && (_sTunerPLL.wDB<VHF_HIGH_BOT_XF6A))
{
_sTunerPLL.wDB =VHF_LOW_TOP_XF6A;
}
else if((_sTunerPLL.wDB>VHF_HIGH_TOP_XF6A) && (_sTunerPLL.wDB<UHF_BOT_XF6A))
{
_sTunerPLL.wDB = VHF_HIGH_TOP_XF6A;
}
}
else //tuner:TNJ7355
{
if((_sTunerPLL.wDB>VHF_LOW_TOP) && (_sTunerPLL.wDB<VHF_HIGH_BOT))
{
_sTunerPLL.wDB =VHF_LOW_TOP;
}
else if((_sTunerPLL.wDB>VHF_HIGH_TOP) && (_sTunerPLL.wDB<UHF_BOT))
{
_sTunerPLL.wDB = VHF_HIGH_TOP;
}
}
}
}
void vBandFreSet(void) //martin 13May08
{
if(fgTunerType == TV_TYPE_XF6A) //16Sep08
{
if((_sTunerPLL.wDB<VHF_LOW_BOT_XF6A) || (_sTunerPLL.wDB>UHF_TOP_XF6A))
{
_sTunerPLL.wDB=VHF_LOW_BOT_XF6A;
sTvCurrChannel.wFreq = _sTunerPLL.wDB; //28Aug08
}
if((_sTunerPLL.wDB>=VHF_LOW_BOT_XF6A) && (_sTunerPLL.wDB<=VHF_LOW_TOP_XF6A))
{
_sTunerPLL.bBB = TUNER_BB1;
}
else if((_sTunerPLL.wDB>=VHF_HIGH_BOT_XF6A) && (_sTunerPLL.wDB<=VHF_HIGH_TOP_XF6A))
{
_sTunerPLL.bBB = TUNER_BB2;
}
else if((_sTunerPLL.wDB>=UHF_BOT_XF6A) &&(_sTunerPLL.wDB <=UHF_TOP_XF6A))
{
_sTunerPLL.bBB = TUNER_BB3_XF6A;
}
}
else
{
if((_sTunerPLL.wDB<VHF_LOW_BOT) || (_sTunerPLL.wDB>UHF_TOP))
{
_sTunerPLL.wDB=VHF_LOW_BOT;
sTvCurrChannel.wFreq = _sTunerPLL.wDB; //29Aug08
}
if((_sTunerPLL.wDB>=VHF_LOW_BOT) && (_sTunerPLL.wDB<=VHF_LOW_TOP))
{
_sTunerPLL.bBB = TUNER_BB1;
}
else if((_sTunerPLL.wDB>=VHF_HIGH_BOT) && (_sTunerPLL.wDB<=VHF_HIGH_TOP))
{
_sTunerPLL.bBB = TUNER_BB2;
}
else if((_sTunerPLL.wDB>=UHF_BOT) &&(_sTunerPLL.wDB <=UHF_TOP))
{
_sTunerPLL.bBB = TUNER_BB3;
}
}
}
void vTvSearchSetFre(void) //martin 08Jun08 add
{
BYTE bData[4];
vBandFreSet();
//29Aug08 return 1;
#ifdef MARTIN_TEST_TV_IIC //29May08 test
bData[0] = 0x1f; //frequency: 471.25M
bData[1] = 0xe2;
bData[2] = TUNER_CB1;
bData[2] = 0xce;
bData[3] = 0x04;
#else
bData[0] = (_sTunerPLL.wDB >>8) & 0xff;
bData[1] = _sTunerPLL.wDB ;
// bData[2] = TUNER_CB1;
bData[2] = _sTunerPLL.bCB;
bData[3] = _sTunerPLL.bBB;
#endif
vTV_PLL_Write(bData);
//29Aug08 return 0;
}
BOOL vTvSetCh(void)
{
BYTE bData[4];
BYTE bTempSystem; // ,bTempSound;
bTempSystem=(sTvCurrChannel.bSystem & 0x07);
// bTempSound=(sTvCurrChannel.bSystem & 0x38)>>3;
vBandFreSet();
#ifdef MARTIN_TEST_TV_IIC //29May08 test
bData[0] = 0x1f;
bData[1] = 0xe2;
bData[2] = TUNER_CB1;
bData[2] = 0xce;
bData[3] = 0x04;
#else
bData[0] = (_sTunerPLL.wDB >>8) & 0xff;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?