summaryrefslogtreecommitdiff
path: root/bootloader
diff options
context:
space:
mode:
Diffstat (limited to 'bootloader')
-rw-r--r--bootloader/SOURCES2
-rw-r--r--bootloader/creativezvm.c113
2 files changed, 115 insertions, 0 deletions
diff --git a/bootloader/SOURCES b/bootloader/SOURCES
index 9f8cf1c..1258f9e 100644
--- a/bootloader/SOURCES
+++ b/bootloader/SOURCES
@@ -33,4 +33,6 @@ telechips.c
meizu_m6sl.c
#elif defined(ONDA_VX747)
ondavx747.c
+#elif defined(CREATIVE_ZVM)
+creativezvm.c
#endif
diff --git a/bootloader/creativezvm.c b/bootloader/creativezvm.c
new file mode 100644
index 0000000..f7a6d34
--- /dev/null
+++ b/bootloader/creativezvm.c
@@ -0,0 +1,113 @@
+/***************************************************************************
+* __________ __ ___.
+* Open \______ \ ____ ____ | | _\_ |__ _______ ___
+* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+* \/ \/ \/ \/ \/
+* $Id$
+*
+* Copyright (C) 2008 by Maurus Cuelenaere
+*
+* All files in this archive are subject to the GNU General Public License.
+* See the file COPYING in the source tree root for full license agreement.
+*
+* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+* KIND, either express or implied.
+*
+****************************************************************************/
+
+#include "system.h"
+#include "lcd.h"
+#include "kernel.h"
+#include "thread.h"
+#include "ata.h"
+#include "ata-target.h"
+#include "disk.h"
+#include "font.h"
+#include "backlight.h"
+#include "button.h"
+#include "common.h"
+
+
+static void load_fw(unsigned char* ptr, unsigned int len)
+{
+ (void)ptr;
+ (void)len;
+ asm volatile("ldr pc, =0x1EE0000");
+}
+
+void main(void)
+{
+ unsigned char* loadbuffer;
+ int buffer_size;
+ int(*kernel_entry)(void);
+ int ret;
+
+ /* Make sure interrupts are disabled */
+ set_irq_level(IRQ_DISABLED);
+ set_fiq_status(FIQ_DISABLED);
+ system_init();
+ kernel_init();
+
+ /* Now enable interrupts */
+ set_irq_level(IRQ_ENABLED);
+ set_fiq_status(FIQ_ENABLED);
+ backlight_init();
+ lcd_init();
+ font_init();
+ button_init();
+
+ lcd_enable(true);
+ lcd_setfont(FONT_SYSFIXED);
+ reset_screen();
+ printf("Rockbox boot loader");
+ printf("Version %s", APPSVERSION);
+
+ ret = ata_init();
+ if(ret)
+ printf("ATA error: %d", ret);
+
+ if(1)
+ {
+ printf("Loading Creative firmware...");
+
+ loadbuffer = (unsigned char*)0x00A00000;
+ ret = load_minifs_file("creativeos.jrm", loadbuffer);
+ if(ret != -1)
+ {
+ set_irq_level(IRQ_DISABLED);
+ set_fiq_status(FIQ_DISABLED);
+ /* Doesn't return! */
+ load_fw(loadbuffer, ret);
+ }
+ else
+ printf("FAILED!");
+ }
+ else
+ {
+ disk_init();
+
+ ret = disk_mount_all();
+ if (ret <= 0)
+ error(EDISK, ret);
+
+ printf("Loading Rockbox firmware...");
+
+ loadbuffer = (unsigned char*)0x00900000;
+ buffer_size = (unsigned char*)0x01900000 - loadbuffer;
+
+ ret = load_firmware(loadbuffer, BOOTFILE, buffer_size);
+ if(ret < 0)
+ error(EBOOTFILE, ret);
+
+ else if(ret == EOK)
+ {
+ kernel_entry = (void*) loadbuffer;
+ ret = kernel_entry();
+ printf("FAILED!");
+ }
+ }
+
+ while(1);
+}