tuner.c

来自「韩国光新一体化车载收音高频头(KST-1111)的调试程序」· C语言 代码 · 共 1,059 行 · 第 1/2 页

C
1,059
字号
/********************************************************************/
/*																	*/
/*	  Copyright (c) 2003 DuirkWang SHENZHEN	   			                              	*/
/*	          				                                                                                        */
/* File:Tuner.c															*/
/* ===========                                                         							*/
/* Descripton:    KST-CD111LVD-100 car tuner Driver  							*/
/*           PLL LC72131 & LA1787                                                                       		*/
/* 			                                                         							*/
/********************************************************************/
#include "Reg52.h"
#include "Config.h"
#include "Global.h"
#include "OSD_String.h"
#include "OSD.h"
Uint8 xdata TenKeyCnt = 0;
Uint8 xdata MemoryCnt = 0;
#ifdef KST_TUNER
#include "IOPort.h"
#include "tools.h"
#include "Extern.h"
#include "I2C.h"
#include "Tuner.h"
#include "AVSwitch.h"
#include "EEPROM.h"
#include "Uicc_def.h"
#include "menu.h"
#include "clock.h"
#include "Sanyoccb.h"
#include "command.h"
#include "Audio.h"
#include "Ir.h"
#include "Event.h"
#include "Ir_lut.h"
#include "mcutoess.h"
#include "Cdc.h"
#include "tvtuner.h"

Uint16 idata FMfreq = FMFREQ_MIN;
Uint16 idata AMfreq = AMFREQ_MIN;

Uint8 idata AutoSearchStep = 0;
//Uint8 idata IFDetectCount = 0;
Uint8 idata IFRepeatDetect = 0;
Uint8 idata CurrentBand = FM_BAND;
BIT bMonoStereo = STEREO;
BIT bLocDx = DX;
BIT bAutoSearchOK = TRUE;
BIT bPrevNextSearchFlag = FALSE;
BIT bSearchDir = FALSE;
Uint8 xdata ChannelNum = 1;
Uint32  RadioIn1Data = 0;
Uint32  RadioIn2Data = 0;
Uint32  RadioOutData = 0;
//Uint16 idata Count_delay_timer = 0;
Uint8 xdata picture_state = 0;
BIT tuner_repeat_key_flag = 0;
/*******************************************************
LC72131
		1		0
BO4  	FM		AM
IO2		UNMUTE	MUTE
BO3		ST		MO
IO1		DX		LO
********************************************************/

void   Change_freq_value(Uint8 CurrentBand, BIT bSearchDir)
{
	switch(CurrentBand)
		{
		case AM_BAND:
           	if(bSearchDir)
           		{
			AMfreq += 9 ;
			if(AMfreq > AMFREQ_MAX)
				{
				bAutoSearchOK = 1;
				Osd_display_string(
					OSD_ROW_9, OSD_COLUMN_17, TV_SEARCH,
					OSD_STANDARD, OSD_BLUE, OSD_BLACK, BACKGROUND_OFF, CLEAR_STRING
					);
				
				if(bPrevNextSearchFlag)
					{
					AMfreq = AMFREQ_MIN;
					bPrevNextSearchFlag = 0;
					}
				else
					{
					ChannelNum = 1;
					Eeprom_write_ch_band();
					Eeprom_read_freq();
					Tuner_DisplayChannel(ChannelNum);
					}
				Direct_select();
				Tuner_display_freq();
			if(!b_Mute)
			Audio_mute(ALL_CHANNEL, AUDIO_UNMUTE);
				}
           		}
           	else{
           		AMfreq -= 9 ;
			if(AMfreq < AMFREQ_MIN)
				{
				bAutoSearchOK = 1;
				Osd_display_string(
					OSD_ROW_9, OSD_COLUMN_17, TV_SEARCH,
					OSD_STANDARD, OSD_BLUE, OSD_BLACK, BACKGROUND_OFF, CLEAR_STRING
					);
				
				if(bPrevNextSearchFlag)
					{
					AMfreq = AMFREQ_MAX;
					bPrevNextSearchFlag = 0;
					}
				else
					{
					ChannelNum = 1;
					Eeprom_write_ch_band();
					Eeprom_read_freq();
					Tuner_DisplayChannel(ChannelNum);
					}
				Direct_select();
				Tuner_display_freq();
			if(!b_Mute)
			Audio_mute(ALL_CHANNEL, AUDIO_UNMUTE);
				}
           		}
           		RadioIn1Data = (RadioIn1Data & 0xff0000) |(((AMfreq + 10710)  / 9) << 4 );
			break;
		default:
           	if(bSearchDir)
           		{
			FMfreq += 5;
			if(FMfreq > FMFREQ_MAX)
				{
				bAutoSearchOK = 1;
				Osd_display_string(
					OSD_ROW_9, OSD_COLUMN_17, TV_SEARCH,
					OSD_STANDARD, OSD_BLUE, OSD_BLACK, BACKGROUND_OFF, CLEAR_STRING
					);
				
				if(bPrevNextSearchFlag)
					{
					FMfreq = FMFREQ_MIN;
					}
				else
					{
					ChannelNum = 1;
					Eeprom_write_ch_band();
					Eeprom_read_freq();
					Tuner_DisplayChannel(ChannelNum);
					}
				Direct_select();
				Tuner_display_freq();
				Unmute_bo2port();
			if(!b_Mute)
			Audio_mute(ALL_CHANNEL, AUDIO_UNMUTE);
				}
           		}
           	else{
           		FMfreq -= 5;
			if(FMfreq < FMFREQ_MIN)
				{
				bAutoSearchOK = 1;
				Osd_display_string(
					OSD_ROW_9, OSD_COLUMN_17, TV_SEARCH,
					OSD_STANDARD, OSD_BLUE, OSD_BLACK, BACKGROUND_OFF, CLEAR_STRING
					);
				
				if(bPrevNextSearchFlag)
					{
					FMfreq = FMFREQ_MAX;
					}
				else
					{
					ChannelNum = 1;
					Eeprom_write_ch_band();
					Eeprom_read_freq();
					Tuner_DisplayChannel(ChannelNum);
					}
				Direct_select();
				Tuner_display_freq();
			if(!b_Mute)
			Audio_mute(ALL_CHANNEL, AUDIO_UNMUTE);
				}
           		}
           		RadioIn1Data = (RadioIn1Data & 0xff0000) |((FMfreq+1070) / 5);
			break;
		}
}

