diff options
author | Hristo Kovachev <bger@rockbox.org> | 2006-08-11 08:35:27 +0000 |
---|---|---|
committer | Hristo Kovachev <bger@rockbox.org> | 2006-08-11 08:35:27 +0000 |
commit | 9dc0e6222942b31ecf8a7ba4b8f4d1dff1d52caa (patch) | |
tree | ca0458168d06e758160bae2980797ee52ed27fb4 /bootloader | |
parent | 2c3fd0ce7e035fe0c42fed1e4be9c5a22518fd6f (diff) | |
download | rockbox-9dc0e6222942b31ecf8a7ba4b8f4d1dff1d52caa.tar.gz rockbox-9dc0e6222942b31ecf8a7ba4b8f4d1dff1d52caa.zip |
Patch #5731 by Barry Wardell: more iriver h10 work. Thanks!
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10521 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader')
-rw-r--r-- | bootloader/h10.c | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/bootloader/h10.c b/bootloader/h10.c new file mode 100644 index 0000000000..e80e28fe5b --- /dev/null +++ b/bootloader/h10.c @@ -0,0 +1,262 @@ +/*************************************************************************** + * __________ __ ___. + * 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 "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "cpu.h" +#include "system.h" +#include "lcd.h" +#include "kernel.h" +#include "thread.h" +#include "ata.h" +#include "fat.h" +#include "disk.h" +#include "font.h" +#include "adc.h" +#include "backlight.h" +#include "button.h" +#include "panic.h" +#include "power.h" +#include "file.h" + +/* Size of the buffer to store the loaded Rockbox/iriver image */ +#define MAX_LOADSIZE (5*1024*1024) + +/* This is identical to the function used in the iPod bootloader */ +static void memmove16(void *dest, const void *src, unsigned count) +{ + struct bufstr { + unsigned _buf[4]; + } *d, *s; + + if (src >= dest) { + count = (count + 15) >> 4; + d = (struct bufstr *) dest; + s = (struct bufstr *) src; + while (count--) + *d++ = *s++; + } else { + count = (count + 15) >> 4; + d = (struct bufstr *)(dest + (count <<4)); + s = (struct bufstr *)(src + (count <<4)); + while (count--) + *--d = *--s; + } +} + + +/* Load original iriver firmware. This function expects a file called "H10_20GC.mi4" in + the root directory of the player. It should be decrypted and have the header stripped + using mi4code. It reads the file in to a memory buffer called buf. The rest of the + loading is done in main() +*/ +int load_iriver(unsigned char* buf) +{ + int fd; + int rc; + int len; + + fd = open("/H10_20GC.mi4", O_RDONLY); + + len = filesize(fd); + rc = read(fd, buf, len); + if(rc < len) + return -4; + + close(fd); + return len; +} + +/* A buffer to load the iriver firmware or Rockbox into */ +unsigned char loadbuffer[MAX_LOADSIZE]; + +void main(void) +{ + /* Attempt to load original iriver firmware. Successfully starts loading the iriver + firmware but then locks up once the "System Initialising" screen is displayed. + + The iriver firmware was decrypted and the header removed. It was then appended to + the end of bootloader.bin and an mi4 file was created from the resulting file. + + The original firmware starts at 0xd800 in the file and is of length 0x47da00. + + The whole file (bootloader.bin + decrypted mi4) are loaded to memory by the + original iriver bootloader on startup. This copies the mi4 part to the start + of DRAM and passes execution to there. + + memmove16((void*)DRAMORIG, (void*)(DRAMORIG + 0xd800), 0x47da00); + asm volatile( + "mov r0, #" SC(DRAMORIG) "\n" + "mov pc, r0 \n" + ); + */ + + int i; + int rc; + int btn; + + i=ata_init(); + disk_init(); + rc = disk_mount_all(); + + /* Load original iriver firmware. Uses load_iriver(buf) to load the decrypted mi4 file from + disk to DRAM. This then copies that part of DRAM to the start of DRAM and passes + execution to there. + + rc=load_iriver(loadbuffer); + memcpy((void*)DRAMORIG,loadbuffer,rc); + asm volatile( + "mov r0, #" SC(DRAMORIG) "\n" + "mov pc, r0 \n" + );*/ + + + /* This assumes that /test.txt exists */ + int fd; + char buffer[24]; + fd=open("/test.txt",O_RDWR); + + + /* WARNING: Running this code on the H10 caused permanent damage to my H10's hdd + I strongly recommend against trying it. + + for(i=0;i<100;i++){ + btn = button_read_device(); + switch(btn){ + case BUTTON_LEFT: + snprintf(buffer, sizeof(buffer), "Left"); + write(fd,buffer,sizeof(buffer)); + break; + case BUTTON_RIGHT: + break; + case BUTTON_REW: + break; + case BUTTON_FF: + break; + case BUTTON_PLAY: + break; + default: + break; + } + + + } + */ + + + + /* Investigate gpio + + unsigned int gpio_a, gpio_b, gpio_c, gpio_d; + unsigned int gpio_e, gpio_f, gpio_g, gpio_h; + unsigned int gpio_i, gpio_j, gpio_k, gpio_l; + + gpio_a = GPIOA_INPUT_VAL; + gpio_b = GPIOB_INPUT_VAL; + gpio_c = GPIOC_INPUT_VAL; + + gpio_g = GPIOG_INPUT_VAL; + gpio_h = GPIOH_INPUT_VAL; + gpio_i = GPIOI_INPUT_VAL; + + snprintf(buffer, sizeof(buffer), "GPIO_A: %02x GPIO_G: %02x\n", gpio_a, gpio_g); + write(fd,buffer,sizeof(buffer)); + snprintf(buffer, sizeof(buffer), "GPIO_B: %02x GPIO_H: %02x\n", gpio_b, gpio_h); + write(fd,buffer,sizeof(buffer)); + snprintf(buffer, sizeof(buffer), "GPIO_C: %02x GPIO_I: %02x\n", gpio_c, gpio_i); + write(fd,buffer,sizeof(buffer)); + + gpio_d = GPIOD_INPUT_VAL; + gpio_e = GPIOE_INPUT_VAL; + gpio_f = GPIOF_INPUT_VAL; + + gpio_j = GPIOJ_INPUT_VAL; + gpio_k = GPIOK_INPUT_VAL; + gpio_l = GPIOL_INPUT_VAL; + + snprintf(buffer, sizeof(buffer), "GPIO_D: %02x GPIO_J: %02x\n", gpio_d, gpio_j); + write(fd,buffer,sizeof(buffer)); + snprintf(buffer, sizeof(buffer), "GPIO_E: %02x GPIO_K: %02x\n", gpio_e, gpio_k); + write(fd,buffer,sizeof(buffer)); + snprintf(buffer, sizeof(buffer), "GPIO_F: %02x GPIO_L: %02x\n", gpio_f, gpio_l); + write(fd,buffer,sizeof(buffer)); + */ + + + + /* Detect the scroller being touched + + int j = 0; + for(j=0;j<1000;j++){ + if(gpio_c!=0xF7){ + snprintf(buffer, sizeof(buffer), "GPIO_C: %02x\n", gpio_c); + write(fd,buffer,sizeof(buffer)); + } + if(gpio_d!=0xDD){ + snprintf(buffer, sizeof(buffer), "GPIO_D: %02x\n", gpio_d); + write(fd,buffer,sizeof(buffer)); + } + }*/ + + + /* Apparently necessary for the data to be actually written to file */ + fsync(fd); + udelay(1000000); + + /* This causes the device to shut off instantly + + GPIOF_OUTPUT_VAL = 0; + */ + + close(fd); + udelay(1000000); +} + +/* These functions are present in the firmware library, but we reimplement + them here because the originals do a lot more than we want */ + +void reset_poweroff_timer(void) +{ +} + +int dbg_ports(void) +{ + return 0; +} + +void mpeg_stop(void) +{ +} + +void usb_acknowledge(void) +{ +} + +void usb_wait_for_disconnect(void) +{ +} + +void sys_poweroff(void) +{ +} |