summaryrefslogtreecommitdiffstats
path: root/bootloader
diff options
context:
space:
mode:
authorHristo Kovachev <bger@rockbox.org>2006-08-11 08:35:27 +0000
committerHristo Kovachev <bger@rockbox.org>2006-08-11 08:35:27 +0000
commit9dc0e6222942b31ecf8a7ba4b8f4d1dff1d52caa (patch)
treeca0458168d06e758160bae2980797ee52ed27fb4 /bootloader
parent2c3fd0ce7e035fe0c42fed1e4be9c5a22518fd6f (diff)
downloadrockbox-9dc0e6222942b31ecf8a7ba4b8f4d1dff1d52caa.tar.gz
rockbox-9dc0e6222942b31ecf8a7ba4b8f4d1dff1d52caa.tar.bz2
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.c262
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)
+{
+}