📄 fm_dd.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 + -