diff options
author | Jörg Hohensohn <hohensoh@rockbox.org> | 2004-10-19 08:20:38 +0000 |
---|---|---|
committer | Jörg Hohensohn <hohensoh@rockbox.org> | 2004-10-19 08:20:38 +0000 |
commit | ef8d508d5a276c0e738c0e9d6d1b574a6024f0fb (patch) | |
tree | fd823e1f409f3c67e6c45b8e9b213b071e20abf6 | |
parent | 2d6eca7e6687e97d30aa60cc6feb526799f6ca2f (diff) | |
download | rockbox-ef8d508d5a276c0e738c0e9d6d1b574a6024f0fb.tar.gz rockbox-ef8d508d5a276c0e738c0e9d6d1b574a6024f0fb.zip |
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
-rw-r--r-- | apps/main.c | 7 | ||||
-rw-r--r-- | apps/recorder/radio.c | 30 | ||||
-rw-r--r-- | firmware/export/power.h | 5 | ||||
-rw-r--r-- | firmware/export/tuner.h | 5 | ||||
-rw-r--r-- | firmware/powermgmt.c | 2 | ||||
-rw-r--r-- | firmware/tuner_philips.c | 34 | ||||
-rw-r--r-- | 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) | |||
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 | ||
121 | void radio_stop(void) | 121 | void 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 | ||
126 | bool radio_hardware_present(void) | 128 | bool 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 | ||
849 | bool radio_menu(void) | 853 | bool 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); | |||
31 | void power_off(void); | 31 | void 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 */ | ||
35 | extern void radio_set_status(int status); | 38 | extern void radio_set_status(int status); |
36 | extern int radio_get_status(void); | 39 | extern 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: |