From da7dc80e1541548d31feb911e8c36059776874c4 Mon Sep 17 00:00:00 2001 From: mcuelenaere Date: Fri, 17 Jul 2009 14:30:42 +0000 Subject: [PATCH] Onda VX747: add dual-boot capability + make it possible to permanently 'stick' Rockbox to your DAP git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21919 a1c6a512-1295-4272-9138-f99709370657 --- bootloader/SOURCES | 1 + bootloader/common.c | 3 +- bootloader/ondavx747.c | 73 ++++++++++++++++++++++++---- firmware/export/config-ondavx747.h | 5 ++ firmware/target/mips/ingenic_jz47xx/boot.lds | 2 +- firmware/target/mips/ingenic_jz47xx/crt0.S | 6 +-- tools/configure | 16 +++--- tools/scramble.c | 64 +++++++++++++++++++++++- 8 files changed, 146 insertions(+), 24 deletions(-) diff --git a/bootloader/SOURCES b/bootloader/SOURCES index d36479c4e..42f3f577c 100644 --- a/bootloader/SOURCES +++ b/bootloader/SOURCES @@ -44,6 +44,7 @@ meizu_m6sp.c meizu_m3.c #elif defined(ONDA_VX747) || defined(ONDA_VX747P) || defined(ONDA_VX767) || defined(ONDA_VX777) ondavx747.c +show_logo.c #elif defined(CREATIVE_ZVx) creativezvm.c #elif CONFIG_CPU==AS3525 diff --git a/bootloader/common.c b/bootloader/common.c index 4ac421d87..f7ab661ca 100644 --- a/bootloader/common.c +++ b/bootloader/common.c @@ -40,7 +40,8 @@ #if defined(IPOD_ARCH) || defined(IRIVER_H10) || defined(IRIVER_H10_5GB) \ || defined(SANSA_E200) || defined(SANSA_C200) || defined(GIGABEAT_F) \ || defined(PHILIPS_SA9200) || (CONFIG_CPU == AS3525) || defined(COWON_D2) \ - || defined(MROBE_100) || defined(PHILIPS_HDD1630) || defined(MROBE_500) + || defined(MROBE_100) || defined(PHILIPS_HDD1630) || defined(MROBE_500) \ + || defined(ONDA_VX747) bool verbose = false; #else bool verbose = true; diff --git a/bootloader/ondavx747.c b/bootloader/ondavx747.c index 6a04c1ba8..3767005eb 100755 --- a/bootloader/ondavx747.c +++ b/bootloader/ondavx747.c @@ -34,6 +34,8 @@ #include "string.h" #include "adc.h" +extern int show_logo(void); + static void show_splash(int timeout, const char *msg) { reset_screen(); @@ -84,9 +86,52 @@ static void usb_mode(void) reset_screen(); } -static void boot_of(void) +static int boot_of(void) { - /* Do nothing atm */ + int fd, rc, len, i, checksum = 0; + void (*kernel_entry)(int, void*, void*); + + /* TODO: get this from the NAND flash instead of SD */ + fd = open("/ccpmp.bin", O_RDONLY); + if(fd < 0) + return EFILE_NOT_FOUND; + + lseek(fd, 4, SEEK_SET); + rc = read(fd, (char*)&len, 4); /* CPU is LE */ + if(rc < 4) + return EREAD_IMAGE_FAILED; + + len += 8; + printf("Reading %d bytes...", len); + + lseek(fd, 0, SEEK_SET); + rc = read(fd, (void*)0x80004000, len); + if(rc < len) + return EREAD_IMAGE_FAILED; + + close(fd); + + for(i=0; i0; i--) + asm volatile("nop\n"); + + kernel_entry = (void*) 0x80004008; + kernel_entry(0, "Jan 10 2008", "15:34:42"); /* Reversed from the SPL */ + + return 0; } int main(void) @@ -102,12 +147,9 @@ int main(void) font_init(); lcd_setfont(FONT_SYSFIXED); button_init(); - adc_init(); backlight_init(); - reset_screen(); - printf(MODEL_NAME" Rockbox Bootloader"); - printf("Version "APPSVERSION); + show_logo(); rc = storage_init(); if(rc) @@ -119,15 +161,28 @@ int main(void) rc = button_read_device(); #endif + if(rc) + verbose = true; + if(rc & BUTTON_VOL_UP) usb_mode(); - else if(button_hold()) - boot_of(); + + if(verbose) + reset_screen(); + printf(MODEL_NAME" Rockbox Bootloader"); + printf("Version "APPSVERSION); rc = disk_mount_all(); if (rc <= 0) error(EDISK,rc); + if(button_hold()) + { + rc = boot_of(); + if(rc < 0) + printf("Error: %s", strerror(rc)); + } + printf("Loading firmware"); rc = load_firmware((unsigned char *)CONFIG_SDRAM_START, BOOTFILE, 0x400000); if(rc < 0) @@ -136,7 +191,7 @@ int main(void) if (rc == EOK) { printf("Starting Rockbox..."); - adc_close(); /* Disable SADC */ + adc_close(); /* Disable SADC */ _backlight_off(); /* Force backlight off to prevent LCD 'flicker' */ disable_interrupt(); diff --git a/firmware/export/config-ondavx747.h b/firmware/export/config-ondavx747.h index 22108fff4..1d9a7a888 100644 --- a/firmware/export/config-ondavx747.h +++ b/firmware/export/config-ondavx747.h @@ -81,8 +81,13 @@ /* LCD dimensions */ #define CONFIG_LCD LCD_ONDAVX747 +#ifdef BOOTLOADER /* OF requires landscape */ +#define LCD_WIDTH 400 +#define LCD_HEIGHT 240 +#else #define LCD_WIDTH 240 #define LCD_HEIGHT 400 +#endif #define LCD_DEPTH 16 /* 16bit colours */ #define LCD_PIXELFORMAT RGB565 /* rgb565 */ diff --git a/firmware/target/mips/ingenic_jz47xx/boot.lds b/firmware/target/mips/ingenic_jz47xx/boot.lds index fb30fa240..15d3e3dd4 100644 --- a/firmware/target/mips/ingenic_jz47xx/boot.lds +++ b/firmware/target/mips/ingenic_jz47xx/boot.lds @@ -8,7 +8,7 @@ STARTUP(target/mips/ingenic_jz47xx/crt0.o) #define DRAMSIZE ((MEMORYSIZE-4) * 0x100000) -#define DRAMORIG 0x80404000 +#define DRAMORIG 0x80E04000 #define IRAMORIG 0x80000000 #define IRAMSIZE 16K diff --git a/firmware/target/mips/ingenic_jz47xx/crt0.S b/firmware/target/mips/ingenic_jz47xx/crt0.S index 111244b17..7035c5ab0 100644 --- a/firmware/target/mips/ingenic_jz47xx/crt0.S +++ b/firmware/target/mips/ingenic_jz47xx/crt0.S @@ -50,12 +50,12 @@ .set noat #ifdef BOOTLOADER - /* These will get filled in scramble */ - .word 0 /* Unknown */ + /* These will get filled in by scramble */ + .word 0 /* Empty */ .word 0 /* Filesize */ /* Relocate bootloader */ - la t0, (_loadaddress-0x400000) + la t0, (_loadaddress-0xE00000) la t1, _loadaddress la t2, _bootend _relocate_loop: diff --git a/tools/configure b/tools/configure index f5aeceaf5..802173f1b 100755 --- a/tools/configure +++ b/tools/configure @@ -2105,8 +2105,8 @@ fi plugins="yes" swcodec="yes" toolset=$genericbitmaptools - boottool="cp" - bootoutput="rockboot.vx747" + boottool="$rootdir/tools/scramble -ccpmp" + bootoutput="ccpmp.bin" # architecture, manufacturer and model for the target-tree build t_cpu="mips" t_manufacturer="ingenic_jz47xx" @@ -2127,8 +2127,8 @@ fi plugins="" #FIXME swcodec="yes" toolset=$genericbitmaptools - boottool="cp" - bootoutput="rockboot.vx767" + boottool="$rootdir/tools/scramble -ccpmp" + bootoutput="ccpmp.bin" # architecture, manufacturer and model for the target-tree build t_cpu="mips" t_manufacturer="ingenic_jz47xx" @@ -2149,8 +2149,8 @@ fi plugins="yes" swcodec="yes" toolset=$genericbitmaptools - boottool="cp" - bootoutput="rockboot.vx747p" + boottool="$rootdir/tools/scramble -ccpmp" + bootoutput="ccpmp.bin" # architecture, manufacturer and model for the target-tree build t_cpu="mips" t_manufacturer="ingenic_jz47xx" @@ -2171,8 +2171,8 @@ fi plugins="" #TODO swcodec="yes" toolset=$genericbitmaptools - boottool="cp" - bootoutput="rockboot.vx777" + boottool="$rootdir/tools/scramble -ccpmp" + bootoutput="ccpmp.bin" # architecture, manufacturer and model for the target-tree build t_cpu="mips" t_manufacturer="ingenic_jz47xx" diff --git a/tools/scramble.c b/tools/scramble.c index cabe15f48..5d2b12fb8 100644 --- a/tools/scramble.c +++ b/tools/scramble.c @@ -33,6 +33,7 @@ int iaudio_encode(char *iname, char *oname, char *idstring); int ipod_encode(char *iname, char *oname, int fw_ver, bool fake_rsrc); +int ccpmp_encode(char *iname, char *oname); enum { @@ -375,8 +376,7 @@ int main (int argc, char** argv) oname = argv[3]; return ipod_encode(iname, oname, 3, true); /* Firmware image v3 */ } - else if(!strncmp(argv[1], "-creative=", 10)) - { + else if(!strncmp(argv[1], "-creative=", 10)) { if(!strcmp(argv[2], "-no-ciff")) { creative_enable_ciff = false; @@ -405,6 +405,11 @@ int main (int argc, char** argv) return 2; } } + else if(!strcmp(argv[1], "-ccpmp")) { + iname = argv[2]; + oname = argv[3]; + return ccpmp_encode(iname, oname); + } else if(!strncmp(argv[1], "-mi4", 4)) { int mi4magic; char model[4] = ""; @@ -824,3 +829,58 @@ int ipod_encode(char *iname, char *oname, int fw_ver, bool fake_rsrc) return 0; } +#define CCPMP_SIZE 0x500000 +int ccpmp_encode(char *iname, char *oname) +{ + size_t len; + int length; + FILE *file; + unsigned char *outbuf; + + file = fopen(iname, "rb"); + if (!file) { + perror(iname); + return -1; + } + fseek(file,0,SEEK_END); + length = ftell(file); + + fseek(file,0,SEEK_SET); + + outbuf = malloc(CCPMP_SIZE); + + if ( !outbuf ) { + printf("out of memory!\n"); + return -1; + } + + len = fread(outbuf, 1, length, file); + if(len < (size_t)length) { + perror(iname); + return -2; + } + fclose(file); + + /* Clear the tail area to 0xFF */ + memset(&outbuf[length], 0xFF, CCPMP_SIZE - length); + + /* Header */ + int2le(length, &outbuf[0x4]); + + file = fopen(oname, "wb"); + if (!file) { + perror(oname); + return -3; + } + + len = fwrite(outbuf, 1, CCPMP_SIZE, file); + if(len < (size_t)length) { + perror(oname); + return -4; + } + + fclose(file); + + return 0; +} + -- 2.11.4.GIT