1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2006 by Greg White
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
37 #include "backlight.h"
38 #include "backlight-target.h"
44 #include "rbunicode.h"
51 char version
[] = APPSVERSION
;
55 /* We need to gracefully spin down the disk to prevent clicks. */
58 /* Make sure ATA has been initialized. */
61 /* And put the disk into sleep immediately. */
72 unsigned char* loadbuffer
;
75 int(*kernel_entry
)(void);
78 kernel_init(); /* Need the kernel to sleep */
80 enable_interrupt(IRQ_FIQ_STATUS
);
88 lcd_setfont(FONT_SYSFIXED
);
90 /* These checks should only run if the bootloader is flashed */
94 if(!(GPGDAT
&BUTTON_POWER
) && charger_inserted())
96 while(!(GPGDAT
&BUTTON_POWER
) && charger_inserted())
101 snprintf(msg
,sizeof(msg
),"Charging");
105 snprintf(msg
,sizeof(msg
),"Charge Complete");
108 lcd_putsxy( (LCD_WIDTH
- (SYSFONT_WIDTH
* strlen(msg
))) / 2,
109 (LCD_HEIGHT
- SYSFONT_HEIGHT
) / 2, msg
);
112 #if defined(HAVE_RTC_ALARM)
113 /* Check if the alarm went off while charging */
114 if(rtc_check_alarm_flag())
116 GSTATUS3
=1; /* Normally this is set in crt0.s */
121 if(!(GPGDAT
&BUTTON_POWER
)
122 #if defined(HAVE_RTC_ALARM)
133 const char msg
[] = "HOLD is enabled";
135 lcd_putsxy( (LCD_WIDTH
- (SYSFONT_WIDTH
* strlen(msg
))) / 2,
136 (LCD_HEIGHT
- SYSFONT_HEIGHT
) / 2, msg
);
148 /* Enter USB mode without USB thread */
149 if(usb_detect() == USB_INSERTED
)
151 const char msg
[] = "Bootloader USB mode";
153 lcd_putsxy( (LCD_WIDTH
- (SYSFONT_WIDTH
* strlen(msg
))) / 2,
154 (LCD_HEIGHT
- SYSFONT_HEIGHT
) / 2, msg
);
157 storage_enable(false);
161 while (usb_detect() == USB_INSERTED
)
172 /* Show debug messages if button is pressed */
173 if(button_read_device()&BUTTON_A
)
176 printf("Rockbox boot loader");
177 printf("Version %s", version
);
179 sleep(50); /* ATA seems to error without this pause */
190 rc
= disk_mount_all();
196 printf("Loading firmware");
198 /* Flush out anything pending first */
199 cpucache_invalidate();
201 loadbuffer
= (unsigned char*) 0x31000000;
202 buffer_size
= (unsigned char*)0x31400000 - loadbuffer
;
204 rc
= load_firmware(loadbuffer
, BOOTFILE
, buffer_size
);
206 error(EBOOTFILE
, rc
);
209 system_prepare_fw_start();
213 cpucache_invalidate();
214 kernel_entry
= (void*) loadbuffer
;
223 /* Return and restart */