📄 tuner.c
字号:
#include "reg51.h"
#include "TW803Reg.h"
#include "System.h"
#include "OSDCtrl.h"
#include "TwoWire.h"
#include "OSDDraw.h"
#include "NVRam.h"
#include "Remote.h"
#include "Keypad.h"
#include "Tuner.h"
#include "Freq_Table.h"
#define __GLOBAL_H__
#include "Global.h"
#ifdef TV
tTV_Freq* ttTV_Freq;
tTV_Code* TV_Code;
//unsigned long idata press_counter;
/* --------------------------------------------------------------------------
Function : Tuner_CalChannel
Prupose : Calculate channel frequency
Arguments : -- -- --
Returns : -- -- --
External : -- -- --
Notes :
-------------------------------------------------------------------------- */
uDWORD Tuner_CalChannelFreq(uCHAR ChNum)
{
BYTE lbChCount = 0;
BYTE lbChDiff = 0;
uDWORD ChFreq;
TV_Code = ttTV_Code[EepTV.cCountry];
ttTV_Freq = TV_Code[EepTV.cMode].TV_Freq;
//------- Search channel frequency according to channel number
do {
ChFreq = CH_Freq(lbChCount);//lbChCount);
lbChDiff = ChNum - CH_NO(lbChCount);
if ( ++lbChCount >= CH_TYPE_TOTAL )
{
--lbChCount;
break;
}
}while ( ChNum >= CH_NO(lbChCount) );
//------- Calculate offset channel frequency
if(lbChDiff)
ChFreq += (uDWORD)( CH_BANDWIDTH(lbChCount) ) * (uDWORD)lbChDiff * 100; //unit, 10KHZ
return ChFreq;
}
/* A U T O M E M O R Y */
/*-------------------------------------------------------------------------
-------------------------------------------------------------------------*/
void AutoMemory(uCHAR Adj)
{
uCHAR i;
uDWORD dTVFreq;
uDWORD rTVFreq;
sCHAR cStep;
uCHAR cTVNum=0;
uCHAR cTV_Max,cTV_Min;
uCHAR origalChanel;
Adj = 0;
origalChanel = EepTV.cChannelNum;
TV_Code = ttTV_Code[EepTV.cCountry];
cTV_Max = TV_Code[EepTV.cMode].CHEnd;
cTV_Min = TV_Code[EepTV.cMode].CHStart;
I2CWriteByte(TW803_P0,0xc2,0x00);
ir_data=0;
/*-------------------------------------------------------------------------
20060812
-------------------------------------------------------------------------*/
#ifdef lucy_edition
skipon=0;
OpenPanel(); //lucy for tuner
#endif
/*-------------------------------------------------------------------------
20060812
-------------------------------------------------------------------------*/
for (i=0; i<cTV_Min; i++)
{
EEPSaveTVChannel(2*i, 0x00); //set these channel as skip channel
EEPSaveTVChannel(2*i+1, 0x80); //
}
for (i=0; i<=FAVORITE_NO; i++) //reset the favorite channel
{
I2CWriteByte(EEPGLOBAL_BLOCK, EEPFAV_OFFSET+i ,0x00);
EepFav.cFav_list[i]=0x00;
twdDelay(5);
}
for(i=cTV_Min; i<=cTV_Max; i++)
{
if(ir_data!=0)
break;
//////////////These Three functions should define in Tuner_xxx.c
//------- Set tuner channel
dTVFreq = Tuner_CalChannelFreq(i); // Calculate channel default freqency and driver
Tuner_WriteFreq(dTVFreq); // Set Freqency, the unit is 10KHz and not yet add intermediate freq.
rTVFreq = Tuner_AFC_Control(dTVFreq); // Run AFC control to fine-tune channel , unit 10KHZ
if (rTVFreq && rTVFreq != dTVFreq){
cStep = (rTVFreq - dTVFreq)/ADCRatio;
}else{
cStep = 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////
if( rTVFreq != 0)
OSDDrawNum(i, 0, 19, m_cItem, COL_NORMAL, LBLUE_RED|0x03);
else
OSDDrawNum(i, 0, 19, m_cItem, COL_TITLE, LBLUE_RED|0x03);
if( rTVFreq )
{
twdDelay(400);
if ( ( I2CReadByte(TW803_P2,0x3A) & 0x06 ) == 0x06 ){
EEPSaveTVChannel(2*i, cStep);//wTVFreq);
EEPSaveTVChannel(2*i+1, 0x00); //skip channel or not
cTVNum++;
}else{
EEPSaveTVChannel(2*i, 0x00); //skip channel or not
EEPSaveTVChannel(2*i+1, 0x80); //skip channel or not
}
}else{
EEPSaveTVChannel(2*i, 0x00); //skip channel or not
EEPSaveTVChannel(2*i+1, 0x80); //skip channel or not
}
}
dTVFreq = Tuner_CalChannelFreq(origalChanel); // Calculate channel default freqency and driver
OSDExit();
OSDClearPage();
OSDPosition(RIGHT_TOP);
OSDDrawNum(origalChanel, 0, 19, 2, COL_TITLE, LBLUE_RED|0x03);
OSDEnable();
Tuner_WriteFreq(dTVFreq); // Set Freqency, the unit is 10KHz and not yet add intermediate freq.
// gfTV_Force_Mute = 0;
}
//BOOL ChannelSel(BYTE Ch_No)
BOOL ChannelSel(void)
{
#ifdef lucy_edition
uWORD wTVFreq;
wTVFreq = Tuner_CalChannelFreq(Ch_No);
Tuner_WriteFreq(wTVFreq);
#else
uDWORD dTVFreq;
dTVFreq = TVEEPGetChFreq();
Tuner_WriteFreq(dTVFreq);
twdDelay(5);
I2CWriteByte(EEPGLOBAL_BLOCK , EEPTV_OFFSET+ TV_cChannelNum,EepTV.cChannelNum); //ruby
twdDelay(5);
I2CWriteByte(EEPGLOBAL_BLOCK , EEPTV_OFFSET+TV_ChanelIndex,0x00);
twdDelay(5);
return SUCCESS;
#endif
}
//=======================================================================
//kenny 950112
//uWORD TVEEPGetChFreq(uCHAR cNum)
#if 0
uWORD TVEEPGetChFreq(void)
{
uWORD wFreq;
if(EepTV.cMode)
{
wFreq = I2CReadByte(EEPTVAIR_BLOCK,EepTV.cChannelNum);
}
else
{
wFreq = I2CReadByte(EEPTVCABLE_BLOCK, EepTV.cChannelNum);
}
twdDelay(NVRDELAY);
return wFreq;
}
#endif
//=======================================================================
/* ---------------------------------------------------------------------------------
Function : TVEEPGetChFreq
Prupose : Caculate freqency of channel EepTV.cChannelNum by
(default channel frequency + Delta frequency) (10KHZ)
Notes :
------------------------------------------------------------------------------------- */
uDWORD TVEEPGetChFreq(void)
{
sCHAR sDeltaFreq;
uDWORD dFreq;
if(EepTV.cMode)
{
// wDeltaFreq = I2CReadByte(EEPTVAIR_BLOCK,EepTV.cChannelNum)*ADCRatio;
sDeltaFreq = I2CReadByte(EEPTVCABLE_BLOCK, 2*EepTV.cChannelNum); //
}
else
{
// wDeltaFreq = I2CReadByte(EEPTVCABLE_BLOCK, EepTV.cChannelNum)*ADCRatio; // unit (KHZ/100)
sDeltaFreq = I2CReadByte(EEPTVAIR_BLOCK,2*EepTV.cChannelNum);
}
twdDelay(NVRDELAY);
dFreq = Tuner_CalChannelFreq(EepTV.cChannelNum); //unit ,10KHZ, default channel frequency
dFreq += (sDWORD)(sDeltaFreq*ADCRatio); //unit ,10KHZ
return dFreq;
}
#ifdef lucy_edition
void ResetTVChannel(void)
{
uCHAR i;
uWORD wTVFreq;
uCHAR cTV_Max,cTV_Min;
//lucy for tuner
OSDResetVideoData();
OSDSetVideoValues();
EEPSaveVideoData();
m_bAir_Cable = 0;
cTV_Max = ttTV_Code[m_bAir_Cable].CHEnd;
cTV_Min = ttTV_Code[m_bAir_Cable].CHStart;
//m_bAir_Cable = 0;
for( i=cTV_Min; i<cTV_Max; i++)
{
wTVFreq = Tuner_CalChannelFreq(i); // Calculate channel freqency and driver
EEPSaveTVChannel(i, wTVFreq);
}
i = I2CReadByte(EEPVIDEOBLOCK, idVIDEO_FLAG_INDEX);
i |= 0x01;
I2CWriteByte(EEPVIDEOBLOCK, idVIDEO_FLAG_INDEX,i);
twdDelay(NVRDELAY);
}
#endif
#endif // end of [#ifdef TV]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -