📄 tea5757.c
字号:
/*
tea5757 tuner
*/
#include "common.h"
#include "mvd.h"
#include "rds.h"
#include "ioport.h"
#include "amp.h"
#include "amp_port.h"
#include "TEA5757.h"
#include "i2c_prom.h"
#include "romconst.h"
#include "i2cdrv.h"
#include "amp_const.h"
#define wait_timer(x) RISC_sleep_nsec(x)
static int RdsID = -1;
static uchar Identify_Code;
static uchar Block_Status;
static int prev_wcmd = 0;
int PI_Code;
int RDS_Minutes;
uchar TP_Bit;
uchar TA_Bit;
uchar Text_AB_Flag;
uchar MusicSpeech_Bit;
uchar Version_Bit;
uchar RDS_Data_NonRead;
uchar PTY_Code;
unsigned char tuner_mode = 0 ;
unsigned char PS[PS_BYTE];
unsigned char RdsServiceName[PS_BYTE];
unsigned char ServiceValidFlag=0;
unsigned char rds_timeout;
unsigned char pty_avail_flag=0;
unsigned char Rds_char_index[4];
unsigned char tuner_sensitive;
unsigned char tuner_preset_flag=0;
extern unsigned char tuner_program_timeout ;
extern unsigned char stereo_mono_flag ;
extern unsigned char memory_timeout;
#ifdef PHILIPS_GUI
extern unsigned char search_ante_flag;
#endif
/************* tea5757 parameter *************/
TUNER_PARA tuner_para[] =
{
//fm step 100k,am step 10k
{ /* mode usa */
0x22, /*fm-am SENSITIVITY*/
8750, /* fm para */
10800,
10, /*rocksun change it to be 100K*/
9710,
530, /* am para */
1710,
10,
610,
5, /* am_freq_ref */
#ifdef TUNER_AM
{ 8750, 9010, 9810, 10610, 10800 }, /* fm freq */
{ 530, 610, 1000, 1400, 1710 } /* am freq */
#else
{8750, 9010, 9810, 10610, 10800 }
#endif
},
//fm step 50k ,am step 9k
{ /* mode europe */
0x12,
8750, /* fm para */
10800,
5,
9710,
531, /* am para */
1602,
9,
612,
3, /* am_freq_ref */
#ifdef TUNER_AM
{ 8750, 9010, 9810, 10610, 10800 }, /* fm freq */
{ 531, 612, 999, 1404, 1602 } /* am freq */
#else
{8750, 9010, 9810, 10610, 10800 }
#endif
},
};
// rds text block define
static int rds_timing[] = {
7000, /* tAA */
6700, /* tBUF */
4500, /* tHD_STA */
6700, /* tSU_STA */
6700, /* tLOW */
4500, /* tHIGH */
0, /* tHD_DAT */
500, /* tSU_DAT */
1000, /* tR */
300, /* tF */
6700, /* tSU_STO */
300, /* tDH */
1000000 /* tWR */
};
#ifdef NEW_RDS
unsigned int SynTable[]={
0x200, /* 10 0000 0000b ;m bit 5 */
0x100, /* 01 0000 0000b ;14 */
0x80, /* 00 1000 0000b ;13 */
0x40, /* 00 0100 0000b ;12 */
0x20, /* 00 0010 0000b ;11 */
0x10, /* 00 0001 0000b ;10 */
0x08, /* 00 0000 1000b ;9 */
0x04, /* 00 0000 0100b ;8 */
0x02, /* 00 0000 0010b ;7 */
0x01, /* 00 0000 0001b ;6 */
0x2dc, /* 10 1101 1100b ;5 */
0x16e, /* 01 0110 1110b ;4 */
0x0b7, /* 00 1011 0111b ;3 */
0x287, /* 10 1000 0111b ;2 */
0x39f, /* 11 1001 1111b ;1 */
0x313, /* 11 0001 0011b ;0 */
0x355, /* 11 0101 0101b ;c bit9 */
0x376, /* 11 0111 0110b ;8 */
0x1bb, /* 01 1011 1011b ;7 */
0x201, /* 10 0000 0001b ;6 */
0x3dc, /* 11 1101 1100b ;5 */
0x1ee, /* 01 1110 1110b ;4 */
0x0f7, /* 00 1111 0111b ;3 */
0x2a7, /* 10 1010 0111b ;2 */
0x38f, /* 11 1000 1111b ;1 */
0x31b /* 11 0001 1011b ;0 */
};
unsigned long int Bdata=0;
unsigned char RDS_receive_flag=0; //0:wait receive,1:recieve finish
unsigned char RDS_check_flag=0; //0:wait check ,1:check finish
unsigned char bit_counter=0;
unsigned char word_counter=0;
unsigned char temp_bit_counter=0;
unsigned char temp_word_counter=0;
unsigned char RdsSync=0;
unsigned char RdsBitNo=0;
unsigned char RdsGrp=0;
unsigned char RdsBlk=0;
unsigned char RdsDecode=0;
unsigned char RdsBeginFlag=0;
unsigned char Service_Disp_Flag=0;
unsigned char RdsServiceBak[8];
unsigned char continue_check_flag=0;
unsigned long int receive_data[N_WORD];
static unsigned int CalSyn(void);
#endif
/***************variable define*********************/
unsigned char search_stop_flag=0;
unsigned char absolute_search_flag =0;
unsigned char auto_search_flag=0;
int fm_am_flag=TUNER_MODE_FM;
static short search_delay=200;
/******am******/
unsigned short am_freq_min;
unsigned short am_freq_max;
unsigned short cur_am_freq;
unsigned short am_freq_step;
unsigned short am_freq_ref;
/******fm******/
unsigned short fm_freq_min;
unsigned short fm_freq_max;
unsigned short cur_fm_freq;
unsigned short fm_freq_step;
unsigned short preset_up_down_mode;
extern unsigned char audio_source;
static void freq_decrease(void);
static void freq_increase(void);
static void search_finish(void);
static unsigned char proc_find_station(void);
static unsigned short ReadStationFreqValue(unsigned char radio_station);
static void WriteFreqValue(unsigned char radio_station, unsigned short freq_value);
static unsigned short CheckFreqValue(unsigned short freq_value);
static void check_station();
static void check_frequency();
static void write_frequency() ;
static void write_TEA5757(unsigned long data);
static unsigned long read_TEA5757(void);
static void freq_init() ;
static void TEA5757_EPROM_init(void);
//////////////////////////////////////////////////
static void freq_decrease(void)
{
if(fm_am_flag)
{
cur_fm_freq -=fm_freq_step;
}
else
{
cur_am_freq -=am_freq_step;
}
check_frequency();
}
static void freq_increase(void)
{
if(fm_am_flag)
{
cur_fm_freq += fm_freq_step;
}
else
{
cur_am_freq += am_freq_step;
}
check_frequency();
}
void write_current_freq()
{
if( TUNER_MODE_FM == fm_am_flag )
{
write_freq_to_eeprom(CURRENT_FM_FREQ_ADDRESS);
}
else
{
write_freq_to_eeprom(CURRENT_AM_FREQ_ADDRESS);
}
}
void write_freq_to_eeprom(unsigned char radio_station)
{
unsigned short freq_value;
if( fm_am_flag == TUNER_MODE_FM )
{
freq_value = cur_fm_freq;
}
else
{
freq_value = cur_am_freq;
}
WriteFreqValue( radio_station, freq_value);
}
void read_freq_from_eeprom(unsigned char radio_station)
{
unsigned short freq_value;
freq_value = ReadStationFreqValue(radio_station);
if( fm_am_flag == TUNER_MODE_FM )
{
cur_fm_freq=freq_value;
}
else
{
cur_am_freq=freq_value;
}
}
static unsigned short ReadStationFreqValue(unsigned char radio_station)
{
unsigned char freq_add;
unsigned short freq_val1, freq_val2, return_freq;
freq_add = station_address +(radio_station - 1)* 2;
freq_val1 = i2c_e2prom_byread(freq_add);
freq_val2 = i2c_e2prom_byread(freq_add+1);
return_freq = (freq_val1 << 8) | freq_val2;
if( return_freq & 0x8000 )
{
fm_am_flag = TUNER_MODE_FM;
}
else
{
fm_am_flag = TUNER_MODE_AM;
}
i2c_e2prom_bywrite(FM_AM_FLAG_ADDRESS, fm_am_flag);
return_freq = return_freq & 0x7fff;
return_freq = CheckFreqValue(return_freq);
return return_freq;
}
static void WriteFreqValue(unsigned char radio_station, unsigned short freq_value)
{
unsigned char freq_add;
freq_value = CheckFreqValue(freq_value);
if( TUNER_MODE_FM == fm_am_flag )
{
freq_value = freq_value | 0x8000;
}
if(radio_station!= CURRENT_FM_FREQ_ADDRESS &&
radio_station!=CURRENT_AM_FREQ_ADDRESS)
{
freq_add = station_address + (radio_station - 1)* 2;
}
else
{
freq_add= radio_station;
}
i2c_e2prom_bywrite(freq_add, freq_value>>8);
freq_value = freq_value & 0x0ff;
i2c_e2prom_bywrite(freq_add+1, freq_value);
}
/***************************************************************************
收音频率越界检查
****************************************************************************/
static unsigned short CheckFreqValue(unsigned short freq_value)
{
unsigned short cur_freq;
cur_freq = freq_value;
if( fm_am_flag == TUNER_MODE_FM )
{
if( (cur_freq < fm_freq_min) || (cur_freq > fm_freq_max ) )
{
cur_freq =fm_freq_min;
}
}
else
{
if( (cur_freq <am_freq_min) || (cur_freq > am_freq_max) )
{
cur_freq = am_freq_min;
}
}
return cur_freq;
}
/***************************************************************************
note: this function only call by fully auto search function.
****************************************************************************/
extern unsigned char station_counter;
void auto_search_pause_station()
{
freq_decrease();
freq_increase();
hand_tuner() ;
delay_5ms();
delay_5ms();
hand_tuner() ;
tdm_adc_turn_off();
tdm_adc_turn_on();
tuner_current_freq_disp();
write_current_freq();
}
/****************************************************************************
自动或全自动收台:
*****************************************************************************/
void tuner_auto_search_proc() /**ziva ch 06-04*/
{
extern unsigned char vfd_osd_timeout;
extern unsigned char stop_RDS_display_timeout;
if(( auto_search_flag&0x80)||(absolute_search_flag&0x80))
{
mute_proc();
#ifdef M62446
M62446_mute();
#endif
auto_search_flag &=0x03 ;
if(auto_search_flag==2) //ch 11-19
{
freq_increase();
}
else
{
freq_decrease();
}
if(absolute_search_flag)
{
station_counter =STATION_MIN ;
fm_am_flag = TUNER_MODE_FM ;
cur_fm_freq = fm_freq_min-6*fm_freq_step ;//ziva ch 10-15
absolute_search_flag = 1 ;
auto_search_flag =2 ;
}
hand_tuner();
hand_tuner();
delay_100ms();
write_frequency() ;
if (absolute_search_flag)
{
VFD_msg(VFDMSG_auto_prog);
}
else
{
VFD_msg(VFDMSG_search);
}
VFD_icon(VFDICON_dp_off);
VFD_icon(VFDICON_clear_khz_mhz);
search_stop_flag=0;
memory_timeout=0;
}
while( auto_search_flag )
{
if( search_delay )
{
search_delay --;
break;
}
else
{
search_delay = 200;
}
check_station();
ServiceValidFlag =0 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -