⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tv.c

📁 特纳公司tnf6535应用程序。主用desktop video tuner.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 *  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 + -