Implement region setting for the fm tuner. The region setting affects deemphasis, band limits and step size. Fixes FS#5929, FS#5928.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11133 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Dominik Riebeling 2006-10-05 12:40:13 +00:00
parent 0640a050d5
commit e66b2ec450
7 changed files with 190 additions and 32 deletions

View file

@ -7408,10 +7408,10 @@
desc: in radio screen
user:
<source>
*: "Station: %d.%dMHz"
*: "Station: %d.%02d MHz"
</source>
<dest>
*: "Station: %d.%dMHz"
*: "Station: %d.%02d MHz"
</dest>
<voice>
*: ""
@ -7646,10 +7646,10 @@
desc: during auto scan
user:
<source>
*: "Scanning %d.%01dMHz"
*: "Scanning %d.%02d MHz"
</source>
<dest>
*: "Scanning %d.%01dMHz"
*: "Scanning %d.%02d MHz"
</dest>
<voice>
*: ""
@ -7660,10 +7660,10 @@
desc: default preset name for auto scan mode
user:
<source>
*: "%d.%01dMHz"
*: "%d.%02d MHz"
</source>
<dest>
*: "%d.%01dMHz"
*: "%d.%02d MHz"
</dest>
<voice>
*: ""
@ -9862,3 +9862,68 @@
*: "Disable auto-resume if phones not present"
</voice>
</phrase>
<phrase>
id: LANG_FM_REGION
desc: fm tuner region setting
<source>
*: "Region"
</source>
<dest>
*: "Region"
</dest>
<voice>
*: "Region"
</voice>
</phrase>
<phrase>
id: LANG_FM_EUROPE
desc: fm tuner region europe
<source>
*: "Europe"
</source>
<dest>
*: "Europe"
</dest>
<voice>
*: "Europe"
</voice>
</phrase>
<phrase>
id: LANG_FM_US
desc: fm region us / canada
<source>
*: "US / Canada"
</source>
<dest>
*: "US / Canada"
</dest>
<voice>
*: "US / Canada"
</voice>
</phrase>
<phrase>
id: LANG_FM_JAPAN
desc: fm region japan
<source>
*: "Japan"
</source>
<dest>
*: "Japan"
</dest>
<voice>
*: "Japan"
</voice>
</phrase>
<phrase>
id: LANG_FM_KOREA
desc: fm region korea
<source>
*: "Korea"
</source>
<dest>
*: "Korea"
</dest>
<voice>
*: "Korea"
</voice>
</phrase>

View file

@ -85,13 +85,31 @@
#define FM_RECORD
#endif
#define MAX_FREQ (108000000)
#define MIN_FREQ (87500000)
#define FREQ_STEP 100000
#define RADIO_SCAN_MODE 0
#define RADIO_PRESET_MODE 1
#if (CONFIG_TUNER & TEA5767)
#define DEEMPH_50 0,
#define DEEMPH_75 1,
#define BAND_LIM_EU 0
#define BAND_LIM_JP 1
#else
#define DEEMPH_50
#define DEEMPH_75
#define BAND_LIM_EU
#define BAND_LIM_JP
#endif
static struct fm_region_setting fm_region[] = {
/* Europe */
{ LANG_FM_EUROPE, 87500000, 108000000, 50000, DEEMPH_50 BAND_LIM_EU },
/* US / Canada */
{ LANG_FM_US, 87900000, 107900000, 200000, DEEMPH_75 BAND_LIM_EU },
/* Japan */
{ LANG_FM_JAPAN, 76000000, 90000000, 100000, DEEMPH_50 BAND_LIM_JP },
/* Korea */
{ LANG_FM_KOREA, 87500000, 108000000, 100000, DEEMPH_50 BAND_LIM_EU },
};
static int curr_preset = -1;
static int curr_freq;
static int radio_mode = RADIO_SCAN_MODE;
@ -194,7 +212,9 @@ void radio_start(void)
if(radio_status == FMRADIO_OFF)
radio_power(true);
curr_freq = global_settings.last_frequency * FREQ_STEP + MIN_FREQ;
curr_freq = global_settings.last_frequency
* fm_region[global_settings.fm_region].freq_step
+ fm_region[global_settings.fm_region].freq_min;
radio_set(RADIO_SLEEP, 0); /* wake up the tuner */
radio_set(RADIO_FREQUENCY, curr_freq);
@ -285,7 +305,7 @@ static int find_closest_preset(int freq)
{
int i;
int diff;
int min_diff = MAX_FREQ;
int min_diff = fm_region[global_settings.fm_region].freq_min;
int preset = -1;
for(i = 0;i < MAX_PRESETS;i++)
@ -307,7 +327,9 @@ static int find_closest_preset(int freq)
static void remember_frequency(void)
{
global_settings.last_frequency = (curr_freq - MIN_FREQ) / FREQ_STEP;
global_settings.last_frequency = (curr_freq
- fm_region[global_settings.fm_region].freq_min)
/ fm_region[global_settings.fm_region].freq_step;
settings_save();
}
@ -450,11 +472,12 @@ bool radio_screen(void)
{
if(search_dir)
{
curr_freq += search_dir * FREQ_STEP;
if(curr_freq < MIN_FREQ)
curr_freq = MAX_FREQ;
if(curr_freq > MAX_FREQ)
curr_freq = MIN_FREQ;
curr_freq += search_dir
* fm_region[global_settings.fm_region].freq_step;
if(curr_freq < fm_region[global_settings.fm_region].freq_min)
curr_freq = fm_region[global_settings.fm_region].freq_max;
if(curr_freq > fm_region[global_settings.fm_region].freq_max)
curr_freq = fm_region[global_settings.fm_region].freq_min;
/* Tune in and delay */
radio_set(RADIO_FREQUENCY, curr_freq);
@ -573,9 +596,11 @@ bool radio_screen(void)
case ACTION_STD_PREV:
if(radio_mode == RADIO_SCAN_MODE)
{
curr_freq -= FREQ_STEP;
if(curr_freq < MIN_FREQ)
curr_freq = MAX_FREQ;
curr_freq
-= fm_region[global_settings.fm_region].freq_step;
if(curr_freq < fm_region[global_settings.fm_region].freq_min)
curr_freq
= fm_region[global_settings.fm_region].freq_max;
radio_set(RADIO_FREQUENCY, curr_freq);
curr_preset = find_preset(curr_freq);
remember_frequency();
@ -589,9 +614,11 @@ bool radio_screen(void)
case ACTION_STD_NEXT:
if(radio_mode == RADIO_SCAN_MODE)
{
curr_freq += FREQ_STEP;
if(curr_freq > MAX_FREQ)
curr_freq = MIN_FREQ;
curr_freq
+= fm_region[global_settings.fm_region].freq_step;
if(curr_freq > fm_region[global_settings.fm_region].freq_max)
curr_freq
= fm_region[global_settings.fm_region].freq_min;
radio_set(RADIO_FREQUENCY, curr_freq);
curr_preset = find_preset(curr_freq);
remember_frequency();
@ -821,8 +848,8 @@ bool radio_screen(void)
FOR_NB_SCREENS(i)
screens[i].puts_scroll(0, top_of_screen, buf);
freq = curr_freq / 100000;
snprintf(buf, 128, str(LANG_FM_STATION), freq / 10, freq % 10);
freq = curr_freq / 10000;
snprintf(buf, 128, str(LANG_FM_STATION), freq / 100, freq % 100);
FOR_NB_SCREENS(i)
screens[i].puts_scroll(0, top_of_screen + 1, buf);
@ -1316,6 +1343,39 @@ static bool toggle_mono_mode(void)
return false;
}
char region_menu_string[32];
static void create_region_menu(void)
{
snprintf(region_menu_string, sizeof(region_menu_string),
"%s: %s", str(LANG_FM_REGION),
str(fm_region[global_settings.fm_region].lang));
}
static bool toggle_region_mode(void)
{
global_settings.fm_region++;
if(global_settings.fm_region >=
(int)(sizeof(fm_region) / sizeof(struct fm_region_setting)))
global_settings.fm_region = 0;
#if (CONFIG_TUNER & TEA5767)
radio_set(RADIO_SET_DEEMPHASIS,
fm_region[global_settings.fm_region].deemphasis);
radio_set(RADIO_SET_BAND, fm_region[global_settings.fm_region].band);
#endif
/* make sure the current frequency is in the region range */
curr_freq -= (curr_freq - fm_region[global_settings.fm_region].freq_min)
% fm_region[global_settings.fm_region].freq_step;
if(curr_freq < fm_region[global_settings.fm_region].freq_min)
curr_freq = fm_region[global_settings.fm_region].freq_min;
if(curr_freq > fm_region[global_settings.fm_region].freq_max)
curr_freq = fm_region[global_settings.fm_region].freq_max;
radio_set(RADIO_FREQUENCY, curr_freq);
settings_save();
create_region_menu();
return false;
}
#ifndef FM_MODE
char radiomode_menu_string[32];
@ -1346,17 +1406,17 @@ static bool scan_presets(void)
if(do_scan)
{
curr_freq = MIN_FREQ;
curr_freq = fm_region[global_settings.fm_region].freq_min;
num_presets = 0;
memset(presets, 0, sizeof(presets));
while(curr_freq <= MAX_FREQ)
while(curr_freq <= fm_region[global_settings.fm_region].freq_max)
{
if (num_presets >= MAX_PRESETS)
break;
freq = curr_freq /100000;
freq = curr_freq / 10000;
snprintf(buf, MAX_FMPRESET_LEN, str(LANG_FM_SCANNING),
freq/10, freq % 10);
freq/100, freq % 100);
gui_syncsplash(0, true, buf);
/* Tune in and delay */
@ -1373,13 +1433,13 @@ static bool scan_presets(void)
/* add preset */
if(tuned){
snprintf(buf, MAX_FMPRESET_LEN,
str(LANG_FM_DEFAULT_PRESET_NAME),freq/10, freq % 10);
str(LANG_FM_DEFAULT_PRESET_NAME),freq/100, freq % 100);
strcpy(presets[num_presets].name,buf);
presets[num_presets].frequency = curr_freq;
num_presets++;
}
curr_freq += FREQ_STEP;
curr_freq += fm_region[global_settings.fm_region].freq_step;
}
@ -1504,6 +1564,7 @@ bool radio_menu(void)
#ifndef FM_MODE
{ radiomode_menu_string , toggle_radio_mode },
#endif
{ region_menu_string , toggle_region_mode },
{ ID2P(LANG_SOUND_SETTINGS) , sound_menu },
#ifndef SIMULATOR
#if defined(HAVE_FMRADIO_IN) || CONFIG_CODEC != SWCODEC
@ -1515,6 +1576,7 @@ bool radio_menu(void)
};
create_monomode_menu();
create_region_menu();
#ifndef FM_MODE
create_radiomode_menu();
#endif

View file

@ -42,6 +42,18 @@ struct fmstation
char name[MAX_FMPRESET_LEN+1];
};
struct fm_region_setting
{
int lang;
int freq_min;
int freq_max;
int freq_step;
#if (CONFIG_TUNER & TEA5767)
int deemphasis; /* 0: 50us, 1: 75us */
int band; /* 0: europe, 1: japan (BL in TEA spec)*/
#endif
};
#endif
#endif

View file

@ -661,6 +661,9 @@ static const struct bit_entry hd_bits[] =
{4, S_O(unplug_rw), 0, "rewind duration on pause", NULL},
{1, S_O(unplug_autoresume), 0, "disable autoresume if phones not present", off_on },
#endif
#ifdef CONFIG_TUNER
{2, S_O(fm_region), 0, "fm_region", "eu,us,jp,kr" },
#endif
/* If values are just added to the end, no need to bump the version. */
/* new stuff to be added at the end */

View file

@ -491,6 +491,10 @@ struct user_settings
int unplug_rw; /* time in s to rewind when pausing */
bool unplug_autoresume; /* disable auto-resume if no phones */
#endif
#ifdef CONFIG_TUNER
int fm_region;
#endif
};
enum optiontype { INT, BOOL };

View file

@ -27,6 +27,10 @@
#define RADIO_IF_MEASUREMENT 3
#define RADIO_SENSITIVITY 4
#define RADIO_FORCE_MONO 5
#if (CONFIG_TUNER & TEA5767)
#define RADIO_SET_DEEMPHASIS 6
#define RADIO_SET_BAND 7
#endif
/* readback from the tuner layer */
#define RADIO_PRESENT 0
#define RADIO_TUNED 1

View file

@ -73,6 +73,14 @@ void philips_set(int setting, int value)
fmradio_i2c_write(I2C_ADR, write_bytes, sizeof(write_bytes));
break;
case RADIO_SET_DEEMPHASIS:
write_bytes[4] = (write_bytes[4] & ~(1<<6)) | (value ? (1<<6) : 0);
fmradio_i2c_write(I2C_ADR, write_bytes, sizeof(write_bytes));
break;
case RADIO_SET_BAND:
write_bytes[3] = (write_bytes[3] & ~(1<<5)) | (value ? (1<<5) : 0);
fmradio_i2c_write(I2C_ADR, write_bytes, sizeof(write_bytes));
default:
return;
}