summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/main.c7
-rw-r--r--apps/recorder/radio.c30
-rw-r--r--firmware/export/power.h5
-rw-r--r--firmware/export/tuner.h5
-rw-r--r--firmware/powermgmt.c2
-rw-r--r--firmware/tuner_philips.c34
-rw-r--r--firmware/tuner_samsung.c19
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)
196 196
197 powermgmt_init(); 197 powermgmt_init();
198 198
199#ifdef CONFIG_TUNER
200 radio_init();
201#endif
202
199#ifdef HAVE_CHARGING 203#ifdef HAVE_CHARGING
200 if (coldstart && charger_inserted() && !global_settings.car_adapter_mode) 204 if (coldstart && charger_inserted() && !global_settings.car_adapter_mode)
201 { 205 {
@@ -288,9 +292,6 @@ void init(void)
288 global_settings.superbass); 292 global_settings.superbass);
289 mpeg_init(); 293 mpeg_init();
290 talk_init(); 294 talk_init();
291#ifdef CONFIG_TUNER
292 radio_init();
293#endif
294 295
295#ifdef AUTOROCK 296#ifdef AUTOROCK
296 if (!usb_detect()) 297 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 @@
20#include "config.h" 20#include "config.h"
21#include <stdio.h> 21#include <stdio.h>
22#include <stdbool.h> 22#include <stdbool.h>
23#include <stdlib.h>
24#include "sprintf.h" 23#include "sprintf.h"
25#include "lcd.h" 24#include "lcd.h"
26#include "mas.h" 25#include "mas.h"
@@ -116,11 +115,14 @@ void radio_init(void)
116 radio_get = samsung_get; 115 radio_get = samsung_get;
117 } 116 }
118#endif 117#endif
118 radio_set(RADIO_SLEEP, 1); /* low power mode, if available */
119} 119}
120 120
121void radio_stop(void) 121void radio_stop(void)
122{ 122{
123 radio_set(RADIO_MUTE, 1); 123 radio_set(RADIO_MUTE, 1);
124 radio_set(RADIO_SLEEP, 1); /* low power mode, if available */
125 radio_set_status(FMRADIO_OFF); /* status update, power off if avail. */
124} 126}
125 127
126bool radio_hardware_present(void) 128bool radio_hardware_present(void)
@@ -128,7 +130,7 @@ bool radio_hardware_present(void)
128#ifdef HAVE_TUNER_PWR_CTRL 130#ifdef HAVE_TUNER_PWR_CTRL
129 bool ret; 131 bool ret;
130 int fmstatus = radio_get_status(); /* get current state */ 132 int fmstatus = radio_get_status(); /* get current state */
131 radio_set_status(FMRADIO_PLAYING); /* power it up */ 133 radio_set_status(FMRADIO_POWERED); /* power it up */
132 ret = radio_get(RADIO_PRESENT); 134 ret = radio_get(RADIO_PRESENT);
133 radio_set_status(fmstatus); /* restore previous state */ 135 radio_set_status(fmstatus); /* restore previous state */
134 return ret; 136 return ret;
@@ -161,7 +163,7 @@ bool radio_screen(void)
161 bool done = false; 163 bool done = false;
162 int button; 164 int button;
163 int freq; 165 int freq;
164 int freq_diff; 166 bool tuned;
165 bool stereo = false; 167 bool stereo = false;
166 int search_dir = 0; 168 int search_dir = 0;
167 int fw, fh; 169 int fw, fh;
@@ -222,7 +224,7 @@ bool radio_screen(void)
222 224
223 curr_freq = global_settings.last_frequency * FREQ_STEP + MIN_FREQ; 225 curr_freq = global_settings.last_frequency * FREQ_STEP + MIN_FREQ;
224 226
225 radio_set(RADIO_INIT, 0); 227 radio_set(RADIO_SLEEP, 0); /* wake up the tuner */
226 radio_set(RADIO_FREQUENCY, curr_freq); 228 radio_set(RADIO_FREQUENCY, curr_freq);
227 radio_set(RADIO_IF_MEASUREMENT, 0); 229 radio_set(RADIO_IF_MEASUREMENT, 0);
228 radio_set(RADIO_SENSITIVITY, 0); 230 radio_set(RADIO_SENSITIVITY, 0);
@@ -255,10 +257,10 @@ bool radio_screen(void)
255 sleep(1); 257 sleep(1);
256 258
257 /* Now check how close to the IF frequency we are */ 259 /* Now check how close to the IF frequency we are */
258 freq_diff = radio_get(RADIO_DEVIATION); 260 tuned = radio_get(RADIO_TUNED);
259 261
260 /* Stop searching if the tuning is close */ 262 /* Stop searching if the tuning is close */
261 if(abs(freq_diff) < 50) 263 if(tuned)
262 { 264 {
263 search_dir = 0; 265 search_dir = 0;
264 curr_preset = find_preset(curr_freq); 266 curr_preset = find_preset(curr_freq);
@@ -283,7 +285,6 @@ bool radio_screen(void)
283 else 285 else
284#endif 286#endif
285 { 287 {
286 radio_stop();
287 done = true; 288 done = true;
288 } 289 }
289 update_screen = true; 290 update_screen = true;
@@ -416,7 +417,6 @@ bool radio_screen(void)
416 if(mpeg_status() != MPEG_STATUS_RECORD) 417 if(mpeg_status() != MPEG_STATUS_RECORD)
417 { 418 {
418 default_event_handler(SYS_USB_CONNECTED); 419 default_event_handler(SYS_USB_CONNECTED);
419 radio_set_status(0);
420 screen_freeze = true; /* Cosmetic: makes sure the 420 screen_freeze = true; /* Cosmetic: makes sure the
421 radio screen doesn't redraw */ 421 radio screen doesn't redraw */
422 done = true; 422 done = true;
@@ -540,15 +540,19 @@ bool radio_screen(void)
540 540
541 sound_settings_apply(); 541 sound_settings_apply();
542 542
543 radio_set_status(0);
544
545 if(keep_playing) 543 if(keep_playing)
546 { 544 {
547 /* Enable the Left and right A/D Converter */ 545 /* Enable the Left and right A/D Converter */
548 mpeg_set_recording_gain(mpeg_sound_default(SOUND_LEFT_GAIN), 546 mpeg_set_recording_gain(mpeg_sound_default(SOUND_LEFT_GAIN),
549 mpeg_sound_default(SOUND_RIGHT_GAIN), false); 547 mpeg_sound_default(SOUND_RIGHT_GAIN), false);
550 mas_codec_writereg(6, 0x4000); 548 mas_codec_writereg(6, 0x4000);
549 radio_set_status(FMRADIO_POWERED); /* leave it powered */
550 }
551 else
552 {
553 radio_stop();
551 } 554 }
555
552#endif 556#endif
553 return have_recorded; 557 return have_recorded;
554} 558}
@@ -848,12 +852,16 @@ static bool toggle_mono_mode(void)
848 852
849bool radio_menu(void) 853bool radio_menu(void)
850{ 854{
851 struct menu_item items[3]; 855 struct menu_item items[4];
852 int m; 856 int m;
853 bool result; 857 bool result;
854 858
855 m = menu_init(items, 0, NULL, NULL, NULL, NULL); 859 m = menu_init(items, 0, NULL, NULL, NULL, NULL);
856 860
861#if CONFIG_KEYPAD == ONDIO_PAD /* Ondio has no key for presets, put it in menu */
862 /* fixme: make a real string table entry */
863 menu_insert(m, -1, ID2P(LANG_FM_BUTTONBAR_PRESETS), handle_radio_presets_menu);
864#endif
857 create_monomode_menu(); 865 create_monomode_menu();
858 menu_insert(m, -1, monomode_menu_string, toggle_mono_mode); 866 menu_insert(m, -1, monomode_menu_string, toggle_mono_mode);
859 menu_insert(m, -1, ID2P(LANG_SOUND_SETTINGS), sound_menu); 867 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);
31void power_off(void); 31void power_off(void);
32 32
33#ifdef CONFIG_TUNER 33#ifdef CONFIG_TUNER
34#define FMRADIO_PLAYING 1 34/* status values */
35#define FMRADIO_OFF 0 /* switched off */
36#define FMRADIO_POWERED 1 /* left powered, but idle */
37#define FMRADIO_PLAYING 2 /* actively in use */
35extern void radio_set_status(int status); 38extern void radio_set_status(int status);
36extern int radio_get_status(void); 39extern int radio_get_status(void);
37#endif 40#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 @@
21#define __TUNER_SAMSUNG_H__ 21#define __TUNER_SAMSUNG_H__
22 22
23/* settings to the tuner layer */ 23/* settings to the tuner layer */
24#define RADIO_INIT 0 24#define RADIO_SLEEP 0
25#define RADIO_FREQUENCY 1 25#define RADIO_FREQUENCY 1
26#define RADIO_MUTE 2 26#define RADIO_MUTE 2
27#define RADIO_IF_MEASUREMENT 3 27#define RADIO_IF_MEASUREMENT 3
@@ -29,8 +29,9 @@
29#define RADIO_FORCE_MONO 5 29#define RADIO_FORCE_MONO 5
30/* readback from the tuner layer */ 30/* readback from the tuner layer */
31#define RADIO_PRESENT 0 31#define RADIO_PRESENT 0
32#define RADIO_DEVIATION 1 32#define RADIO_TUNED 1
33#define RADIO_STEREO 2 33#define RADIO_STEREO 2
34#define RADIO_ALL 3 /* debug */
34 35
35#ifdef CONFIG_TUNER 36#ifdef CONFIG_TUNER
36 37
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)
322 322
323 if(timeout && 323 if(timeout &&
324#ifdef CONFIG_TUNER 324#ifdef CONFIG_TUNER
325 !radio_get_status() && 325 (radio_get_status() != FMRADIO_PLAYING) &&
326#endif 326#endif
327 !usb_inserted() && 327 !usb_inserted() &&
328 (mpeg_stat == 0 || 328 (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 @@
20 20
21#include <stdbool.h> 21#include <stdbool.h>
22#include <string.h> 22#include <string.h>
23#include <stdlib.h>
24#include "kernel.h"
23#include "tuner.h" /* tuner abstraction interface */ 25#include "tuner.h" /* tuner abstraction interface */
24#include "fmradio_i2c.h" /* physical interface driver */ 26#include "fmradio_i2c.h" /* physical interface driver */
25 27
@@ -31,8 +33,17 @@ void philips_set(int setting, int value)
31{ 33{
32 switch(setting) 34 switch(setting)
33 { 35 {
34 case RADIO_INIT: 36 case RADIO_SLEEP:
35 memset(write_bytes, 0, sizeof(write_bytes)); 37 /* init values */
38 write_bytes[0] = 0x80; /* mute */
39 write_bytes[1] = 0x00;
40 write_bytes[2] = 0x00;
41 write_bytes[3] = 0x0A; /* soft mute, stereo noise cancelling */
42 write_bytes[4] = 0x00;
43 if (value) /* sleep */
44 {
45 write_bytes[3] |= 0x40; /* standby mode */
46 }
36 break; 47 break;
37 48
38 case RADIO_FREQUENCY: 49 case RADIO_FREQUENCY:
@@ -53,8 +64,6 @@ void philips_set(int setting, int value)
53 fmradio_i2c_write(I2C_ADR, write_bytes, sizeof(write_bytes)); 64 fmradio_i2c_write(I2C_ADR, write_bytes, sizeof(write_bytes));
54 break; 65 break;
55 66
56 case RADIO_IF_MEASUREMENT:
57 case RADIO_SENSITIVITY:
58 default: 67 default:
59 return; 68 return;
60 } 69 }
@@ -75,14 +84,25 @@ int philips_get(int setting)
75 val = 1; /* true */ 84 val = 1; /* true */
76 break; 85 break;
77 86
78 case RADIO_DEVIATION: 87 case RADIO_TUNED:
79 val = read_bytes[2] & 0x7F; 88 val = 0;
80 val = 222 - val*4; /* convert to kHz */ 89 if (read_bytes[0] & 0x80) /* ready */
90 {
91 val = read_bytes[2] & 0x7F; /* IF counter */
92 val = (abs(val - 0x36) < 2); /* close match */
93 }
81 break; 94 break;
82 95
83 case RADIO_STEREO: 96 case RADIO_STEREO:
84 val = read_bytes[2] >> 7; 97 val = read_bytes[2] >> 7;
85 break; 98 break;
99
100 case RADIO_ALL: /* debug query */
101 val = read_bytes[0] << 24
102 | read_bytes[1] << 16
103 | read_bytes[2] << 8
104 | read_bytes[3];
105 break;
86 } 106 }
87 return val; 107 return val;
88} 108}
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 @@
19 ****************************************************************************/ 19 ****************************************************************************/
20 20
21#include <stdbool.h> 21#include <stdbool.h>
22#include <stdlib.h>
22#include "tuner.h" /* tuner abstraction interface */ 23#include "tuner.h" /* tuner abstraction interface */
23#include "fmradio.h" /* physical interface driver */ 24#include "fmradio.h" /* physical interface driver */
24 25
@@ -35,11 +36,15 @@ void samsung_set(int setting, int value)
35{ 36{
36 switch(setting) 37 switch(setting)
37 { 38 {
38 case RADIO_INIT: 39 case RADIO_SLEEP:
39 fm_in1 = DEFAULT_IN1; 40 if (!value)
40 fm_in2 = DEFAULT_IN2; 41 { /* wakeup: just unit */
41 fmradio_set(1, fm_in1); 42 fm_in1 = DEFAULT_IN1;
42 fmradio_set(2, fm_in2); 43 fm_in2 = DEFAULT_IN2;
44 fmradio_set(1, fm_in1);
45 fmradio_set(2, fm_in2);
46 }
47 /* else we have no sleep mode? */
43 break; 48 break;
44 49
45 case RADIO_FREQUENCY: 50 case RADIO_FREQUENCY:
@@ -96,9 +101,9 @@ int samsung_get(int setting)
96 val = (val == 0x140885); 101 val = (val == 0x140885);
97 break; 102 break;
98 103
99 case RADIO_DEVIATION: 104 case RADIO_TUNED:
100 val = fmradio_read(3); 105 val = fmradio_read(3);
101 val = 10700 - ((val & 0x7ffff) / 8); /* convert to kHz */ 106 val = abs(10700 - ((val & 0x7ffff) / 8)) < 50; /* convert to kHz */
102 break; 107 break;
103 108
104 case RADIO_STEREO: 109 case RADIO_STEREO: