| /*************************************************************************** |
| * __________ __ ___. |
| * Open \______ \ ____ ____ | | _\_ |__ _______ ___ |
| * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / |
| * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < |
| * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ |
| * \/ \/ \/ \/ \/ |
| * $Id$ |
| * |
| * Copyright (C) 2006 by Barry Wardell |
| * |
| * Based on Rockbox iriver bootloader by Linus Nielsen Feltzing |
| * and the ipodlinux bootloader by Daniel Palffy and Bernard Leach |
| * |
| * 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 "common.h" |
| #include "cpu.h" |
| #include "file.h" |
| #include "system.h" |
| #include "kernel.h" |
| #include "lcd.h" |
| #include "font.h" |
| #include "ata.h" |
| #include "button.h" |
| #include "disk.h" |
| #include "power.h" |
| |
| /* Maximum allowed firmware image size. 10MB is more than enough */ |
| #define MAX_LOADSIZE (10*1024*1024) |
| |
| /* A buffer to load the original firmware or Rockbox into */ |
| unsigned char *loadbuffer = (unsigned char *)DRAM_START; |
| |
| /* Bootloader version */ |
| char version[] = APPSVERSION; |
| |
| void* main(void) |
| { |
| char buf[256]; |
| int i; |
| int rc; |
| unsigned short* identify_info; |
| struct partinfo* pinfo; |
| |
| system_init(); |
| kernel_init(); |
| lcd_init(); |
| font_init(); |
| button_init(); |
| |
| lcd_setfont(FONT_SYSFIXED); |
| |
| printf("Rockbox boot loader"); |
| printf("Version: 20%s", version); |
| printf(MODEL_NAME); |
| |
| i=ata_init(); |
| if (i==0) { |
| identify_info=ata_get_identify(); |
| /* Show model */ |
| for (i=0; i < 20; i++) { |
| ((unsigned short*)buf)[i]=htobe16(identify_info[i+27]); |
| } |
| buf[40]=0; |
| for (i=39; i && buf[i]==' '; i--) { |
| buf[i]=0; |
| } |
| printf(buf); |
| } else { |
| printf("ATA error: %d", i); |
| udelay(5000000); |
| power_off(); |
| } |
| |
| disk_init(); |
| rc = disk_mount_all(); |
| if (rc<=0) |
| { |
| printf("No partition found"); |
| udelay(5000000); |
| power_off(); |
| } |
| |
| pinfo = disk_partinfo(0); |
| printf("Partition 0: 0x%02x %ld MB", pinfo->type, pinfo->size / 2048); |
| |
| i=button_read_device(); |
| if(i==BUTTON_LEFT) |
| { |
| /* Load original mi4 firmware. This expects a file called |
| "/System/OF.bin" on the player. It should be a mi4 firmware decrypted |
| and header stripped using mi4code. It reads the file in to a memory |
| buffer called loadbuffer. The rest of the loading is done in crt0.S |
| */ |
| printf("Loading original firmware..."); |
| rc=load_raw_firmware(loadbuffer, "/System/OF.bin", MAX_LOADSIZE); |
| if (rc < EOK) { |
| printf("Error!"); |
| printf("Can't load /System/OF.bin:"); |
| printf(strerror(rc)); |
| udelay(5000000); |
| power_off(); |
| } |
| } else { |
| printf("Loading Rockbox..."); |
| rc=load_firmware(loadbuffer, BOOTFILE, MAX_LOADSIZE); |
| if (rc < EOK) { |
| printf("Error!"); |
| printf("Can't load %s:", BOOTFILE); |
| printf(strerror(rc)); |
| udelay(5000000); |
| power_off(); |
| } |
| } |
| |
| return (void*)loadbuffer; |
| } |
| |
| /* These functions are present in the firmware library, but we reimplement |
| them here because the originals do a lot more than we want */ |
| void usb_acknowledge(void) |
| { |
| } |
| |
| void usb_wait_for_disconnect(void) |
| { |
| } |