diff options
Diffstat (limited to 'bootloader')
-rw-r--r-- | bootloader/sansa_as3525.c | 66 |
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 | ||
35 | int show_logo(void); | 37 | int show_logo(void); |
36 | void main(void) | 38 | void 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) ; |