summaryrefslogtreecommitdiff
path: root/firmware/target
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 /firmware/target
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
Diffstat (limited to 'firmware/target')
-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
5 files changed, 29 insertions, 14 deletions
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");