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

📄 fm_dd.c

📁 Philip tea 5767 FM 驱动用应用程序 char FM_Init(char bandinfo, char softlev)
💻 C
字号:
#include "os_cpu.h"
#include "fm_dd.h"
#include "fm_internal_api.h"
#include "actions_reg_213x.h "
#include "extra_inc.h"


unsigned int saved_gpio1;
unsigned int i2c_gpio;
unsigned int 	pmuctl_save;   //global value to save and restore PMU_CTL;


//int signal_intensity_threshold = 5; //0~15
//int current_station_intensity;
//int current_mode = 0;	// 0 default us mode;  1: jpan mode

static OS_INT_SAVE_AREA



fm_info_t fm_info = 
{
	.bandinfo = US_BAND,	//0 default us mode ;1 jpan mode
	.stereo_mode = STEREO_MODE,	// default 1 stereo; 0 : single
	.signal_threshold = 4, // default = 5
	.current_station_intensity=0

};


freq_range_t us_mode = 
{
	.low = 76000,
	.high = 1087000
};

freq_range_t jpan_mode = 
{
	.low = 76000,
	.high = 90000
};

#define IS_INVALID_US_FREQ(freq) \
	(( freq < us_mode.low ) || ( freq > us_mode.high ))

#define IS_INVALID_JPAN_FREQ(freq) \
	(( freq < jpan_mode.low ) || ( freq > jpan_mode.high ))




void i2c_get_gpio()
{
	#ifndef	__DSP_RAM_FLAG__
		AP_OS_ENTER_CRITICAL();
	#endif

	saved_gpio1 = act_readl(GPIO_MFCTL1);
	i2c_gpio = saved_gpio1 & 0xffffffcf; //multi-function: I2C1 SCL and SDA
	i2c_gpio = i2c_gpio | 0x80000000; //multi-function enable
	act_writel(i2c_gpio, GPIO_MFCTL1);
	
	return;
}

void i2c_release_gpio()
{
	act_writel(saved_gpio1, GPIO_MFCTL1);

	#ifndef __DSP_RAM_FLAG__	
		AP_OS_EXIT_CRITICAL();
	#endif

	return;
}


int  fm_host_init(void)
{

	/* enable adc and dac clk */ /* make sure volume not changed when recording */ //added 2006-12-20 16:17	
	/* i2c clk enable. 20070804 */
	act_writel(((0x1 << 23) | (0x3 << 17) | act_readl(CMU_DEVCLKEN)), CMU_DEVCLKEN);
	
	/* enable fm channel */
	unsigned int temp = act_readl(ADC_CTL);
	temp |= (0x3<<11);
	act_writel(temp,ADC_CTL);


#define ADC_FIFO_CON_INIT           0x201	//apb_en, dsp_disable.... set before:0x00000155
	act_writel(ADC_FIFO_CON_INIT,  ADC_FIFOCTL);
	
	unsigned int value = act_readl(DAC_ANALOG);		
	/* below is ensure not mute input, such as fm, linein, mic */
	act_writel(value & (~0x700), DAC_ANALOG);	/* if not set it, monitor can't work. */
	
	act_writel(0x009, ADC_FIFOCTL);	/* enable dsp's adc fifo data accessing, no irq,if==0x009 has irq */
	
	pmuctl_save = act_readl(PMU_CTL); //save PMU_CTL;
	act_writel(act_readl(PMU_CTL)|(1<<14), PMU_CTL);
	    
	return 0; /* succeed */
}


//return 0, success
int fm_init
(
int bandinfo	//o: us; 1 :jp
)
{
int ret = 0;
	if( bandinfo == US_BAND )
#ifdef  DINGXIN_FMmodule
        	ret = FM_Init(0, 1);//FM_Init(0, 5);
#else
		ret = FM_Init(0, 5);
#endif
	else if( bandinfo == JAPAN_BAND)
#ifdef  DINGXIN_FMmodule
                ret = FM_Init(1, 1);
#else
		ret = FM_Init(1, 5);
#endif
	else
		return -1;
	
	fm_info.bandinfo = bandinfo;
	return ( ret == 0 ? -1 : 0);
}
	







