From f32336e4a5ba3fe70e0af24b5d815518dfb223ea Mon Sep 17 00:00:00 2001 From: Karl Kurbjun Date: Wed, 12 Nov 2008 05:11:18 +0000 Subject: Last commit for the flash bootloader. The bootloader build works properly either flashed or unflashed. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19098 a1c6a512-1295-4272-9138-f99709370657 --- bootloader/gigabeat.c | 82 ++++++++++++++++++++++++++++++++++++-- firmware/target/arm/s3c2440/crt0.S | 11 +++-- 2 files changed, 85 insertions(+), 8 deletions(-) diff --git a/bootloader/gigabeat.c b/bootloader/gigabeat.c index 6b3a68be6e..11ab93a5e2 100644 --- a/bootloader/gigabeat.c +++ b/bootloader/gigabeat.c @@ -44,11 +44,29 @@ #include "rbunicode.h" #include "usb.h" #include "mmu-arm.h" +#include "rtc.h" #include char version[] = APPSVERSION; +void shutdown(void) +{ + /* We need to gracefully spin down the disk to prevent clicks. */ + if (ide_powered()) + { + /* Make sure ATA has been initialized. */ + ata_init(); + + /* And put the disk into sleep immediately. */ + ata_sleepnow(); + } + + _backlight_off(); + + power_off(); +} + void main(void) { unsigned char* loadbuffer; @@ -56,14 +74,72 @@ void main(void) int rc; int(*kernel_entry)(void); - power_init(); system_init(); lcd_init(); backlight_init(); + button_init(); font_init(); + kernel_init(); /* Need the kernel to sleep */ + adc_init(); lcd_setfont(FONT_SYSFIXED); + + /* These checks should only run if the bootloader is flashed */ + if(GSTATUS3&0x02) + { + GSTATUS3&=0xFFFFFFFD; + if(!(GPGDAT&BUTTON_POWER) && charger_inserted()) + { + while(!(GPGDAT&BUTTON_POWER) && charger_inserted()) + { + char msg[20]; + if(charging_state()) + { + snprintf(msg,sizeof(msg),"Charging"); + } + else + { + snprintf(msg,sizeof(msg),"Charge Complete"); + } + reset_screen(); + lcd_putsxy( (LCD_WIDTH - (SYSFONT_WIDTH * strlen(msg))) / 2, + (LCD_HEIGHT - SYSFONT_HEIGHT) / 2, msg); + lcd_update(); + +#if defined(HAVE_RTC_ALARM) + /* Check if the alarm went off while charging */ + if(rtc_check_alarm_flag()) + { + GSTATUS3=1; /* Normally this is set in crt0.s */ + break; + } +#endif + } + if(!(GPGDAT&BUTTON_POWER) +#if defined(HAVE_RTC_ALARM) + && !GSTATUS3 +#endif + ) + { + shutdown(); + } + } + + if(button_hold()) + { + const char msg[] = "HOLD is enabled"; + reset_screen(); + lcd_putsxy( (LCD_WIDTH - (SYSFONT_WIDTH * strlen(msg))) / 2, + (LCD_HEIGHT - SYSFONT_HEIGHT) / 2, msg); + lcd_update(); + + sleep(2*HZ); + + shutdown(); + } + } + power_init(); usb_init(); /* Enter USB mode without USB thread */ @@ -88,9 +164,7 @@ void main(void) lcd_update(); } - kernel_init(); - adc_init(); - button_init(); + reset_screen(); /* Show debug messages if button is pressed */ if(button_read_device()) diff --git a/firmware/target/arm/s3c2440/crt0.S b/firmware/target/arm/s3c2440/crt0.S index af0ef5bba8..a05fd78fe9 100644 --- a/firmware/target/arm/s3c2440/crt0.S +++ b/firmware/target/arm/s3c2440/crt0.S @@ -105,10 +105,13 @@ start: ldr r1, [r2] ands r1, r1, #0x40000000 - /* Woke up with the alarm - store a flag in GSTATUS3 */ - ldrne r2, =0x560000b8 - movne r1, #0x01 - strne r1, [r2] + /* Store a flag in GSTATUS3 to indicate that the bootloader is flashed */ + ldr r2, =0x560000b8 + mov r1, #0x02 + + /* Woke up with the alarm? - store a flag in GSTATUS3 */ + orrne r1, r1, #0x01 + str r1, [r2] bne poweron /* Set GPG up to read power and menu status */ -- cgit v1.2.3