BIT Tuner_IFok(void)
{
  BIT bIFOK;

      	bIFOK = 0;

      switch(CurrentBand)
        {
         	case   AM_BAND:
         		   if(RADIO_SD_HIGH && (IFRepeatDetect < IF_REPEAT_DETECT))
       				if( ((RadioOutData & 0xfffff) < (AM_IFFREQ + AM_IFFREQ_MARGIN)) &&
							((RadioOutData & 0xfffff) >( AM_IFFREQ - AM_IFFREQ_MARGIN)))
 					{
              				bIFOK = 1;
              				IFRepeatDetect = 0;
					break;
      					}

       				IFRepeatDetect++;
       				if(IFRepeatDetect == IF_REPEAT_DETECT)
       					IFRepeatDetect = 0;
       				else
					Change_freq_value(CurrentBand, !bSearchDir);   /*plus or minus freq*/
       				break;

       		default:
       			if(FMfreq % 10) break;
       			if(RADIO_SD_HIGH && (IFRepeatDetect < IF_REPEAT_DETECT))
       				if( ((RadioOutData & 0xfffff) <(FM_IFFREQ + FM_IFFREQ_MARGIN)) &&
							((RadioOutData & 0xfffff) >( FM_IFFREQ - FM_IFFREQ_MARGIN)))
 					{
              				bIFOK = 1;
              				IFRepeatDetect = 0;
					break;
      					}

       				IFRepeatDetect++;
       				if(IFRepeatDetect == IF_REPEAT_DETECT)
       					{
       					IFRepeatDetect = 0;
       					}
       				else
       					{
					Change_freq_value(CurrentBand, !bSearchDir);   /*plus or minus freq*/
       					}
       		break;
       	}
     		 if(!IFRepeatDetect)
      			{
			Tuner_display_freq();
      			}
  	return  bIFOK;
}


void Tuner_stereo_ind()
{
	#ifdef ENGLISH_SYS
	
	#else	
	if(RADIO_SD_LOW)
		Osd_display_string(ST_MO_ROW, ST_MO_COL, STEREO_IND, OSD_STANDARD,
			NO_SHADE, OSD_YELLOW, BACKGROUND_OFF, DISPLAY_STRING);
	else
		Osd_display_string(ST_MO_ROW, ST_MO_COL, STEREO_IND, OSD_STANDARD,
			NO_SHADE, OSD_YELLOW, BACKGROUND_OFF, CLEAR_STRING);
	#endif
}

