summaryrefslogtreecommitdiff
path: root/bootloader/creativezvm.c
diff options
context:
space:
mode:
authorMaurus Cuelenaere <mcuelenaere@gmail.com>2008-08-27 20:32:12 +0000
committerMaurus Cuelenaere <mcuelenaere@gmail.com>2008-08-27 20:32:12 +0000
commit944c33403ca92d34d38e82a5778a456a2b5c3e01 (patch)
tree5cf616ab91ccaecfabdced39af9966965ab6210e /bootloader/creativezvm.c
parent109a8677425eefd10e4a4df759e3c1c9c857ff45 (diff)
* Commit dual-boot support for Creative ZVx family
* Add mkzenboot: makes it possible to integrate Rockbox bootloader with Creative firmwares without the need of distributing binaries * Add Tadeusz Pyś to credits, who figured out the minifs file system * Fix bootloader git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18352 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader/creativezvm.c')
-rw-r--r--bootloader/creativezvm.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/bootloader/creativezvm.c b/bootloader/creativezvm.c
new file mode 100644
index 0000000000..f7a6d343d5
--- /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);
+}