HD300: Fix bootloader hang when RTC alarm fires. Make entering bootmenu more reliable. Add some comments.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28739 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Marcin Bukat 2010-12-06 10:24:29 +00:00
parent 809e61b373
commit a73102f2c2

View file

@ -59,6 +59,7 @@
#define EVENT_ON 0x01 #define EVENT_ON 0x01
#define EVENT_AC 0x02 #define EVENT_AC 0x02
#define EVENT_USB 0x04 #define EVENT_USB 0x04
#define EVENT_RTC 0x08
/* From common.c */ /* From common.c */
extern int line; extern int line;
@ -79,16 +80,29 @@ int usb_screen(void)
return 0; return 0;
} }
/* return true if charger is present */
static inline bool _charger_inserted(void) static inline bool _charger_inserted(void)
{ {
return (GPIO1_READ & (1<<14)) ? false : true; return (GPIO1_READ & (1<<14)) ? false : true;
} }
/* returns true if end of charge condition is reached */
static inline bool _battery_full(void) static inline bool _battery_full(void)
{ {
return (GPIO_READ & (1<<30)) ? true : false; return (GPIO_READ & (1<<30)) ? true : false;
} }
#ifdef MPIO_HD300
/* returns true if startup is due to RTC alarm */
static inline bool _rtc_alarm(void)
{
if ( (GPIO1_READ & (1<<4)) && (GPIO1_READ & (1<<5)) )
return false;
return true;
}
#endif
/* Reset the cookie for the crt0 crash check */ /* Reset the cookie for the crt0 crash check */
static inline void __reset_cookie(void) static inline void __reset_cookie(void)
{ {
@ -168,6 +182,10 @@ static void lcd_putstring_centered(const char *string)
lcd_putsxy((LCD_WIDTH-w)/2, (LCD_HEIGHT-h)/2, string); lcd_putsxy((LCD_WIDTH-w)/2, (LCD_HEIGHT-h)/2, string);
} }
/* This function initializes ATA driver, mounts partitions,
* loads rockbox image from disk to ram and finally
* jumps to entry point in ram
*/
static void rb_boot(void) static void rb_boot(void)
{ {
int rc; int rc;
@ -175,6 +193,7 @@ static void rb_boot(void)
/* boost to speedup rb image loading */ /* boost to speedup rb image loading */
cpu_boost(true); cpu_boost(true);
reset_screen();
printf("Rockbox boot loader"); printf("Rockbox boot loader");
printf("Version " RBVERSION); printf("Version " RBVERSION);
@ -214,6 +233,9 @@ static void rb_boot(void)
start_rockbox(); start_rockbox();
} }
/* This function prints small bootmenu where
* you can choose to boot OF, rockbox or just shutdown
*/
static void bootmenu(void) static void bootmenu(void)
{ {
enum option_t i; enum option_t i;
@ -303,7 +325,7 @@ static void bootmenu(void)
break; break;
default: default:
return; __shutdown();
break; break;
} }
} }
@ -358,11 +380,11 @@ void main(void)
cpu_idle_mode(true); cpu_idle_mode(true);
/* Handle wakeup event. Possibilities are: /* Handle wakeup event. Possibilities are:
* ON button (PLAY) * RTC alarm (HD300)
* ON button (PLAY or RC_PLAY on HD200)
* USB insert * USB insert
* AC charger plug * AC charger plug
*/ */
while(1) while(1)
{ {
/* read buttons */ /* read buttons */
@ -381,20 +403,30 @@ void main(void)
if ( _charger_inserted() ) if ( _charger_inserted() )
event |= EVENT_AC; event |= EVENT_AC;
#ifdef MPIO_HD300
if ( _rtc_alarm() )
event |= EVENT_RTC;
#endif
reset_screen(); reset_screen();
switch (event) switch (event)
{ {
#ifdef MPIO_HD300
case EVENT_RTC:
case (EVENT_RTC | EVENT_ON):
/* start regardles of buttons state */
rb_boot();
break;
#endif
case EVENT_ON: case EVENT_ON:
case (EVENT_ON | EVENT_AC): case (EVENT_ON | EVENT_AC):
/* hold is handled in button driver */ /* hold is handled in button driver */
cpu_idle_mode(false); cpu_idle_mode(false);
ide_power_enable(true); ide_power_enable(true);
if (button == (BUTTON_PLAY|BUTTON_REC)) if (button & BUTTON_REC)
bootmenu(); bootmenu();
else else
rb_boot(); rb_boot();
break; break;