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 + -
显示快捷键?