int fm_host_exit(void)
{

	FM_MUTE(1);
	FM_Exit();
	act_writel(pmuctl_save,PMU_CTL);  //restore PMU_CTL;

	/* disablel fm channel */
	unsigned int value = act_readl(ADC_CTL);
	value &= ~(0x3<<11);
	act_writel(value,ADC_CTL);
	
	/* disable adc and dac clk */
	value = (~(0x3 << 17)) & act_readl(CMU_DEVCLKEN);
	value &= ~(0x1 << 23);	/* I2C clk disable. added 20070804*/	
	act_writel(value, CMU_DEVCLKEN);

	return 0;
}


//not used any more, manipulated by the system
#if 0
int fm_set_volume
(
unsigned int volume
)
{
unsigned int tmp;

	if (volume > 0x1f) {
		return -1;
	}
	tmp = act_readl(DAC_ANALOG);
	tmp &= ~(0x1f << 3);
	tmp |= (volume << 3);
	act_writel(tmp, DAC_ANALOG);
	
	return 0;
}
#endif


/**
much work is done in this func:
1 test whether the current freq is valid station
2 get info about this station and save in the global var fm_info
*/
int is_freq_valid_station
(
int freq	//current frequency
)
{
int station;
int i = 0, count = 1;
int ret;
int is_valid_station = 0;
int sound_mode;

//	if( (fm_info.bandinfo == USA_BAND) && IS_INVALID_US_FREQ(freq))
//		return -1;
//	
//	if( (fm_info.bandinfo == JAPAN_BAND) && IS_INVALID_JPAN_FREQ(freq))
//		return -1;
	if( ((fm_info.bandinfo == US_BAND)||(fm_info.bandinfo == JAPAN_BAND)) && IS_INVALID_US_FREQ(freq))
		return -1;
	
	station = freq;


	FM_MUTE(1);	/* set to mute */

	for(i = 0; i < count; i++){
		ret = FM_Search(station, 0);
		if(ret){
			is_valid_station = 1;
			break;
		}
		
#if 0		
		ret = FM_Search(station, 1);
		if(ret){
			is_valid_station = 1;
			break;
		}
#endif
	}

//	FM_SetFreq(station);
	
	sound_mode = (1 == GET_TRACK()) ? STEREO_MODE : MONO_MODE;
	fm_info.current_station_intensity = GET_RSSI() ;
	fm_info.stereo_mode = (int)sound_mode;
	
	if(!is_valid_station)
		return -1;

	/*
	yes we searched a valid station, but we need to test the threshold 
	*/
	if (ret) {
		if ( fm_info.current_station_intensity < fm_info.signal_threshold ) {
			return -1; 
		}

		FM_MUTE(0);		/* begin to play fm */
		return 0;  //success
	}

	return -1;  //failure
}



#if 0
int fm_set_stereo_mode
(
int stereo_mode	// 1: stereo mode; 0 : single 
)
{
int status;	
	status = FM_Setaudiomode( (stereo_mode == 0) ? 0 :1 );
	if (status) {
		fm_info.stereo_mode = ((stereo_mode == 0) ? 0 :1);
		return 0; //success
	}
	return -1;
}
#endif


/**
return 0 success
*/
int fm_get_stereo_mode
(
int *p //to save STEREO_MODE; MONO_MODE
)
{
	(*p) = fm_info.stereo_mode;
	return 0;
}

int fm_start_playing
(
void
)
{
int ret;
	ret = FM_MUTE(0);
	return (ret ? 0 : -1); // 0 success
}

int fm_stop_playing
(
void
)
{
int ret;
	ret = FM_MUTE(1);
	return (ret ? 0 :-1); // 0 success
}


int fm_set_intensity_threshold
(
int threshold
)
{
	if( (threshold >=15) ||( threshold < 0) )
		return -1; //error
		
	fm_info.signal_threshold = threshold;
	
	return 0;//sucssess	
}
	


int fm_get_current_station_intensity
(
int *pIntensity	//used to save the intensity
)
{
	*pIntensity = fm_info.current_station_intensity;

	return 0;
}



int fm_set_band_mode
(
int band_mode //0: us mode; 1: jpan mode
)
{
int ret;
	char mode = (band_mode ==0 ? 0 : 1 );
	ret = SET_BAND(mode);
	fm_info.bandinfo = mode;
	return !ret;
}

⌨️ 快捷键说明

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