mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
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
This commit is contained in:
parent
4071826c81
commit
ed3ff1b0b5
8 changed files with 71 additions and 21 deletions
|
@ -67,6 +67,7 @@ inline void __reset_cookie(void)
|
||||||
|
|
||||||
void start_firmware(void)
|
void start_firmware(void)
|
||||||
{
|
{
|
||||||
|
adc_close();
|
||||||
asm(" move.w #0x2700,%sr");
|
asm(" move.w #0x2700,%sr");
|
||||||
__reset_cookie();
|
__reset_cookie();
|
||||||
asm(" move.l %0,%%d0" :: "i"(DRAM_START));
|
asm(" move.l %0,%%d0" :: "i"(DRAM_START));
|
||||||
|
@ -126,16 +127,35 @@ void main(void)
|
||||||
int rc;
|
int rc;
|
||||||
bool rc_on_button = false;
|
bool rc_on_button = false;
|
||||||
bool on_button = false;
|
bool on_button = false;
|
||||||
bool rec_button = false;
|
|
||||||
bool hold_status = false;
|
/* We want to read the buttons as early as possible, before the user
|
||||||
|
releases the ON button */
|
||||||
|
|
||||||
|
#ifdef IAUDIO_M3
|
||||||
|
or_l(0x80000000, &GPIO_FUNCTION); /* remote Play button */
|
||||||
|
and_l(~0x80000000, &GPIO_ENABLE);
|
||||||
|
or_l(0x00000202, &GPIO1_FUNCTION); /* main Hold & Play */
|
||||||
|
|
||||||
|
if ((GPIO1_READ & 0x000000002) == 0)
|
||||||
|
on_button = true;
|
||||||
|
|
||||||
|
if ((GPIO_READ & 0x80000000) == 0)
|
||||||
|
rc_on_button = true;
|
||||||
|
#elif defined(IAUDIO_M5) || defined(IAUDIO_X5)
|
||||||
int data;
|
int data;
|
||||||
|
|
||||||
(void)rc_on_button;
|
or_l(0x0e000000, &GPIO_FUNCTION); /* main Hold & Power, remote Play */
|
||||||
(void)on_button;
|
and_l(~0x0e000000, &GPIO_ENABLE);
|
||||||
(void)rec_button;
|
|
||||||
(void)hold_status;
|
|
||||||
(void)data;
|
|
||||||
|
|
||||||
|
data = GPIO_READ;
|
||||||
|
|
||||||
|
if ((data & 0x04000000) == 0)
|
||||||
|
on_button = true;
|
||||||
|
|
||||||
|
if ((data & 0x02000000) == 0)
|
||||||
|
rc_on_button = true;
|
||||||
|
#endif
|
||||||
|
|
||||||
power_init();
|
power_init();
|
||||||
|
|
||||||
system_init();
|
system_init();
|
||||||
|
@ -153,6 +173,16 @@ void main(void)
|
||||||
font_init();
|
font_init();
|
||||||
adc_init();
|
adc_init();
|
||||||
button_init();
|
button_init();
|
||||||
|
|
||||||
|
if ((!on_button || button_hold())
|
||||||
|
&& (!rc_on_button || remote_button_hold())
|
||||||
|
&& !charger_inserted())
|
||||||
|
{
|
||||||
|
/* No need to check for USB connection here, as USB is handled
|
||||||
|
* in the cowon loader. */
|
||||||
|
printf("Hold switch on");
|
||||||
|
shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
printf("Rockbox boot loader");
|
printf("Rockbox boot loader");
|
||||||
printf("Version %s", version);
|
printf("Version %s", version);
|
||||||
|
|
|
@ -25,4 +25,8 @@
|
||||||
unsigned short adc_read(int channel);
|
unsigned short adc_read(int channel);
|
||||||
void adc_init(void);
|
void adc_init(void);
|
||||||
|
|
||||||
|
#ifndef NEED_ADC_CLOSE
|
||||||
|
#define adc_close()
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _ADC_H_ */
|
#endif /* _ADC_H_ */
|
||||||
|
|
|
@ -269,6 +269,7 @@ int rolo_load(const char* filename)
|
||||||
lcd_remote_puts(0, 1, "Executing");
|
lcd_remote_puts(0, 1, "Executing");
|
||||||
lcd_remote_update();
|
lcd_remote_update();
|
||||||
#endif
|
#endif
|
||||||
|
adc_close();
|
||||||
|
|
||||||
set_irq_level(HIGHEST_IRQ_LEVEL);
|
set_irq_level(HIGHEST_IRQ_LEVEL);
|
||||||
#elif CONFIG_CPU == SH7034
|
#elif CONFIG_CPU == SH7034
|
||||||
|
|
|
@ -26,4 +26,7 @@
|
||||||
#define ADC_BATTERY 1
|
#define ADC_BATTERY 1
|
||||||
#define ADC_REMOTE 2
|
#define ADC_REMOTE 2
|
||||||
|
|
||||||
|
#define NEED_ADC_CLOSE
|
||||||
|
void adc_close(void);
|
||||||
|
|
||||||
#endif /* _ADC_TARGET_H_ */
|
#endif /* _ADC_TARGET_H_ */
|
||||||
|
|
|
@ -36,7 +36,7 @@ void power_init(void)
|
||||||
/* Charger detect */
|
/* Charger detect */
|
||||||
and_l(~0x00000020, &GPIO1_ENABLE);
|
and_l(~0x00000020, &GPIO1_ENABLE);
|
||||||
or_l(0x00000020, &GPIO1_FUNCTION);
|
or_l(0x00000020, &GPIO1_FUNCTION);
|
||||||
|
|
||||||
/* FIXME: Just disable the multi-colour LED for now. */
|
/* FIXME: Just disable the multi-colour LED for now. */
|
||||||
and_l(~0x00000210, &GPIO1_OUT);
|
and_l(~0x00000210, &GPIO1_OUT);
|
||||||
and_l(~0x00008000, &GPIO_OUT);
|
and_l(~0x00008000, &GPIO_OUT);
|
||||||
|
@ -61,7 +61,7 @@ void ide_power_enable(bool on)
|
||||||
|
|
||||||
bool ide_powered(void)
|
bool ide_powered(void)
|
||||||
{
|
{
|
||||||
return false;
|
return (GPIO_OUT & 0x00800000) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void power_off(void)
|
void power_off(void)
|
||||||
|
|
|
@ -38,23 +38,23 @@ void power_init(void)
|
||||||
|
|
||||||
bool charger_inserted(void)
|
bool charger_inserted(void)
|
||||||
{
|
{
|
||||||
return (GPIO1_READ & 0x01000000)?true:false;
|
return (GPIO1_READ & 0x01000000) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ide_power_enable(bool on)
|
void ide_power_enable(bool on)
|
||||||
{
|
{
|
||||||
/* GPOOD3 */
|
/* GPOOD3 */
|
||||||
int level = set_irq_level(HIGHEST_IRQ_LEVEL);
|
int level = set_irq_level(HIGHEST_IRQ_LEVEL);
|
||||||
if(on)
|
pcf50606_write(0x3c, on ? 0x07 : 0x00);
|
||||||
pcf50606_write(0x3c, 0x07);
|
|
||||||
else
|
|
||||||
pcf50606_write(0x3c, 0x00);
|
|
||||||
set_irq_level(level);
|
set_irq_level(level);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ide_powered(void)
|
bool ide_powered(void)
|
||||||
{
|
{
|
||||||
return false;
|
int level = set_irq_level(HIGHEST_IRQ_LEVEL);
|
||||||
|
int value = pcf50606_read(0x3c);
|
||||||
|
set_irq_level(level);
|
||||||
|
return (value & 0x07) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void power_off(void)
|
void power_off(void)
|
||||||
|
|
|
@ -38,23 +38,23 @@ void power_init(void)
|
||||||
|
|
||||||
bool charger_inserted(void)
|
bool charger_inserted(void)
|
||||||
{
|
{
|
||||||
return (GPIO1_READ & 0x01000000)?true:false;
|
return (GPIO1_READ & 0x01000000) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ide_power_enable(bool on)
|
void ide_power_enable(bool on)
|
||||||
{
|
{
|
||||||
/* GPOOD3 */
|
/* GPOOD3 */
|
||||||
int level = set_irq_level(HIGHEST_IRQ_LEVEL);
|
int level = set_irq_level(HIGHEST_IRQ_LEVEL);
|
||||||
if(on)
|
pcf50606_write(0x3c, on ? 0x07 : 0x00);
|
||||||
pcf50606_write(0x3c, 0x07);
|
|
||||||
else
|
|
||||||
pcf50606_write(0x3c, 0x00);
|
|
||||||
set_irq_level(level);
|
set_irq_level(level);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ide_powered(void)
|
bool ide_powered(void)
|
||||||
{
|
{
|
||||||
return false;
|
int level = set_irq_level(HIGHEST_IRQ_LEVEL);
|
||||||
|
int value = pcf50606_read(0x3c);
|
||||||
|
set_irq_level(level);
|
||||||
|
return (value & 0x07) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void power_off(void)
|
void power_off(void)
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "adc.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
|
@ -254,6 +255,16 @@ void system_init(void)
|
||||||
what'll be the most useful for most things which the main thread
|
what'll be the most useful for most things which the main thread
|
||||||
will do. */
|
will do. */
|
||||||
coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE);
|
coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE);
|
||||||
|
|
||||||
|
IMR = 0x3ffff;
|
||||||
|
INTPRI1 = 0;
|
||||||
|
INTPRI2 = 0;
|
||||||
|
INTPRI3 = 0;
|
||||||
|
INTPRI4 = 0;
|
||||||
|
INTPRI5 = 0;
|
||||||
|
INTPRI6 = 0;
|
||||||
|
INTPRI7 = 0;
|
||||||
|
INTPRI8 = 0;
|
||||||
|
|
||||||
/* Set INTBASE and SPURVEC */
|
/* Set INTBASE and SPURVEC */
|
||||||
INTBASE = 64;
|
INTBASE = 64;
|
||||||
|
@ -268,6 +279,7 @@ void system_init(void)
|
||||||
|
|
||||||
void system_reboot (void)
|
void system_reboot (void)
|
||||||
{
|
{
|
||||||
|
adc_close();
|
||||||
set_cpu_frequency(0);
|
set_cpu_frequency(0);
|
||||||
|
|
||||||
asm(" move.w #0x2700,%sr");
|
asm(" move.w #0x2700,%sr");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue