summaryrefslogtreecommitdiff
path: root/bootloader
diff options
context:
space:
mode:
Diffstat (limited to 'bootloader')
-rw-r--r--bootloader/sansa_as3525.c66
1 files changed, 47 insertions, 19 deletions
diff --git a/bootloader/sansa_as3525.c b/bootloader/sansa_as3525.c
index 6340fbbc41..1385e47ff6 100644
--- a/bootloader/sansa_as3525.c
+++ b/bootloader/sansa_as3525.c
@@ -31,43 +31,71 @@
31#include "as3525-codec.h" 31#include "as3525-codec.h"
32#include "common.h" 32#include "common.h"
33#include "storage.h" 33#include "storage.h"
34#include "disk.h"
35#include "panic.h"
34 36
35int show_logo(void); 37int show_logo(void);
36void main(void) 38void main(void)
37{ 39{
38 int i; 40 unsigned char* loadbuffer;
39 unsigned char buf[8]; 41 int buffer_size;
42 void(*kernel_entry)(void);
43 int ret;
44 int delay;
40 45
41 system_init(); 46 system_init();
42 kernel_init(); 47 kernel_init();
43 48
44 lcd_init(); 49 lcd_init();
45
46 show_logo(); 50 show_logo();
47 51
48 as3525_codec_init(); /* Required for backlight on e200v2 */ 52 as3525_codec_init(); /* Required for backlight on e200v2 */
49
50 _backlight_on(); 53 _backlight_on();
51 54
52 /* show player id to demonstrate communication with codec part */ 55 delay = 0x3000000;
53 for (i = 0; i < 8; i++) { 56 while(delay--); /* show splash screen */
54 buf[i] = as3525_codec_read(0x38 + i); 57 reset_screen();
55 } 58
56 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]); 59 asm volatile(
60 "mrs r0, cpsr \n"
61 "bic r0, r0, #0x80 \n" /* enable interrupts */
62 "msr cpsr, r0 \n"
63 : : : "r0" );
64
65 ret = storage_init();
66 if(ret < 0)
67 error(EATA,ret);
57 68
58 storage_init(); 69 if(!disk_init(IF_MV(0)))
70 panicf("disk_init failed!");
59 71
60#ifdef SANSA_CLIP 72 ret = disk_mount_all();
61 /* Use hardware scrolling */
62 73
63 lcd_write_command(0x26); /* scroll setup */ 74 if(ret <= 0)
64 lcd_write_command(0x01); /* columns scrolled per step */ 75 error(EDISK, ret);
65 lcd_write_command(0x00); /* start page */
66 lcd_write_command(0x00); /* steps freqency */
67 lcd_write_command(0x07); /* end page (including) */
68 76
69 lcd_write_command(0x2F); /* start horizontal scrolling */ 77 printf("Loading firmware");
70#endif 78
79 loadbuffer = (unsigned char*)0x30000000; /* DRAM */
80 buffer_size = (int)(loadbuffer + (MEM * 0x100000));
81
82 ret = load_firmware(loadbuffer, BOOTFILE, buffer_size);
83 if(ret < 0)
84 error(EBOOTFILE, ret);
85
86 asm volatile(
87 "mrs r0, cpsr \n"
88 "orr r0, r0, #0x80 \n" /* disable interrupts */
89 "msr cpsr, r0 \n"
90 : : : "r0" );
91
92 if (ret == EOK)
93 {
94 kernel_entry = (void*) loadbuffer;
95 printf("Executing");
96 kernel_entry();
97 printf("ERR: Failed to boot");
98 }
71 99
72 /* never returns */ 100 /* never returns */
73 while(1) ; 101 while(1) ;