📄 tv.c
字号:
/*
* tuner.c
*
* Originated from:Gorden,Ding;Jenny
* Modified by: Zoucf
*
* Nov,2005
* Copyright (c) TENASMicro(SHENZHEN),Inc.
* All rights reserved.
*/
#define XFR_TYPE XFR_DECLARATION
#define VAR_TYPE VAR_DECLARATION
#include "include.h"
#define STEP_50KHZ 1
#define STEP_62KHZ 2
#define MIDLE_38_875MHZ 0
#define MIDLE_38MHZ 1
#if (TUNER_VENDOR == TENA8532_TUNER || TUNER_VENDOR == XIMEI_TUNER)
#define TUNER_STEP STEP_50KHZ
#define TUNER_MIDLE MIDLE_38_875MHZ
#elif(TUNER_VENDOR == TENA9535_TUNER)
#define TUNER_STEP STEP_50KHZ
#define TUNER_MIDLE MIDLE_38_875MHZ
#elif (TUNER_VENDOR == TENA8022_TUNER)
#define TUNER_STEP STEP_50KHZ
#define TUNER_MIDLE MIDLE_38_875MHZ
#endif
/*
* 62.5K = 1MHz / 16
* 50K = 1MHz / 20
*
* ( RealFreq + MidleFreq ) = ( Divider * Steps );
*
* RealFreq = ( Divider * Steps ) - MidleFreq ;
*
*/
void PrintFreq(UBYTE x,UBYTE y,UBYTE attr)
{
#if TUNER_STEP == STEP_62KHZ
UBYTE tmp;
UWORD div,mod;
UWORD freq ;
#if TUNER_MIDLE == MIDLE_38_875MHZ
freq = gTuner.Divider.Word - 0x26e ; // 38.875MHz * 16
#endif
#if TUNER_MIDLE == MIDLE_38MHZ
freq = gTuner.Divider.Word - 0x260 ; // 38MHz * 16
#endif
div = freq / 16 ; //xxxMHz
mod = freq % 16 ; //.xxxMHz
mod *= 625;
PrintWord(x,y,div,attr);
if( div > 1000)
tmp = 4;
else if ( div > 100)
tmp = 3;
else if ( div > 10)
tmp = 2;
else
tmp = 1;
PrintIcon(x + tmp, y,'.',attr);
PrintWord(x + tmp + 1,y,mod,attr);
PrintString(x+tmp+3,y,"MHz",attr);
return;
#elif TUNER_STEP == STEP_50KHZ
UBYTE tmp,mod;
UWORD div;
UWORD freq;
#if TUNER_MIDLE == MIDLE_38_875MHZ
freq = gTuner.Divider.Word - 0x30a;// 38.9MHz * 20
#endif
#if TUNER_MIDLE == MIDLE_38MHZ
freq = gTuner.Divider.Word - 0x2f8;// 38MHz * 20
#endif
div = freq / 20 ; //xxxMHz
mod = freq % 20 ; //.xxxMHz
mod *= 5;
x = PrintWord(x,y,div,attr);
PrintIcon( x, y,'.',attr);
for( tmp = 2; tmp > 0; tmp--)
{
PrintIcon( x + tmp , y, ( mod % 10 ) + 0x30 ,attr);
mod = mod / 10;
}
PrintString( x + 3, y,"MHz",attr);
return;
#endif
}
/*===========================================================================*
*= Name : Adjust Tuner Divider Data and Band. =*
*= Function: =*
*= Input : NONE =*
*= Output : NONE =*
*= =*
*= Originated from:Gorden Ding =*
*= Modified by: Zoucf =*
*= Nov,2005 =*
*===========================================================================*/
typedef struct
{
UWORD max;
UWORD min;
UBYTE band;
}BAND_DEF;
code BAND_DEF BAND_TAB[3] =
{
{C_VHFL_MAX, C_VHFL_MIN, BAND_VHFL },
{C_VHFH_MAX, C_VHFH_MIN, BAND_VHFH },
{C_UHF_MAX, C_UHF_MIN, BAND_UHF }
};
#define bTunerUp bCommFlag
void TunerAdjust(UBYTE step)
{
UBYTE i;
if( bTunerUp )
gTuner.Divider.Word += ((UWORD) step);
else
gTuner.Divider.Word -= ((UWORD) step);
for( i = 0 ; i < 3; i++)
{
// lower below min
if( gTuner.Divider.Word < BAND_TAB[i].min )
{
if( i == 0 )
{
gTuner.Divider.Word = BAND_TAB[0].min;
g08BandSys = BAND_TAB[0].band;
break;
}
else
{
if( gTuner.Divider.Word > BAND_TAB[i-1].max )//>
{
if( bTunerUp )
{
gTuner.Divider.Word = BAND_TAB[i].min;
g08BandSys = BAND_TAB[i].band;
}
else
{
gTuner.Divider.Word = BAND_TAB[i-1].max;
g08BandSys = BAND_TAB[i-1].band;
}
break;
}
}
}
else if( gTuner.Divider.Word > BAND_TAB[i].max )// greater than max
{
if( i == 2)
{
gTuner.Divider.Word = BAND_TAB[2].max;
g08BandSys = BAND_TAB[2].band;
break;
}
else
{
if( gTuner.Divider.Word < BAND_TAB[i+1].min )
{
if( bTunerUp )
{
gTuner.Divider.Word = BAND_TAB[i + 1].min;
g08BandSys = BAND_TAB[i + 1].band;
}
else
{
gTuner.Divider.Word = BAND_TAB[i].max;
g08BandSys = BAND_TAB[i].band;
}
break;
}
}
}
//between normal area.
if( (gTuner.Divider.Word >= BAND_TAB[i].min) && (gTuner.Divider.Word <= BAND_TAB[i].max) )
{
g08BandSys = BAND_TAB[i].band;
break;
}
}
bChgTuner = TRUE;
}
/*===========================================================================*
*= Name : Refresh the Tuner Data and Sound system. =*
*= Function: =*
*= Input : NONE =*
*= Output : NONE =*
*= =*
*= Originated from:Jenny;Gorden,Ding; =*
*= Modified by: Zoucf =*
*= Nov,2005 =*
*===========================================================================*/
#if TUNER_VENDOR == XIMEI_TUNER
void RefreshTuner(void)
{
UBYTE BandSwitch,SoundSwitch;
if(gTuner.SoundSys < SND_I) SoundSwitch = 0x09;
else SoundSwitch = 0x01;
switch(g08BandSys)
{
case(BAND_VHFL):
BandSwitch = 0xa0 + SoundSwitch;
break;
case(BAND_VHFH):
BandSwitch = 0x90 + SoundSwitch;
break;
case(BAND_UHF):
BandSwitch = 0x30 + SoundSwitch;
break;
}
IIC_Dev_Start();
IIC_Dev_SendByte( IIC_TUNER_ID ) ;
IIC_Dev_SendByte( gTuner.Divider.Word / 256 ) ;
IIC_Dev_SendByte( gTuner.Divider.Word % 256 ) ;
IIC_Dev_SendByte( 0x88 ) ;
IIC_Dev_SendByte( BandSwitch ) ;
IIC_Dev_Stop();
return;
}
#endif
#if ( TUNER_VENDOR == TENA8532_TUNER || TUNER_VENDOR == TENA9535_TUNER \
|| TUNER_VENDOR == TENA8022_TUNER)
code UBYTE BAND_INDEX[] =
{// BAND_VHFL BAND_VHFH BAND_UHF
0x01, 0x02, 0x08
};
void RefreshTuner(void)
{
IIC_Dev_Start();
IIC_Dev_SendByte( IIC_TUNER_ID ) ;
IIC_Dev_SendByte( gTuner.Divider.Word / 256 ) ;
IIC_Dev_SendByte( gTuner.Divider.Word % 256 ) ;
IIC_Dev_SendByte( 0x88 ) ;
IIC_Dev_SendByte( BAND_INDEX[g08BandSys]);
IIC_Dev_Stop();
return;
}
#endif
/*===========================================================================*
*= Name : Load Current Tuner divider from Current Channel Index. =*
*= Function: =*
*= Input : NONE =*
*= Output : NONE =*
*= =*
*= Originated from:Gorden,Ding =*
*= Modified by: Zoucf =*
*= =*
*= Nov,2005 =*
*===========================================================================*/
void LoadTuner(void)
{
g08ChlHardPos = UserEEPROMReadByte(EE_CHLINFO + gChlIndex.Cur );
LoadPhysicalTuner();
ReadCurSkip();
g08ChlChgTime = TUNER_SOFTDELAY_TIME;
return;
}
/*===========================================================================*
*= Name : LoadPhysicalTuner =*
*= Function: Load Physical Tuner Data from EEPRom =*
*= Input : =*
*= ChlHardPos -> Channel Physical Position =*
*= =*
*= Output : New Tuner Data. =*
*= =*
*= Originated from:Gorden,Ding =*
*= Modified by: Zoucf =*
*= =*
*= Nov,2005 =*
*===========================================================================*/
void LoadPhysicalTuner(void)
{
if( !bAudioMute )
{
AudioMute(TRUE);
}
// if( !bMultiScan )
{
SET_PICTURE_STILL();
TimeDlyX10ms(2);
}
UserEEPROMReadBlock(EE_CHLDATA + g08ChlHardPos * sizeof(TUNER), sizeof(TUNER),(UBYTE *)&gTuner);
TunerAdjust( 0 );
gTuner.SoundSys &= 0x03 ;
if( gTuner.SoundSys > SNDSYS_MAX)
gTuner.SoundSys = SND_DK;
gTuner.ColorSys &= 0x03 ;
if( gTuner.ColorSys > COLOR_MAX )
gTuner.ColorSys = COLOR_AUTO;
g08ChlChgTime = TUNER_HARDDELAY_TIME ;
bChgTuner = TRUE;
return;
}
void SaveMaxSkip(void)
{
register UBYTE i,skp;
i = 0 ;
do {
UserEEPROMWriteByte(EE_CHLINFO + i, i );
i++;
}while( i != SAVE_MAX_CHANNEL_NUM );
for( i = 0 ; i < (gChlIndex.Max / 8); i++ )
{
UserEEPROMWriteByte(EE_CHLSKIP + i, 0x00);
}
gChlIndex.Cur = i;
skp = 0xff;
skp >>= ((gChlIndex.Max % 8) + 1) ;
UserEEPROMWriteByte(EE_CHLSKIP + gChlIndex.Cur, skp);
for( i = (gChlIndex.Cur +1); i < SAVE_MAX_CHANNEL_NUM/8 + 1; i++ )
{
UserEEPROMWriteByte(EE_CHLSKIP + i, 0xff);
}
return;
}
void SaveCurSkip(void)
{
UBYTE skip;
register UBYTE skp;
skp = 0x80 ;
skp >>= (gChlIndex.Cur % 8) ;
skip = UserEEPROMReadByte(EE_CHLSKIP + (gChlIndex.Cur / 8) );
if( g08SkipOnFlg == 0 )
skip &= ( ~skp ) ;
else
skip |= skp ;
UserEEPROMWriteByte(EE_CHLSKIP + (gChlIndex.Cur / 8), skip );
return ;
}
BOOLEAN ReadCurSkip(void)
{
UBYTE skip;
skip = UserEEPROMReadByte(EE_CHLSKIP + (gChlIndex.Cur / 8) );
skip <<= ( gChlIndex.Cur % 8);
if( (skip & 0x80) == 0x00 )
g08SkipOnFlg = 0;
else
g08SkipOnFlg = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -