📄 tv_tuner.c
字号:
#include "TV_tuner.h"
#include "Inter.h"
#include "Libr.h"
#include "St72321.h"
#include "IOport.h"
#include "Sys_config.h"
#include "System_operation.h"
#include "I2c_drv.h"
#include "OSD.h"
unsigned long TVpllPCfreq = VLF_MIN_FPC;
unsigned char TVchannelNum = 1;
unsigned char TV_tuner_flag;
unsigned char TV_fromat = TV_PAL_I;
unsigned long TV_frequence_list[50] = {VLF_MIN_FPC};
void TV_changer_freq(void);
void TV_adjust_divider(unsigned long PCfreq);
static unsigned char TV_station_detect(void);
void TV_autosearch(void);
static void TV_stepsearch(void);
void TVTUNER_init(void);
void TV_search_key_process(void);
void TV_change_format(void);
/************************************************************
Function:The frequecne adding 625 or dec 625
************************************************************/
void TV_changer_freq(void)
{
if(ValBit(System_flag,bSearchDir))
{
TVpllPCfreq += TV_STEP_SIZE;
if(TVpllPCfreq == (VLF_MAX_FPC + TV_STEP_SIZE))
TVpllPCfreq = VHF_MIN_FPC;
if(TVpllPCfreq == (VHF_MAX_FPC + TV_STEP_SIZE))
TVpllPCfreq = UHF_MIN_FPC;
}
else
{
TVpllPCfreq -= TV_STEP_SIZE;
if(TVpllPCfreq == (UHF_MIN_FPC - TV_STEP_SIZE))
TVpllPCfreq = VHF_MAX_FPC;
if(TVpllPCfreq == (VHF_MIN_FPC - TV_STEP_SIZE))
TVpllPCfreq = VLF_MAX_FPC;
}
TV_frequence_list[TVchannelNum -1] = TVpllPCfreq;
}
/************************************************************
Function:Send the frequence and the band to the tuner
************************************************************/
void TV_adjust_divider(unsigned long PCfreq)
{
unsigned char Temp_data[4] ={0};
unsigned short int PllDivider;
unsigned char TVband;
if((PCfreq <= VLF_MAX_FPC) && (PCfreq >= VLF_MIN_FPC))
TVband = VLF_BAND;
if((PCfreq >= VHF_MIN_FPC) && (PCfreq <= VHF_MAX_FPC))
TVband = VHF_BAND;
if((PCfreq >= UHF_MIN_FPC) && (PCfreq <= UHF_MAX_FPC))
TVband = UHF_BAND;
PllDivider = (unsigned short int)((PCfreq + 389000) * 16 /10000);//62.5khz
if(ValBit(System_flag,bSearchDir))
{
Temp_data[0] = HIBYTE(PllDivider);
Temp_data[1] = LOBYTE(PllDivider);
Temp_data[2] = CONTROL_BYTE;
Temp_data[3] = TVband;
}
else
{
Temp_data[0] = CONTROL_BYTE;
Temp_data[1] = TVband;
Temp_data[2] = HIBYTE(PllDivider);
Temp_data[3] = LOBYTE(PllDivider);
}
I2CWrite_nBytes(TV_TUNER_ADDR, Temp_data, 4);
}
/********************************************************
Function:Check than the frequence have signal or not
********************************************************/
static unsigned char TV_station_detect(void)
{
unsigned char TVlockOK;
unsigned char tuner_status = 0;
tuner_status = I2CReadByte_no_sub(TV_TUNER_ADDR);
asm nop;
asm nop;
if((tuner_status == 0x7c) && (!((TVpllPCfreq + 2500) % 5000)) && ValBit(PF_DR,VIDEO_ID))
{
if(TVchannelNum == 1)
TVlockOK = 1;
else
{
if(TVpllPCfreq - TV_frequence_list[TVchannelNum -2] >20000)
TVlockOK = 1;
else
TVlockOK = 0;
}
}
else
TVlockOK = 0;
return TVlockOK;
}
/*************************************************************
Function:All frequence search,start from 482500 to 8552500
*************************************************************/
void TV_autosearch(void)
{
if(System_mode != TV_mode)
return;
if(ValBit(TV_tuner_flag,TVsearchOK)) /*If search successly then return*/
return;
TV_changer_freq(); /*Adding frequence 625 or dec frequence 625*/
if((TVpllPCfreq + 2500) % 5000)
return;
if(TVpllPCfreq > UHF_MAX_FPC || TVpllPCfreq < VLF_MIN_FPC)
{
SetBit(TV_tuner_flag,TVsearchOK);
ClrBit(PE_DR,TV_MUTE);
TVchannelNum = 1;
TVpllPCfreq = TV_frequence_list[TVchannelNum -1];
if(TVpllPCfreq > UHF_MAX_FPC || TVpllPCfreq < VLF_MIN_FPC)
TVpllPCfreq = VLF_MIN_FPC;
TV_adjust_divider(TVpllPCfreq);
System_mute_off();
return;
}
TV_adjust_divider(TVpllPCfreq);
WAIT_10ms();
WAIT_10ms();
if(TV_station_detect())
{
TV_frequence_list[TVchannelNum -1] = TVpllPCfreq + 5000;
TVchannelNum++;
if(TVchannelNum > 50)
{
TVchannelNum = 1;
TVpllPCfreq = TV_frequence_list[TVchannelNum -1];
if(TVpllPCfreq > UHF_MAX_FPC || TVpllPCfreq < VLF_MIN_FPC)
TVpllPCfreq = VLF_MIN_FPC;
TV_adjust_divider(TVpllPCfreq);
SetBit(TV_tuner_flag,TVsearchOK);
System_mute_off();
}
}
}
/************************************************************
Function:Search step by step,one step id 625
************************************************************/
static void TV_stepsearch(void)
{
TV_changer_freq();
if(TVpllPCfreq > UHF_MAX_FPC)
TVpllPCfreq = VLF_MIN_FPC;
if(TVpllPCfreq < VLF_MIN_FPC)
TVpllPCfreq = UHF_MAX_FPC;
TV_adjust_divider(TVpllPCfreq);
}
/*************************************************************
Function:Init the TV tuner
*************************************************************/
void TVTUNER_init(void)
{
unsigned char Temp_data[3] ={0};
#ifdef TNJ_3321_UF
Temp_data[0] = TV_B_DATA;
Temp_data[1] = TV_C_DATA;
if(TV_fromat == TV_PAL_BG)
Temp_data[2] = TV_PAL_BG_DATA;
if(TV_fromat == TV_PAL_I)
Temp_data[2] = TV_PAL_I_DATA;
if(TV_fromat == TV_PAL_DK)
Temp_data[2] = TV_PAL_DK_DATA;
if(TV_fromat == TV_NTSC_MN)
Temp_data[2] = TV_NTSC_MN_DATA;
#endif
#ifdef TNJ_8355_QF
if(TV_fromat == TV_PAL_BG ||TV_fromat == TV_PAL_I ||TV_fromat == TV_PAL_DK)
{
Temp_data[0] = 0x56;
Temp_data[1] = 0x70;
}
switch(TV_fromat)
{
case TV_PAL_BG:
Temp_data[2] = 0x09;
break;
case TV_PAL_I:
Temp_data[2] = 0x0a;
break;
case TV_PAL_DK:
Temp_data[2] = 0x0b;
break;
case TV_NTSC_MN:
Temp_data[0] = 0x16;
Temp_data[1] = 0x30;
Temp_data[2] = 0x08;
break;
case TV_C_L:
Temp_data[0] = 0x16;
Temp_data[1] = 0x50;
Temp_data[2] = 0x4b;
break;
case TV_C_L_L:
Temp_data[0] = 0xc6;
Temp_data[1] = 0x50;
Temp_data[2] = 0x53;
break;
}
#endif
I2C_write_sub(TV_SUB_ADDR, TV_DATA_ADDR, Temp_data, 3);
TVpllPCfreq = TV_frequence_list[TVchannelNum -1];
if(TVpllPCfreq > UHF_MAX_FPC || TVpllPCfreq < VLF_MIN_FPC)
TVpllPCfreq = VLF_MIN_FPC;
TV_adjust_divider(TVpllPCfreq);
}
void TV_search_key_process(void)
{
if(ValBit(TV_tuner_flag,TVsearchOK))
{
System_mute_on();
TVchannelNum = 1;
SetBit(System_flag,bSearchDir); //From the min to the max
TVpllPCfreq = VLF_MIN_FPC;
TV_adjust_divider(TVpllPCfreq);
ClrBit(TV_tuner_flag,TVsearchOK);
}
else
{
SetBit(TV_tuner_flag,TVsearchOK);
System_mute_off();
}
}
void TV_change_format(void)
{
TV_fromat++;
#ifdef TNJ_3321_UF
if(TV_fromat > TV_NTSC_MN)
TV_fromat = TV_PAL_BG;
#endif
#ifdef TNJ_8355_QF
if(TV_fromat > TV_C_L_L)
TV_fromat = TV_PAL_BG;
#endif
TVTUNER_init();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -