summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2008-03-17 23:47:38 +0000
committerJens Arnold <amiconn@rockbox.org>2008-03-17 23:47:38 +0000
commited3ff1b0b5122e898f7310a9b5ed112a22e2828c (patch)
tree10838a643bc95d0792e4bda21ad14a343b374751
parent4071826c813f8e06e93e22049aee07ffc95c3460 (diff)
downloadrockbox-ed3ff1b0b5122e898f7310a9b5ed112a22e2828c.tar.gz
rockbox-ed3ff1b0b5122e898f7310a9b5ed112a22e2828c.zip
Various coldfire fixes: (1) iAudio Bootloader: Check the status of main & remote power button vs. the respective hold switch, and shut down when on hold. On X5/M5 this check is not strictly necessary for the main unit, but left there to keep things uniform. (2) M3: Stop reading the ADC properly before leaving the bootloader, on RoLo, and on reboot, to make it work reliably after those transitions. (3) Disable all interrupt sources on system init to avoid premature ISR calls after enabling interrupts in general. (4) iAudios: Proper implementation of ide_powered(), avoiding nasty HDD clicks in the bootloader when powering down, e.g. because of Hold. (5) Slight optimisations.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16689 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--bootloader/iaudio_coldfire.c44
-rw-r--r--firmware/export/adc.h4
-rw-r--r--firmware/rolo.c1
-rw-r--r--firmware/target/coldfire/iaudio/m3/adc-target.h3
-rw-r--r--firmware/target/coldfire/iaudio/m3/power-m3.c4
-rw-r--r--firmware/target/coldfire/iaudio/m5/power-m5.c12
-rw-r--r--firmware/target/coldfire/iaudio/x5/power-x5.c12
-rw-r--r--firmware/target/coldfire/system-coldfire.c12
8 files changed, 71 insertions, 21 deletions
diff --git a/bootloader/iaudio_coldfire.c b/bootloader/iaudio_coldfire.c
index a80a202d41..bb7fbebd3e 100644
--- a/bootloader/iaudio_coldfire.c
+++ b/bootloader/iaudio_coldfire.c
@@ -67,6 +67,7 @@ inline void __reset_cookie(void)
67 67
68void start_firmware(void) 68void start_firmware(void)
69{ 69{
70 adc_close();
70 asm(" move.w #0x2700,%sr"); 71 asm(" move.w #0x2700,%sr");
71 __reset_cookie(); 72 __reset_cookie();
72 asm(" move.l %0,%%d0" :: "i"(DRAM_START)); 73 asm(" move.l %0,%%d0" :: "i"(DRAM_START));
@@ -126,16 +127,35 @@ void main(void)
126 int rc; 127 int rc;
127 bool rc_on_button = false; 128 bool rc_on_button = false;
128 bool on_button = false; 129 bool on_button = false;
129 bool rec_button = false; 130
130 bool hold_status = false; 131 /* We want to read the buttons as early as possible, before the user
132 releases the ON button */
133
134#ifdef IAUDIO_M3
135 or_l(0x80000000, &GPIO_FUNCTION); /* remote Play button */
136 and_l(~0x80000000, &GPIO_ENABLE);
137 or_l(0x00000202, &GPIO1_FUNCTION); /* main Hold & Play */
138
139 if ((GPIO1_READ & 0x000000002) == 0)
140 on_button = true;
141
142 if ((GPIO_READ & 0x80000000) == 0)
143 rc_on_button = true;
144#elif defined(IAUDIO_M5) || defined(IAUDIO_X5)
131 int data; 145 int data;
132 146
133 (void)rc_on_button; 147 or_l(0x0e000000, &GPIO_FUNCTION); /* main Hold & Power, remote Play */
134 (void)on_button; 148 and_l(~0x0e000000, &GPIO_ENABLE);
135 (void)rec_button; 149
136 (void)hold_status; 150 data = GPIO_READ;
137 (void)data;
138 151
152 if ((data & 0x04000000) == 0)
153 on_button = true;
154
155 if ((data & 0x02000000) == 0)
156 rc_on_button = true;
157#endif
158
139 power_init(); 159 power_init();
140 160
141 system_init(); 161 system_init();
@@ -153,6 +173,16 @@ void main(void)
153 font_init(); 173 font_init();
154 adc_init(); 174 adc_init();
155 button_init(); 175 button_init();
176
177 if ((!on_button || button_hold())
178 && (!rc_on_button || remote_button_hold())
179 && !charger_inserted())
180 {
181 /* No need to check for USB connection here, as USB is handled
182 * in the cowon loader. */
183 printf("Hold switch on");
184 shutdown();
185 }
156 186
157 printf("Rockbox boot loader"); 187 printf("Rockbox boot loader");
158 printf("Version %s", version); 188 printf("Version %s", version);
diff --git a/firmware/export/adc.h b/firmware/export/adc.h
index e10cce0d27..54d5d98212 100644
--- a/firmware/export/adc.h
+++ b/firmware/export/adc.h
@@ -25,4 +25,8 @@
25unsigned short adc_read(int channel); 25unsigned short adc_read(int channel);
26void adc_init(void); 26void adc_init(void);
27 27
28#ifndef NEED_ADC_CLOSE
29#define adc_close()
30#endif
31
28#endif /* _ADC_H_ */ 32#endif /* _ADC_H_ */
diff --git a/firmware/rolo.c b/firmware/rolo.c
index 2a4b753948..eac45e10ce 100644
--- a/firmware/rolo.c
+++ b/firmware/rolo.c
@@ -269,6 +269,7 @@ int rolo_load(const char* filename)
269 lcd_remote_puts(0, 1, "Executing"); 269 lcd_remote_puts(0, 1, "Executing");
270 lcd_remote_update(); 270 lcd_remote_update();
271#endif 271#endif
272 adc_close();
272 273
273 set_irq_level(HIGHEST_IRQ_LEVEL); 274 set_irq_level(HIGHEST_IRQ_LEVEL);
274#elif CONFIG_CPU == SH7034 275#elif CONFIG_CPU == SH7034
diff --git a/firmware/target/coldfire/iaudio/m3/adc-target.h b/firmware/target/coldfire/iaudio/m3/adc-target.h
index e5ff818647..40ed226bea 100644
--- a/firmware/target/coldfire/iaudio/m3/adc-target.h
+++ b/firmware/target/coldfire/iaudio/m3/adc-target.h
@@ -26,4 +26,7 @@
26#define ADC_BATTERY 1 26#define ADC_BATTERY 1
27#define ADC_REMOTE 2 27#define ADC_REMOTE 2
28 28
29#define NEED_ADC_CLOSE
30void adc_close(void);
31
29#endif /* _ADC_TARGET_H_ */ 32#endif /* _ADC_TARGET_H_ */
diff --git a/firmware/target/coldfire/iaudio/m3/power-m3.c b/firmware/target/coldfire/iaudio/m3/power-m3.c
index 52a5de3460..a7f3fc46be 100644
--- a/firmware/target/coldfire/iaudio/m3/power-m3.c
+++ b/firmware/target/coldfire/iaudio/m3/power-m3.c
@@ -36,7 +36,7 @@ void power_init(void)
36 /* Charger detect */ 36 /* Charger detect */
37 and_l(~0x00000020, &GPIO1_ENABLE); 37 and_l(~0x00000020, &GPIO1_ENABLE);
38 or_l(0x00000020, &GPIO1_FUNCTION); 38 or_l(0x00000020, &GPIO1_FUNCTION);
39 39
40 /* FIXME: Just disable the multi-colour LED for now. */ 40 /* FIXME: Just disable the multi-colour LED for now. */
41 and_l(~0x00000210, &GPIO1_OUT); 41 and_l(~0x00000210, &GPIO1_OUT);
42 and_l(~0x00008000, &GPIO_OUT); 42 and_l(~0x00008000, &GPIO_OUT);
@@ -61,7 +61,7 @@ void ide_power_enable(bool on)
61 61
62bool ide_powered(void) 62bool ide_powered(void)
63{ 63{
64 return false; 64 return (GPIO_OUT & 0x00800000) != 0;
65} 65}
66 66
67void power_off(void) 67void power_off(void)
diff --git a/firmware/target/coldfire/iaudio/m5/power-m5.c b/firmware/target/coldfire/iaudio/m5/power-m5.c
index d33cbec8be..939cae02f2 100644
--- a/firmware/target/coldfire/iaudio/m5/power-m5.c
+++ b/firmware/target/coldfire/iaudio/m5/power-m5.c
@@ -38,23 +38,23 @@ void power_init(void)
38 38
39bool charger_inserted(void) 39bool charger_inserted(void)
40{ 40{
41 return (GPIO1_READ & 0x01000000)?true:false; 41 return (GPIO1_READ & 0x01000000) != 0;
42} 42}
43 43
44void ide_power_enable(bool on) 44void ide_power_enable(bool on)
45{ 45{
46 /* GPOOD3 */ 46 /* GPOOD3 */
47 int level = set_irq_level(HIGHEST_IRQ_LEVEL); 47 int level = set_irq_level(HIGHEST_IRQ_LEVEL);
48 if(on) 48 pcf50606_write(0x3c, on ? 0x07 : 0x00);
49 pcf50606_write(0x3c, 0x07);
50 else
51 pcf50606_write(0x3c, 0x00);
52 set_irq_level(level); 49 set_irq_level(level);
53} 50}
54 51
55bool ide_powered(void) 52bool ide_powered(void)
56{ 53{
57 return false; 54 int level = set_irq_level(HIGHEST_IRQ_LEVEL);
55 int value = pcf50606_read(0x3c);
56 set_irq_level(level);
57 return (value & 0x07) != 0;
58} 58}
59 59
60void power_off(void) 60void power_off(void)
diff --git a/firmware/target/coldfire/iaudio/x5/power-x5.c b/firmware/target/coldfire/iaudio/x5/power-x5.c
index cfcb384a24..068b25f577 100644
--- a/firmware/target/coldfire/iaudio/x5/power-x5.c
+++ b/firmware/target/coldfire/iaudio/x5/power-x5.c
@@ -38,23 +38,23 @@ void power_init(void)
38 38
39bool charger_inserted(void) 39bool charger_inserted(void)
40{ 40{
41 return (GPIO1_READ & 0x01000000)?true:false; 41 return (GPIO1_READ & 0x01000000) != 0;
42} 42}
43 43
44void ide_power_enable(bool on) 44void ide_power_enable(bool on)
45{ 45{
46 /* GPOOD3 */ 46 /* GPOOD3 */
47 int level = set_irq_level(HIGHEST_IRQ_LEVEL); 47 int level = set_irq_level(HIGHEST_IRQ_LEVEL);
48 if(on) 48 pcf50606_write(0x3c, on ? 0x07 : 0x00);
49 pcf50606_write(0x3c, 0x07);
50 else
51 pcf50606_write(0x3c, 0x00);
52 set_irq_level(level); 49 set_irq_level(level);
53} 50}
54 51
55bool ide_powered(void) 52bool ide_powered(void)
56{ 53{
57 return false; 54 int level = set_irq_level(HIGHEST_IRQ_LEVEL);
55 int value = pcf50606_read(0x3c);
56 set_irq_level(level);
57 return (value & 0x07) != 0;
58} 58}
59 59
60void power_off(void) 60void power_off(void)
diff --git a/firmware/target/coldfire/system-coldfire.c b/firmware/target/coldfire/system-coldfire.c
index 97e9d35aaa..60f7ab12ad 100644
--- a/firmware/target/coldfire/system-coldfire.c
+++ b/firmware/target/coldfire/system-coldfire.c
@@ -18,6 +18,7 @@
18 ****************************************************************************/ 18 ****************************************************************************/
19#include <stdio.h> 19#include <stdio.h>
20#include "config.h" 20#include "config.h"
21#include "adc.h"
21#include "system.h" 22#include "system.h"
22#include "lcd.h" 23#include "lcd.h"
23#include "font.h" 24#include "font.h"
@@ -254,6 +255,16 @@ void system_init(void)
254 what'll be the most useful for most things which the main thread 255 what'll be the most useful for most things which the main thread
255 will do. */ 256 will do. */
256 coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE); 257 coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE);
258
259 IMR = 0x3ffff;
260 INTPRI1 = 0;
261 INTPRI2 = 0;
262 INTPRI3 = 0;
263 INTPRI4 = 0;
264 INTPRI5 = 0;
265 INTPRI6 = 0;
266 INTPRI7 = 0;
267 INTPRI8 = 0;
257 268
258 /* Set INTBASE and SPURVEC */ 269 /* Set INTBASE and SPURVEC */
259 INTBASE = 64; 270 INTBASE = 64;
@@ -268,6 +279,7 @@ void system_init(void)
268 279
269void system_reboot (void) 280void system_reboot (void)
270{ 281{
282 adc_close();
271 set_cpu_frequency(0); 283 set_cpu_frequency(0);
272 284
273 asm(" move.w #0x2700,%sr"); 285 asm(" move.w #0x2700,%sr");