Sansav2 Bootloader
Adds read-only SD driver, largely copied from ata-sd-pp.c
Only tested on the embedded SD, on the Clip
First steps to build a Normal firmware
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19045 a1c6a512-1295-4272-9138-f99709370657
diff --git a/bootloader/sansa_as3525.c b/bootloader/sansa_as3525.c
index 6340fbb..1385e47 100644
--- a/bootloader/sansa_as3525.c
+++ b/bootloader/sansa_as3525.c
@@ -31,43 +31,71 @@
#include "as3525-codec.h"
#include "common.h"
#include "storage.h"
+#include "disk.h"
+#include "panic.h"
int show_logo(void);
void main(void)
{
- int i;
- unsigned char buf[8];
+ unsigned char* loadbuffer;
+ int buffer_size;
+ void(*kernel_entry)(void);
+ int ret;
+ int delay;
system_init();
kernel_init();
lcd_init();
-
show_logo();
as3525_codec_init(); /* Required for backlight on e200v2 */
-
_backlight_on();
- /* show player id to demonstrate communication with codec part */
- for (i = 0; i < 8; i++) {
- buf[i] = as3525_codec_read(0x38 + i);
+ delay = 0x3000000;
+ while(delay--); /* show splash screen */
+ reset_screen();
+
+ asm volatile(
+ "mrs r0, cpsr \n"
+ "bic r0, r0, #0x80 \n" /* enable interrupts */
+ "msr cpsr, r0 \n"
+ : : : "r0" );
+
+ ret = storage_init();
+ if(ret < 0)
+ error(EATA,ret);
+
+ if(!disk_init(IF_MV(0)))
+ panicf("disk_init failed!");
+
+ ret = disk_mount_all();
+
+ if(ret <= 0)
+ error(EDISK, ret);
+
+ printf("Loading firmware");
+
+ loadbuffer = (unsigned char*)0x30000000; /* DRAM */
+ buffer_size = (int)(loadbuffer + (MEM * 0x100000));
+
+ ret = load_firmware(loadbuffer, BOOTFILE, buffer_size);
+ if(ret < 0)
+ error(EBOOTFILE, ret);
+
+ asm volatile(
+ "mrs r0, cpsr \n"
+ "orr r0, r0, #0x80 \n" /* disable interrupts */
+ "msr cpsr, r0 \n"
+ : : : "r0" );
+
+ if (ret == EOK)
+ {
+ kernel_entry = (void*) loadbuffer;
+ printf("Executing");
+ kernel_entry();
+ printf("ERR: Failed to boot");
}
- printf("ID: %02X%02X%02X%02X%02X%02X%02X%02X", buf[7], buf[6], buf[5], buf[4], buf[3], buf[2], buf[1], buf[0]);
-
- storage_init();
-
-#ifdef SANSA_CLIP
- /* Use hardware scrolling */
-
- lcd_write_command(0x26); /* scroll setup */
- lcd_write_command(0x01); /* columns scrolled per step */
- lcd_write_command(0x00); /* start page */
- lcd_write_command(0x00); /* steps freqency */
- lcd_write_command(0x07); /* end page (including) */
-
- lcd_write_command(0x2F); /* start horizontal scrolling */
-#endif
/* never returns */
while(1) ;