diff options
author | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2008-08-27 20:32:12 +0000 |
---|---|---|
committer | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2008-08-27 20:32:12 +0000 |
commit | 944c33403ca92d34d38e82a5778a456a2b5c3e01 (patch) | |
tree | 5cf616ab91ccaecfabdced39af9966965ab6210e /bootloader/creativezvm.c | |
parent | 109a8677425eefd10e4a4df759e3c1c9c857ff45 (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.c | 113 |
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); +} |