void   Tuner_autosearch(void)
{
  	if(bAutoSearchOK)   return;

   	switch(AutoSearchStep)
    	{
	 case   AUTOSRCH_STEP0:
		RadioIn2Data &= ~RADIO_IN2_RESET;
		RadioIn2Data |= BO3_ST ;
      		RadioIn2Data |= RADIO_IN2_DOC;
      		RadioIn2Data &= ~IO2_UNMUTE;
      		Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);

        	RadioIn1Data &= ~RADIO_IN1_CTE;       /* set  cte = 0, reset counter*/
		Change_freq_value(CurrentBand, bSearchDir);
      		Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);  		
		RadioIn1Data |= RADIO_IN1_CTE;
      		Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);      		
		AutoSearchStep ++;
		//IFDetectCount = 0xff;
        	break;

     	case    AUTOSRCH_STEP1:  /*check DO is low?*/
		//if(Count_delay_timer)
		//	{
		//	Count_delay_timer--;
		//	break;
		//	}
		if (RADIO_DATA_HIGH /*&& IFDetectCount*/)
			{
				//IFDetectCount--;
				break;     /*IF counter end*/
			}
		if (0/*RADIO_DATA_HIGH*/)      /*reset lc72131*/
			{
        		RadioIn2Data |= RADIO_IN2_RESET;
      			Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
        		AutoSearchStep  = AUTOSRCH_STEP0;
			break;
			}
			AutoSearchStep ++;

     	case    AUTOSRCH_STEP2:	/*/check UL and read data from LC72131*/
			RadioOutData = Read_data_from_ccb(LC72131_OUT_ADDR, 24);
			RadioOutData = Read_data_from_ccb(LC72131_OUT_ADDR, 24);
			if(((RadioOutData & RADIO_OUT_LOCK) != RADIO_OUT_LOCK)) break;
			AutoSearchStep  = AUTOSRCH_STEP0;
			//Read_lc72131();      /*locked*/
			if(Tuner_IFok())
          		{
          		Eeprom_write_freq();
			if(bPrevNextSearchFlag)
					{
					bAutoSearchOK = 1;		
					Osd_display_string(
						OSD_ROW_9, OSD_COLUMN_17, TV_SEARCH,
						OSD_STANDARD, OSD_BLUE, OSD_BLACK, BACKGROUND_OFF, CLEAR_STRING
						);
						
					bPrevNextSearchFlag = 0;
					Direct_select();
			if(!b_Mute)
			Audio_mute(ALL_CHANNEL, AUDIO_UNMUTE);
					} 
			else
				{
				if(bSearchDir)
					{
					ChannelNum++;
	        			if(ChannelNum > MAX_CHANNEL_NUM)
					ChannelNum = MIN_CHANNEL_NUM;
					}else{
					ChannelNum--;
					if(ChannelNum == 0)
					ChannelNum = MAX_CHANNEL_NUM;
					}
					Tuner_DisplayChannel(ChannelNum);
					}
			}
			break;
	}
}
void   Unmute_bo2port(void)
{
	RadioIn2Data = (RadioIn2Data |  IO2_UNMUTE) & ~RADIO_IN2_DOC ;

	Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
}


void  Init_lc72131()
{
      switch(CurrentBand)
       {
       case  AM_BAND:
	RadioIn1Data = IN1_AM_INIT | (((AMfreq + 10710) / 9) << 4 );
	RadioIn2Data = IN2_DATA_INIT | IO2_UNMUTE | IO1_DX ;
          break;
       default:
 	RadioIn1Data = IN1_FM_INIT | (FMfreq + 1070) /5;
	RadioIn2Data = IN2_DATA_INIT | IO2_UNMUTE | IO1_DX |SELECT_FM |BO3_ST;
          break;
       }

	Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);
	Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
	Unmute_bo2port();
}

void  Tuner_handsearch(Uint8 bSearchDir)
{
        	Change_freq_value(CurrentBand, bSearchDir);
		Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);
		Unmute_bo2port();
}

void Direct_select()
{
		if(CurrentBand == AM_BAND)
		{
		if((AMfreq >1620) || (AMfreq < 522))
			AMfreq = 522;
		RadioIn1Data = (RadioIn1Data & 0xff0000) |(((AMfreq + 10710)  / 9) << 4 );
		}else{
		if((FMfreq >10800) || (FMfreq < 8700))
			FMfreq = 8700;
		RadioIn1Data = (RadioIn1Data & 0xff0000) |((FMfreq+1070) / 5);
		}
		Send_data_to_ccb(LC72131_IN1_ADDR, RadioIn1Data, 24);

        	Unmute_bo2port();
}

void Tuner_display_freq()
{
	Uint16 idata temp[10];

	if(CurrentBand == FM_BAND)
		{
		if(FMfreq > 9999)
			temp[0] = FMfreq / 10000 + '0';
		else
			temp[0] = OSD_FONT_BLANK;

		temp[1] = (FMfreq % 10000) / 1000 + '0';
		temp[2] = (FMfreq % 1000) / 100+ '0';
		temp[3] ='.';
		temp[4] = (FMfreq % 100) / 10 + '0';
		temp[5] = FMfreq % 10 + '0';
		temp[6] = 'M';
		temp[7] = 'H';
		temp[8] = 'z';
		temp[9] = 0xff;
		}
	else
		{
		temp[0] = OSD_FONT_BLANK;
		temp[1] = OSD_FONT_BLANK;
		if(AMfreq > 999)
			temp[2] = AMfreq / 1000 + '0';
		else
			temp[2] = OSD_FONT_BLANK;

		temp[3] = (AMfreq % 1000) / 100 + '0';
		temp[4] = (AMfreq % 100) / 10 + '0';
		temp[5] = (AMfreq % 10) + '0';
		temp[6] = 'K';
		temp[7] = 'H';
		temp[8] = 'z';
		temp[9] = 0xff;
		}
		Osd_display_string(FREQUENCY_ROW, FREQUENCY_COL, temp, OSD_DOUBLE_HEIGHT,
					NO_SHADE, OSD_GREEN, BACKGROUND_ON, DISPLAY_STRING);
}

void Process_mono_stereo()
{
	if(bMonoStereo)
	{
	RadioIn2Data |= BO3_ST;
	bMonoStereo = STEREO;
	}else{
	RadioIn2Data &= ~BO3_ST;
	bMonoStereo = MONO;
	}
	Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
}

void Process_loc_dx()
{
	if(bLocDx)
	{
	RadioIn2Data &= ~IO1_DX;
	bLocDx = LOC;
	}else{
	RadioIn2Data |= IO1_DX;
	bLocDx = DX;
	}
	Send_data_to_ccb(LC72131_IN2_ADDR, RadioIn2Data, 24);
	LOC_DX_set();	
}

void Eeprom_read_freq(void)
{
	I2C_buffer[0] = 0;
	I2C_buffer[1] = 0;

	if(CurrentBand)
		{
		I2C_read_sub(EEPROM_ADDR, ((ChannelNum - 1) * 2 + AM_START_ADDR),
											I2C_buffer, 2);
		AMfreq = (Uint16)I2C_buffer[0] <<8 | I2C_buffer[1];
		}
	else
		{
		I2C_read_sub(EEPROM_ADDR, ((ChannelNum - 1) * 2 + FM_START_ADDR),
											I2C_buffer, 2);
		FMfreq = (Uint16)I2C_buffer[0] <<8 |I2C_buffer[1];
		}
		delay_ms(5);
}

void Eeprom_write_freq(void)            /*write channel freqency*/
{
		if(CurrentBand)
		{
		I2C_buffer[0] = HIBYTE(AMfreq);
		I2C_buffer[1] = LOBYTE(AMfreq);
		I2C_write_sub(EEPROM_ADDR, ((ChannelNum - 1) * 2 + AM_START_ADDR), I2C_buffer, 1);
		I2C_write_sub(EEPROM_ADDR, ((ChannelNum - 1) * 2 + 1 + AM_START_ADDR), I2C_buffer + 1, 1);
		
		}else{
		I2C_buffer[0] = HIBYTE(FMfreq);
		I2C_buffer[1] = LOBYTE(FMfreq);
		I2C_write_sub(EEPROM_ADDR, ((ChannelNum - 1) * 2 + FM_START_ADDR), I2C_buffer, 1);
		I2C_write_sub(EEPROM_ADDR, ((ChannelNum - 1) * 2 + 1 + FM_START_ADDR), I2C_buffer + 1, 1);
		}
		delay_ms(5);
}

void Eeprom_write_ch_band(void)
{
	I2C_buffer[0] = ChannelNum;
	I2C_write_sub(EEPROM_ADDR, CURRENT_CHANNEL, I2C_buffer, 1);
	delay_ms(5);
}

MS_UOP Tuner_operation(MS_UOP uop)
{
	MemoryCnt = 0;
	
	switch(uop)
	{
		case MS_UOP_0:
		case MS_UOP_1:
		case MS_UOP_2:
		case MS_UOP_3:
		case MS_UOP_4:
		case MS_UOP_5:
		case MS_UOP_6:
		case MS_UOP_7:
		case MS_UOP_8:
		case MS_UOP_9:

			ChannelNum = uop -MS_UOP_0;
			ChannelNum = ChannelNum + TenKeyCnt * 10;

			TenKeyCnt = 0;
			Eeprom_write_ch_band();

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?