From ef8d508d5a276c0e738c0e9d6d1b574a6024f0fb Mon Sep 17 00:00:00 2001 From: Jörg Hohensohn Date: Tue, 19 Oct 2004 08:20:38 +0000 Subject: tuner cleanup + improvements: - use sleep and powerdown for those who can - philips station search works now git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5306 a1c6a512-1295-4272-9138-f99709370657 --- apps/main.c | 7 ++++--- apps/recorder/radio.c | 30 +++++++++++++++++++----------- firmware/export/power.h | 5 ++++- firmware/export/tuner.h | 5 +++-- firmware/powermgmt.c | 2 +- firmware/tuner_philips.c | 34 +++++++++++++++++++++++++++------- firmware/tuner_samsung.c | 19 ++++++++++++------- 7 files changed, 70 insertions(+), 32 deletions(-) diff --git a/apps/main.c b/apps/main.c index a1483c756d..de23b64e4d 100644 --- a/apps/main.c +++ b/apps/main.c @@ -196,6 +196,10 @@ void init(void) powermgmt_init(); +#ifdef CONFIG_TUNER + radio_init(); +#endif + #ifdef HAVE_CHARGING if (coldstart && charger_inserted() && !global_settings.car_adapter_mode) { @@ -288,9 +292,6 @@ void init(void) global_settings.superbass); mpeg_init(); talk_init(); -#ifdef CONFIG_TUNER - radio_init(); -#endif #ifdef AUTOROCK if (!usb_detect()) diff --git a/apps/recorder/radio.c b/apps/recorder/radio.c index d60d1bd4d7..125bb5abbb 100644 --- a/apps/recorder/radio.c +++ b/apps/recorder/radio.c @@ -20,7 +20,6 @@ #include "config.h" #include #include -#include #include "sprintf.h" #include "lcd.h" #include "mas.h" @@ -116,11 +115,14 @@ void radio_init(void) radio_get = samsung_get; } #endif + radio_set(RADIO_SLEEP, 1); /* low power mode, if available */ } void radio_stop(void) { radio_set(RADIO_MUTE, 1); + radio_set(RADIO_SLEEP, 1); /* low power mode, if available */ + radio_set_status(FMRADIO_OFF); /* status update, power off if avail. */ } bool radio_hardware_present(void) @@ -128,7 +130,7 @@ bool radio_hardware_present(void) #ifdef HAVE_TUNER_PWR_CTRL bool ret; int fmstatus = radio_get_status(); /* get current state */ - radio_set_status(FMRADIO_PLAYING); /* power it up */ + radio_set_status(FMRADIO_POWERED); /* power it up */ ret = radio_get(RADIO_PRESENT); radio_set_status(fmstatus); /* restore previous state */ return ret; @@ -161,7 +163,7 @@ bool radio_screen(void) bool done = false; int button; int freq; - int freq_diff; + bool tuned; bool stereo = false; int search_dir = 0; int fw, fh; @@ -222,7 +224,7 @@ bool radio_screen(void) curr_freq = global_settings.last_frequency * FREQ_STEP + MIN_FREQ; - radio_set(RADIO_INIT, 0); + radio_set(RADIO_SLEEP, 0); /* wake up the tuner */ radio_set(RADIO_FREQUENCY, curr_freq); radio_set(RADIO_IF_MEASUREMENT, 0); radio_set(RADIO_SENSITIVITY, 0); @@ -255,10 +257,10 @@ bool radio_screen(void) sleep(1); /* Now check how close to the IF frequency we are */ - freq_diff = radio_get(RADIO_DEVIATION); + tuned = radio_get(RADIO_TUNED); /* Stop searching if the tuning is close */ - if(abs(freq_diff) < 50) + if(tuned) { search_dir = 0; curr_preset = find_preset(curr_freq); @@ -283,7 +285,6 @@ bool radio_screen(void) else #endif { - radio_stop(); done = true; } update_screen = true; @@ -416,7 +417,6 @@ bool radio_screen(void) if(mpeg_status() != MPEG_STATUS_RECORD) { default_event_handler(SYS_USB_CONNECTED); - radio_set_status(0); screen_freeze = true; /* Cosmetic: makes sure the radio screen doesn't redraw */ done = true; @@ -540,15 +540,19 @@ bool radio_screen(void) sound_settings_apply(); - radio_set_status(0); - if(keep_playing) { /* Enable the Left and right A/D Converter */ mpeg_set_recording_gain(mpeg_sound_default(SOUND_LEFT_GAIN), mpeg_sound_default(SOUND_RIGHT_GAIN), false); mas_codec_writereg(6, 0x4000); + radio_set_status(FMRADIO_POWERED); /* leave it powered */ + } + else + { + radio_stop(); } + #endif return have_recorded; } @@ -848,12 +852,16 @@ static bool toggle_mono_mode(void) bool radio_menu(void) { - struct menu_item items[3]; + struct menu_item items[4]; int m; bool result; m = menu_init(items, 0, NULL, NULL, NULL, NULL); +#if CONFIG_KEYPAD == ONDIO_PAD /* Ondio has no key for presets, put it in menu */ + /* fixme: make a real string table entry */ + menu_insert(m, -1, ID2P(LANG_FM_BUTTONBAR_PRESETS), handle_radio_presets_menu); +#endif create_monomode_menu(); menu_insert(m, -1, monomode_menu_string, toggle_mono_mode); menu_insert(m, -1, ID2P(LANG_SOUND_SETTINGS), sound_menu); diff --git a/firmware/export/power.h b/firmware/export/power.h index 3ced9fc38b..eea3648053 100644 --- a/firmware/export/power.h +++ b/firmware/export/power.h @@ -31,7 +31,10 @@ bool ide_powered(void); void power_off(void); #ifdef CONFIG_TUNER -#define FMRADIO_PLAYING 1 +/* status values */ +#define FMRADIO_OFF 0 /* switched off */ +#define FMRADIO_POWERED 1 /* left powered, but idle */ +#define FMRADIO_PLAYING 2 /* actively in use */ extern void radio_set_status(int status); extern int radio_get_status(void); #endif diff --git a/firmware/export/tuner.h b/firmware/export/tuner.h index c399bb391b..a6a7e8ee0e 100644 --- a/firmware/export/tuner.h +++ b/firmware/export/tuner.h @@ -21,7 +21,7 @@ #define __TUNER_SAMSUNG_H__ /* settings to the tuner layer */ -#define RADIO_INIT 0 +#define RADIO_SLEEP 0 #define RADIO_FREQUENCY 1 #define RADIO_MUTE 2 #define RADIO_IF_MEASUREMENT 3 @@ -29,8 +29,9 @@ #define RADIO_FORCE_MONO 5 /* readback from the tuner layer */ #define RADIO_PRESENT 0 -#define RADIO_DEVIATION 1 +#define RADIO_TUNED 1 #define RADIO_STEREO 2 +#define RADIO_ALL 3 /* debug */ #ifdef CONFIG_TUNER diff --git a/firmware/powermgmt.c b/firmware/powermgmt.c index 7d67ec2f5b..26759b647d 100644 --- a/firmware/powermgmt.c +++ b/firmware/powermgmt.c @@ -322,7 +322,7 @@ static void handle_auto_poweroff(void) if(timeout && #ifdef CONFIG_TUNER - !radio_get_status() && + (radio_get_status() != FMRADIO_PLAYING) && #endif !usb_inserted() && (mpeg_stat == 0 || diff --git a/firmware/tuner_philips.c b/firmware/tuner_philips.c index 3fdf0f7cd0..68b0938348 100644 --- a/firmware/tuner_philips.c +++ b/firmware/tuner_philips.c @@ -20,6 +20,8 @@ #include #include +#include +#include "kernel.h" #include "tuner.h" /* tuner abstraction interface */ #include "fmradio_i2c.h" /* physical interface driver */ @@ -31,8 +33,17 @@ void philips_set(int setting, int value) { switch(setting) { - case RADIO_INIT: - memset(write_bytes, 0, sizeof(write_bytes)); + case RADIO_SLEEP: + /* init values */ + write_bytes[0] = 0x80; /* mute */ + write_bytes[1] = 0x00; + write_bytes[2] = 0x00; + write_bytes[3] = 0x0A; /* soft mute, stereo noise cancelling */ + write_bytes[4] = 0x00; + if (value) /* sleep */ + { + write_bytes[3] |= 0x40; /* standby mode */ + } break; case RADIO_FREQUENCY: @@ -53,8 +64,6 @@ void philips_set(int setting, int value) fmradio_i2c_write(I2C_ADR, write_bytes, sizeof(write_bytes)); break; - case RADIO_IF_MEASUREMENT: - case RADIO_SENSITIVITY: default: return; } @@ -75,14 +84,25 @@ int philips_get(int setting) val = 1; /* true */ break; - case RADIO_DEVIATION: - val = read_bytes[2] & 0x7F; - val = 222 - val*4; /* convert to kHz */ + case RADIO_TUNED: + val = 0; + if (read_bytes[0] & 0x80) /* ready */ + { + val = read_bytes[2] & 0x7F; /* IF counter */ + val = (abs(val - 0x36) < 2); /* close match */ + } break; case RADIO_STEREO: val = read_bytes[2] >> 7; break; + + case RADIO_ALL: /* debug query */ + val = read_bytes[0] << 24 + | read_bytes[1] << 16 + | read_bytes[2] << 8 + | read_bytes[3]; + break; } return val; } diff --git a/firmware/tuner_samsung.c b/firmware/tuner_samsung.c index 98166e1d4d..f54748e7c6 100644 --- a/firmware/tuner_samsung.c +++ b/firmware/tuner_samsung.c @@ -19,6 +19,7 @@ ****************************************************************************/ #include +#include #include "tuner.h" /* tuner abstraction interface */ #include "fmradio.h" /* physical interface driver */ @@ -35,11 +36,15 @@ void samsung_set(int setting, int value) { switch(setting) { - case RADIO_INIT: - fm_in1 = DEFAULT_IN1; - fm_in2 = DEFAULT_IN2; - fmradio_set(1, fm_in1); - fmradio_set(2, fm_in2); + case RADIO_SLEEP: + if (!value) + { /* wakeup: just unit */ + fm_in1 = DEFAULT_IN1; + fm_in2 = DEFAULT_IN2; + fmradio_set(1, fm_in1); + fmradio_set(2, fm_in2); + } + /* else we have no sleep mode? */ break; case RADIO_FREQUENCY: @@ -96,9 +101,9 @@ int samsung_get(int setting) val = (val == 0x140885); break; - case RADIO_DEVIATION: + case RADIO_TUNED: val = fmradio_read(3); - val = 10700 - ((val & 0x7ffff) / 8); /* convert to kHz */ + val = abs(10700 - ((val & 0x7ffff) / 8)) < 50; /* convert to kHz */ break; case RADIO_STEREO: -- cgit v1.2.3