All pastes #277207 Raw Edit

Something

public text v1 · immutable
#277207 ·published 2006-12-13 00:30 UTC
rendered paste body
Index: bootloader/SOURCES
===================================================================
RCS file: /cvsroot/rockbox/bootloader/SOURCES,v
retrieving revision 1.8
diff -u -r1.8 SOURCES
--- bootloader/SOURCES	31 Aug 2006 19:19:35 -0000	1.8
+++ bootloader/SOURCES	13 Dec 2006 00:28:20 -0000
@@ -2,10 +2,8 @@
 ipod.c
 #elif defined(GIGABEAT_F)
 gigabeat.c
-#elif defined(SANSA_E200)
-e200.c
-#elif defined(IRIVER_H10) || defined(IRIVER_H10_5GB)
-h10.c
+#elif defined(IRIVER_H10) || defined(IRIVER_H10_5GB) || defined(SANSA_E200)
+main-pp.c
 #elif defined(ELIO_TPJ1022)
 tpj1022.c
 #else
Index: bootloader/e200.c
===================================================================
RCS file: bootloader/e200.c
diff -N bootloader/e200.c
--- bootloader/e200.c	16 Oct 2006 17:21:30 -0000	1.5
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,190 +0,0 @@
-/***************************************************************************
- *             __________               __   ___.
- *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
- *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
- *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
- *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
- *                     \/            \/     \/    \/            \/
- * $Id: e200.c,v 1.5 2006-10-16 17:21:30 dan_a Exp $
- *
- * Copyright (C) 2006 Daniel Stenberg
- *
- * 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 "panic.h"
-#include "power.h"
-#include "file.h"
-
-static inline void blink(void)
-{
-    volatile unsigned int* ptr;
-    int i;
-    ptr = (volatile unsigned int*)0x70000020;
-
-    *ptr &= ~(1 << 13);
-    for(i = 0; i < 0xfffff; i++)
-    {
-    }
-    *ptr |= (1 << 13);
-    for(i = 0; i < 0xfffff; i++)
-    {
-    }
-}
-
-static inline void slow_blink(void)
-{
-    volatile unsigned int* ptr;
-    int i;
-    ptr = (volatile unsigned int*)0x70000020;
-
-    *ptr &= ~(1 << 13);
-    for(i = 0; i < (0xfffff); i++)
-    {
-    }
-    for(i = 0; i < (0xfffff); i++)
-    {
-    }
-    for(i = 0; i < (0xfffff); i++)
-    {
-    }
-
-    *ptr |= (1 << 13);
-    for(i = 0; i < (0xfffff); i++)
-    {
-    }
-    for(i = 0; i < (0xfffff); i++)
-    {
-    }
-    for(i = 0; i < (0xfffff); i++)
-    {
-    }
-}
-
-static inline unsigned long get_pc(void)
-{
-    unsigned long pc;
-    asm volatile (
-        "mov %0, pc\n"
-        : "=r"(pc)
-    );
-    return pc;
-}
-
-/* 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)
-{
-    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;
-
-    char buf[128];
-    int line;
-
-    lcd_setmargins(0, 0);
-    lcd_clear_display();
-    lcd_setfont(FONT_SYSFIXED);
-
-    while(1)
-    {
-        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;
-
-        line = 0;
-        snprintf(buf, sizeof(buf), "GPIO_A: %02x GPIO_G: %02x", gpio_a, gpio_g);
-        lcd_puts(0, line++, buf);
-        snprintf(buf, sizeof(buf), "GPIO_B: %02x GPIO_H: %02x", gpio_b, gpio_h);
-        lcd_puts(0, line++, buf);
-        snprintf(buf, sizeof(buf), "GPIO_C: %02x GPIO_I: %02x", gpio_c, gpio_i);
-        lcd_puts(0, line++, buf);
-        line++;
-
-        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(buf, sizeof(buf), "GPIO_D: %02x GPIO_J: %02x", gpio_d, gpio_j);
-        lcd_puts(0, line++, buf);
-        snprintf(buf, sizeof(buf), "GPIO_E: %02x GPIO_K: %02x", gpio_e, gpio_k);
-        lcd_puts(0, line++, buf);
-        snprintf(buf, sizeof(buf), "GPIO_F: %02x GPIO_L: %02x", gpio_f, gpio_l);
-        lcd_puts(0, line++, buf);
-        line++;
-        snprintf(buf, sizeof(buf), "ADC_1: %02x", adc_read(ADC_0));
-        lcd_puts(0, line++, buf);
-        snprintf(buf, sizeof(buf), "ADC_2: %02x", adc_read(ADC_1));
-        lcd_puts(0, line++, buf);
-        snprintf(buf, sizeof(buf), "ADC_3: %02x", adc_read(ADC_2));
-        lcd_puts(0, line++, buf);
-        snprintf(buf, sizeof(buf), "ADC_4: %02x", adc_read(ADC_3));
-        lcd_puts(0, line++, buf);
-        lcd_update();
-    }
-    return 0;
-}
-
-void mpeg_stop(void)
-{
-}
-
-void usb_acknowledge(void)
-{
-}
-
-void usb_wait_for_disconnect(void)
-{
-}
-
-void sys_poweroff(void)
-{
-}
-
-void system_reboot(void)
-{
-
-}
-
-void main(void)
-{
-    kernel_init();
-    adc_init();
-    lcd_init_device();
-
-    dbg_ports();
-}
-
Index: bootloader/h10.c
===================================================================
RCS file: bootloader/h10.c
diff -N bootloader/h10.c
--- bootloader/h10.c	28 Aug 2006 08:11:32 -0000	1.4
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,261 +0,0 @@
-/***************************************************************************
- *             __________               __   ___.
- *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
- *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
- *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
- *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
- *                     \/            \/     \/    \/            \/
- * $Id: h10.c,v 1.4 2006-08-28 08:11:32 barrywardell Exp $
- *
- * 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)
-
-/* A buffer to load the iriver firmware or Rockbox into */
-unsigned char loadbuffer[MAX_LOADSIZE];
-
-char version[] = APPSVERSION;
-
-#define DRAM_START              0x10000000
-
-int line=0;
-
-/* Load original iriver firmware. This function expects a file called
-   "/System/Original.mi4" on 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() and crt0.S
-*/
-int load_iriver(unsigned char* buf)
-{
-    int fd;
-    int rc;
-    int len;
-    
-    fd = open("/System/Original.mi4", O_RDONLY);
-
-    len = filesize(fd);
-    
-    if (len > MAX_LOADSIZE)
-        return -6;
-
-    rc = read(fd, buf, len);
-    if(rc < len)
-        return -4;
-
-    close(fd);
-    return len;
-}
-
-/* Load Rockbox firmware (rockbox.h10) */
-int load_rockbox(unsigned char* buf)
-{
-    int fd;
-    int rc;
-    int len;
-    unsigned long chksum;
-    char model[5];
-    unsigned long sum;
-    int i;
-    char str[80];
-    
-    fd = open("/.rockbox/" BOOTFILE, O_RDONLY);
-    if(fd < 0)
-    {
-        fd = open("/" BOOTFILE, O_RDONLY);
-        if(fd < 0)
-            return -1;
-    }
-
-    len = filesize(fd) - 8;
-
-    snprintf(str, sizeof(str), "Length: %x", len);
-    lcd_puts(0, line++ ,str);
-    lcd_update();
-    
-    if (len > MAX_LOADSIZE)
-        return -6;
-
-    lseek(fd, FIRMWARE_OFFSET_FILE_CRC, SEEK_SET);
-    
-    rc = read(fd, &chksum, 4);
-    chksum=betoh32(chksum); /* Rockbox checksums are big-endian */
-    if(rc < 4)
-        return -2;
-
-    snprintf(str, sizeof(str), "Checksum: %x", chksum);
-    lcd_puts(0, line++ ,str);
-    lcd_update();
-
-    rc = read(fd, model, 4);
-    if(rc < 4)
-        return -3;
-
-    model[4] = 0;
-    
-    snprintf(str, sizeof(str), "Model name: %s", model);
-    lcd_puts(0, line++ ,str);
-    lcd_update();
-
-    lseek(fd, FIRMWARE_OFFSET_FILE_DATA, SEEK_SET);
-
-    rc = read(fd, buf, len);
-    if(rc < len)
-        return -4;
-
-    close(fd);
-
-    sum = MODEL_NUMBER;
-    
-    for(i = 0;i < len;i++) {
-        sum += buf[i];
-    }
-
-    snprintf(str, sizeof(str), "Sum: %x", sum);
-    lcd_puts(0, line++ ,str);
-    lcd_update();
-
-    if(sum != chksum)
-        return -5;
-
-    return len;
-}
-
-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();
-
-    line=0;
-
-    lcd_setfont(FONT_SYSFIXED);
-
-    lcd_puts(0, line++, "Rockbox boot loader");
-    snprintf(buf, sizeof(buf), "Version: 20%s", version);
-    lcd_puts(0, line++, buf);
-    snprintf(buf, sizeof(buf), "iriver H10");
-    lcd_puts(0, line++, buf);
-    lcd_update();
-
-    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;
-      }
-      lcd_puts(0, line++, buf);
-      lcd_update();
-    } else {
-      snprintf(buf, sizeof(buf), "ATA: %d", i);
-      lcd_puts(0, line++, buf);
-      lcd_update();
-    }
-
-    disk_init();
-    rc = disk_mount_all();
-    if (rc<=0)
-    {
-        lcd_puts(0, line++, "No partition found");
-        lcd_update();
-    }
-
-    pinfo = disk_partinfo(0);
-    snprintf(buf, sizeof(buf), "Partition 0: 0x%02x %ld MB", 
-                  pinfo->type, pinfo->size / 2048);
-    lcd_puts(0, line++, buf);
-    lcd_update();
-
-    i=button_read_device();
-    if(i==BUTTON_LEFT)
-    {
-        lcd_puts(0, line, "Loading iriver firmware...");
-        lcd_update();
-        rc=load_iriver(loadbuffer);
-    } else {
-        lcd_puts(0, line, "Loading Rockbox...");
-        lcd_update();
-        rc=load_rockbox(loadbuffer);
-    }
-
-    if (rc < 0) {
-            snprintf(buf, sizeof(buf), "Rockbox error: %d",rc);
-            lcd_puts(0, line++, buf);
-            lcd_update();
-    }
-    
-    memcpy((void*)DRAM_START,loadbuffer,rc);
-    
-    return (void*)DRAM_START;
-}
-
-/* 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)
-{
-}
Index: bootloader/main-pp.c
===================================================================
RCS file: bootloader/main-pp.c
diff -N bootloader/main-pp.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ bootloader/main-pp.c	13 Dec 2006 00:28:20 -0000
@@ -0,0 +1,262 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: h10.c,v 1.4 2006-08-28 08:11:32 barrywardell Exp $
+ *
+ * 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 firmware image */
+#define MAX_LOADSIZE (10*1024*1024)
+
+/* A buffer to load the iriver firmware or Rockbox into */
+unsigned char loadbuffer[MAX_LOADSIZE];
+
+char version[] = APPSVERSION;
+
+#define DRAM_START              0x10000000
+
+int line=0;
+
+/* Load original mi4 firmware. This function 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 buf. The rest of the loading is done in main() and crt0.S
+*/
+int load_original_firmware(unsigned char* buf)
+{
+    int fd;
+    int rc;
+    int len;
+    
+    fd = open("/System/OF.bin", O_RDONLY);
+
+    len = filesize(fd);
+    
+    if (len > MAX_LOADSIZE)
+        return -6;
+
+    rc = read(fd, buf, len);
+    if(rc < len)
+        return -4;
+
+    close(fd);
+    return len;
+}
+
+/* Load Rockbox firmware (rockbox.*) */
+int load_rockbox(unsigned char* buf)
+{
+    int fd;
+    int rc;
+    int len;
+    unsigned long chksum;
+    char model[5];
+    unsigned long sum;
+    int i;
+    char str[80];
+    
+    fd = open("/.rockbox/" BOOTFILE, O_RDONLY);
+    if(fd < 0)
+    {
+        fd = open("/" BOOTFILE, O_RDONLY);
+        if(fd < 0)
+            return -1;
+    }
+
+    len = filesize(fd) - 8;
+
+    snprintf(str, sizeof(str), "Length: %x", len);
+    lcd_puts(0, line++ ,str);
+    lcd_update();
+    
+    if (len > MAX_LOADSIZE)
+        return -6;
+
+    lseek(fd, FIRMWARE_OFFSET_FILE_CRC, SEEK_SET);
+    
+    rc = read(fd, &chksum, 4);
+    chksum=betoh32(chksum); /* Rockbox checksums are big-endian */
+    if(rc < 4)
+        return -2;
+
+    snprintf(str, sizeof(str), "Checksum: %x", chksum);
+    lcd_puts(0, line++ ,str);
+    lcd_update();
+
+    rc = read(fd, model, 4);
+    if(rc < 4)
+        return -3;
+
+    model[4] = 0;
+    
+    snprintf(str, sizeof(str), "Model name: %s", model);
+    lcd_puts(0, line++ ,str);
+    lcd_update();
+
+    lseek(fd, FIRMWARE_OFFSET_FILE_DATA, SEEK_SET);
+
+    rc = read(fd, buf, len);
+    if(rc < len)
+        return -4;
+
+    close(fd);
+
+    sum = MODEL_NUMBER;
+    
+    for(i = 0;i < len;i++) {
+        sum += buf[i];
+    }
+
+    snprintf(str, sizeof(str), "Sum: %x", sum);
+    lcd_puts(0, line++ ,str);
+    lcd_update();
+
+    if(sum != chksum)
+        return -5;
+
+    return len;
+}
+
+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();
+
+    line=0;
+
+    lcd_setfont(FONT_SYSFIXED);
+
+    lcd_puts(0, line++, "Rockbox boot loader");
+    snprintf(buf, sizeof(buf), "Version: 20%s", version);
+    lcd_puts(0, line++, buf);
+    snprintf(buf, sizeof(buf), MODEL_NAME);
+    lcd_puts(0, line++, buf);
+    lcd_update();
+
+    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;
+      }
+      lcd_puts(0, line++, buf);
+      lcd_update();
+    } else {
+      snprintf(buf, sizeof(buf), "ATA: %d", i);
+      lcd_puts(0, line++, buf);
+      lcd_update();
+    }
+
+    disk_init();
+    rc = disk_mount_all();
+    if (rc<=0)
+    {
+        lcd_puts(0, line++, "No partition found");
+        lcd_update();
+    }
+
+    pinfo = disk_partinfo(0);
+    snprintf(buf, sizeof(buf), "Partition 0: 0x%02x %ld MB", 
+                  pinfo->type, pinfo->size / 2048);
+    lcd_puts(0, line++, buf);
+    lcd_update();
+
+    i=button_read_device();
+    if(i==BUTTON_LEFT)
+    {
+        lcd_puts(0, line++, "Loading original firmware...");
+        lcd_update();
+        rc=load_original_firmware(loadbuffer);
+    } else {
+        lcd_puts(0, line++, "Loading Rockbox...");
+        lcd_update();
+        rc=load_rockbox(loadbuffer);
+    }
+
+    if (rc < 0) {
+            snprintf(buf, sizeof(buf), "Rockbox error: %d",rc);
+            lcd_puts(0, line++, buf);
+            lcd_update();
+            while(1) {}
+    }
+    
+    memcpy((void*)DRAM_START,loadbuffer,rc);
+    
+    return (void*)DRAM_START;
+}
+
+/* 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)
+{
+}
Index: firmware/SOURCES
===================================================================
RCS file: /cvsroot/rockbox/firmware/SOURCES,v
retrieving revision 1.146
diff -u -r1.146 SOURCES
--- firmware/SOURCES	9 Dec 2006 19:18:16 -0000	1.146
+++ firmware/SOURCES	13 Dec 2006 00:28:21 -0000
@@ -262,7 +262,11 @@
 /* no i2c driver yet */
 #endif
 #if defined(CPU_PP)
+#ifdef BOOTLOADER
+target/arm/crt0-pp-bl.S
+#else
 target/arm/crt0-pp.S
+#endif
 #elif defined(CPU_ARM)
 target/arm/crt0.S
 #endif /* defined(CPU_*) */
Index: firmware/boot.lds
===================================================================
RCS file: /cvsroot/rockbox/firmware/boot.lds,v
retrieving revision 1.26
diff -u -r1.26 boot.lds
--- firmware/boot.lds	10 Dec 2006 13:33:12 -0000	1.26
+++ firmware/boot.lds	13 Dec 2006 00:28:21 -0000
@@ -8,7 +8,7 @@
 OUTPUT_FORMAT(elf32-littlearm)
 OUTPUT_ARCH(arm)
 #ifdef CPU_PP
-INPUT(target/arm/crt0-pp.o)
+INPUT(target/arm/crt0-pp-bl.o)
 #else
 INPUT(target/arm/crt0.o)
 #endif
Index: firmware/rolo.c
===================================================================
RCS file: /cvsroot/rockbox/firmware/rolo.c,v
retrieving revision 1.35
diff -u -r1.35 rolo.c
--- firmware/rolo.c	10 Dec 2006 15:53:26 -0000	1.35
+++ firmware/rolo.c	13 Dec 2006 00:28:22 -0000
@@ -31,9 +31,8 @@
 #include "buffer.h"
 
 #if !defined(IRIVER_IFP7XX_SERIES) && \
-    (CONFIG_CPU != PP5002) && !defined(IRIVER_H10) && \
-    !defined(IRIVER_H10_5GB) && (CONFIG_CPU != S3C2440)
-/* FIX: this doesn't work on iFP, 3rd Gen ipods, or H10 yet */
+    (CONFIG_CPU != PP5002) && (CONFIG_CPU != S3C2440)
+/* FIX: this doesn't work on iFP, 3rd Gen ipods */
 
 #define IRQ0_EDGE_TRIGGER 0x80
 
Index: firmware/system.c
===================================================================
RCS file: /cvsroot/rockbox/firmware/system.c,v
retrieving revision 1.131
diff -u -r1.131 system.c
--- firmware/system.c	5 Dec 2006 20:01:45 -0000	1.131
+++ firmware/system.c	13 Dec 2006 00:28:22 -0000
@@ -26,6 +26,7 @@
 #include "timer.h"
 #include "inttypes.h"
 #include "string.h"
+#include "logf.h"
 
 #ifndef SIMULATOR
 long cpu_frequency = CPU_FREQ;
@@ -574,12 +575,18 @@
 /* TODO: this should really be in the target tree, but moving it there caused
    crt0.S not to find it while linking */
 /* TODO: Even if it isn't in the target tree, this should be the default case */
+extern void e200_button_int(void);
+
 void irq(void)
 {
     if (CPU_INT_STAT & TIMER1_MASK)
         TIMER1();
     else if (CPU_INT_STAT & TIMER2_MASK)
         TIMER2();
+    else if (CPU_HI_INT_STAT & GPIO_MASK){
+        e200_button_int();
+        logf("button interrupt");
+    }
 }
 #else
 extern void ipod_4g_button_int(void);
Index: firmware/export/config-e200.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/config-e200.h,v
retrieving revision 1.6
diff -u -r1.6 config-e200.h
--- firmware/export/config-e200.h	10 Dec 2006 23:12:58 -0000	1.6
+++ firmware/export/config-e200.h	13 Dec 2006 00:28:22 -0000
@@ -5,6 +5,7 @@
 
 /* For Rolo and boot loader */
 #define MODEL_NUMBER 16
+#define MODEL_NAME   "Sandisk Sansa e200"
 
 /* define this if you have recording possibility */
 /*#define HAVE_RECORDING 1*/ /* TODO: add support for this */
Index: firmware/export/config-h10.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/config-h10.h,v
retrieving revision 1.20
diff -u -r1.20 config-h10.h
--- firmware/export/config-h10.h	9 Nov 2006 22:33:24 -0000	1.20
+++ firmware/export/config-h10.h	13 Dec 2006 00:28:23 -0000
@@ -6,6 +6,7 @@
 
 /* For Rolo and boot loader */
 #define MODEL_NUMBER 13
+#define MODEL_NAME   "iriver H10 20GB"
 
 /* define this if you have recording possibility */
 /*#define HAVE_RECORDING 1*/ /* TODO: add support for this */
Index: firmware/export/config-h10_5gb.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/export/config-h10_5gb.h,v
retrieving revision 1.14
diff -u -r1.14 config-h10_5gb.h
--- firmware/export/config-h10_5gb.h	9 Nov 2006 22:33:24 -0000	1.14
+++ firmware/export/config-h10_5gb.h	13 Dec 2006 00:28:23 -0000
@@ -6,6 +6,7 @@
 
 /* For Rolo and boot loader */
 #define MODEL_NUMBER 14
+#define MODEL_NAME   "iriver H10 5/6GB"
 
 /* define this if you have recording possibility */
 /*#define HAVE_RECORDING 1*/ /* TODO: add support for this */
Index: firmware/target/arm/crt0-pp-bl.S
===================================================================
RCS file: firmware/target/arm/crt0-pp-bl.S
diff -N firmware/target/arm/crt0-pp-bl.S
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ firmware/target/arm/crt0-pp-bl.S	13 Dec 2006 00:28:23 -0000
@@ -0,0 +1,179 @@
+/***************************************************************************
+ *             __________               __   ___.
+ *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
+ *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
+ *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
+ *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
+ *                     \/            \/     \/    \/            \/
+ * $Id: crt0-pp.S,v 1.2 2006/11/22 00:49:16 dan_a Exp $
+ *
+ * Copyright (C) 2002 by Linus Nielsen Feltzing
+ *
+ * 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 "cpu.h"
+
+    .section .init.text,"ax",%progbits
+
+    .global    start
+start:
+
+/* PortalPlayer bootloader and startup code based on startup.s from the iPodLinux 
+ * loader
+ *
+ * Copyright (c) 2003, Daniel Palffy (dpalffy (at) rainstorm.org)
+ * Copyright (c) 2005, Bernard Leach <leachbj@bouncycastle.org>
+ *
+ */
+#if CONFIG_CPU == PP5002
+    .equ    PROC_ID,    0xc4000000
+    .equ    COP_CTRL,   0xcf004058
+    .equ    COP_STATUS, 0xcf004050
+    .equ    IIS_CONFIG, 0xc0002500
+    .equ    SLEEP,      0xca
+    .equ    WAKE,       0xce
+    .equ    SLEEPING,   0x4000
+#else
+    .equ    PROC_ID,    0x60000000
+    .equ    COP_CTRL,   0x60007004
+    .equ    COP_STATUS, 0x60007004
+    .equ    IIS_CONFIG, 0x70002800
+    .equ    SLEEP,      0x80000000
+    .equ    WAKE,       0x0
+    .equ    SLEEPING,   0x80000000
+    .equ    CACHE_CTRL, 0x6000c000
+#endif
+
+    msr    cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ */
+
+/* 1 - Copy the bootloader to IRAM */
+    /* get the high part of our execute address */
+    ldr    r7, =0xffffff00
+    and    r4, pc, r7
+
+    /* Copy bootloader to safe area - 0x40000000 (IRAM) */
+    mov    r5, #0x40000000
+    ldr    r6, = _dataend
+1:
+    cmp    r5, r6
+    ldrcc  r2, [r4], #4
+    strcc  r2, [r5], #4
+    bcc    1b
+
+#ifndef IPOD_ARCH
+    /* For builds on targets with mi4 firmware, scramble writes data to 
+       0xe0-0xeb, so jump past that.*/
+    b      pad_skip
+
+.space 60*4 
+
+pad_skip:
+#endif
+
+
+/* 2 - Jump both CPU and COP there */
+    ldr    pc, =start_loc    /* jump to the relocated start_loc:  */
+
+start_loc:
+
+    /* Find out which processor we are */
+    ldr    r0, =PROC_ID
+    ldr    r0, [r0]
+    and    r0, r0, #0xff
+    cmp    r0, #0x55
+    beq    cpu
+    
+    /* put us (co-processor) to sleep */
+    ldr    r4, =COP_CTRL
+    mov    r3, #SLEEP
+    str    r3, [r4]
+    ldr    pc, =cop_wake_start
+
+cop_wake_start:
+#if CONFIG_CPU != PP5002
+     /* COP: Invalidate cache */
+    ldr    r0, =0xf000f044
+    ldr    r1, [r0]
+    orr    r1, r1, #0x6
+    str    r1, [r0]
+
+    ldr    r0, =CACHE_CTRL
+1:
+    ldr    r1, [r0]
+    tst    r1, #0x8000
+    bne    1b
+#endif
+
+    ldr    r0, =startup_loc
+    ldr    pc, [r0]
+
+cpu:
+    /* Wait for COP to be sleeping */
+    ldr    r4, =COP_STATUS
+1:
+    ldr    r3, [r4]
+    ands   r3, r3, #SLEEPING
+    beq    1b
+    
+    /* Initialise bss section to zero */
+    ldr    r2, =_edata
+    ldr    r3, =_end
+    mov    r4, #0
+1:
+    cmp    r3, r2
+    strhi  r4, [r2], #4
+    bhi    1b
+       
+    /* Set up some stack and munge it with 0xdeadbeef */
+    ldr    sp, =stackend
+    mov    r3, sp
+    ldr    r2, =stackbegin
+    ldr    r4, =0xdeadbeef
+1:
+    cmp    r3, r2
+    strhi  r4, [r2], #4
+    bhi    1b
+
+    /* execute the loader - this will load an image to 0x10000000 */
+    bl     main
+
+    ldr    r1, =startup_loc
+    str    r0, [r1]
+
+#if CONFIG_CPU != PP5002
+    /* Flush cache */
+    ldr    r3, =0xf000f044
+    ldr    r4, [r3]
+    orr    r4, r4, #0x2
+    str    r4, [r3]
+
+    ldr    r3, =CACHE_CTRL
+1:
+    ldr    r4, [r3]
+    tst    r4, #0x8000
+    bne    1b
+#endif
+
+    /* Wake up the coprocessor before executing the firmware */
+    ldr    r4, =COP_CTRL
+    mov    r3, #WAKE
+    str    r3, [r4]
+
+    mov    pc, r0
+
+startup_loc:
+    .word    0x0
+    
+#ifdef IPOD_ARCH
+.align 8    /* starts at 0x100 */
+.global boot_table
+boot_table:
+    /* here comes the boot table, don't move its offset */
+    .space 400
+#endif
Index: firmware/target/arm/crt0-pp.S
===================================================================
RCS file: /cvsroot/rockbox/firmware/target/arm/crt0-pp.S,v
retrieving revision 1.2
diff -u -r1.2 crt0-pp.S
--- firmware/target/arm/crt0-pp.S	22 Nov 2006 00:49:16 -0000	1.2
+++ firmware/target/arm/crt0-pp.S	13 Dec 2006 00:28:23 -0000
@@ -5,7 +5,7 @@
  *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
  *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
  *                     \/            \/     \/    \/            \/
- * $Id: crt0-pp.S,v 1.2 2006-11-22 00:49:16 dan_a Exp $
+ * $Id: crt0-pp.S,v 1.2 2006/11/22 00:49:16 dan_a Exp $
  *
  * Copyright (C) 2002 by Linus Nielsen Feltzing
  *
@@ -52,15 +52,9 @@
 
     msr    cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ */
 
-#ifndef BOOTLOADER
     b      pad_skip
 
-#if defined(SANSA_E200)
-/* mi4tool writes junk between 0xe0 and 0xeb.  Avoid this. */
-.space 60*4 /* (more than enough) space for exception vectors */
-#else
-.space 50*4
-#endif
+.space 50*4 /* (more than enough) space for exception vectors */
 
 pad_skip:
 #ifdef SANSA_E200
@@ -108,11 +102,13 @@
 
     /* After doing the remapping, send the COP to sleep.
        On wakeup it will go to cop_init */
+
+    /* Find out which processor we are */
     ldr    r0, =PROC_ID
     ldr    r0, [r0]
     and    r0, r0, #0xff
     cmp    r0, #0x55
-    beq    1f
+    beq    cpu_init
     
     /* put us (co-processor) to sleep */
     ldr    r4, =COP_CTRL
@@ -121,9 +117,15 @@
 
     ldr    pc, =cop_init
 
-1:
 
-#ifndef DEBUG
+cpu_init:
+    /* Wait for COP to be sleeping */
+    ldr    r4, =COP_STATUS
+1:
+    ldr    r3, [r4]
+    ands   r3, r3, #SLEEPING
+    beq    1b
+    
     /* Copy exception handler code to address 0 */
     ldr    r2, =_vectorsstart
     ldr    r3, =_vectorsend
@@ -133,15 +135,7 @@
     ldrhi  r5, [r4], #4
     strhi  r5, [r2], #4
     bhi    1b
-#else
-    ldr    r1, =vectors
-    ldr    r0, =irq_handler
-    str    r0, [r1, #24]
-    ldr    r0, =fiq_handler
-    str    r0, [r1, #28]
-#endif
 
-#ifndef STUB
     /* Zero out IBSS */
     ldr    r2, =_iedata
     ldr    r3, =_iend
@@ -160,8 +154,6 @@
     ldrhi  r5, [r2], #4
     strhi  r5, [r3], #4
     bhi    1b
-#endif /* !STUB */
-#endif /* !BOOTLOADER */
 
     /* Initialise bss section to zero */
     ldr    r2, =_edata
@@ -181,90 +173,6 @@
     cmp    r3, r2
     strhi  r4, [r2], #4
     bhi    1b
-
-#ifdef BOOTLOADER
-    /* TODO: the high part of the address is probably dependent on CONFIG_CPU.
-       Since we tend to use ifdefs for each chipset target
-       anyway, we might as well just hardcode it here.
-     */
-       
-    /* get the high part of our execute address */
-    ldr    r0, =0xff000000
-    and    r8, pc, r0             @ r8 is used later
-
-    /* Find out which processor we are */
-    mov    r0, #PROC_ID
-    ldr    r0, [r0]
-    and    r0, r0, #0xff
-    cmp    r0, #0x55
-    beq    1f
-
-    /* put us (co-processor) to sleep */
-    ldr    r4, =COP_CTRL
-    mov    r3, #SLEEP
-    str    r3, [r4]
-    ldr    pc, =cop_wake_start
-
-cop_wake_start:
-    /* jump the COP to startup */
-    ldr    r0, =startup_loc
-    ldr    pc, [r0]
-
-1:
-    
-    /* get the high part of our execute address */
-    ldr    r2, =0xffffff00
-    and    r4, pc, r2
-
-    /* Copy bootloader to safe area - 0x40000000 */
-    mov    r5, #0x40000000
-    ldr    r6, = _dataend
-    sub    r0, r6, r5       /* length of loader */
-    add    r0, r4, r0     /* r0 points to start of loader */
-1:
-    cmp    r5, r6
-    ldrcc  r2, [r4], #4
-    strcc  r2, [r5], #4
-    bcc    1b
-
-    ldr    pc, =start_loc    /* jump to the relocated start_loc:  */
-    
-start_loc:
-
-    /* execute the loader - this will load an image to 0x10000000 */
-    bl     main
-
-    /* Wake up the coprocessor before executing the firmware */
-
-    /* save the startup address for the COP */
-    ldr    r1, =startup_loc
-    str    r0, [r1]
-
-    /* make sure COP is sleeping */
-    ldr    r4, =COP_STATUS
-1:
-    ldr    r3, [r4]
-    ands   r3, r3, #SLEEPING
-    beq    1b
-
-    /* wake up COP */
-    ldr    r4, =COP_CTRL
-    mov    r3, #WAKE
-    str    r3, [r4]
-
-    /* jump to start location */
-    mov    pc, r0
-
-startup_loc:
-    .word    0x0
-
-.align 8    /* starts at 0x100 */
-.global boot_table
-boot_table:
-    /* here comes the boot table, don't move its offset */
-    .space 400
-
-#else /* BOOTLOADER */
     
     /* Set up stack for IRQ mode */ 
     msr    cpsr_c, #0xd2
@@ -290,6 +198,21 @@
     /* main() should never return */
 
 cop_init:
+#if CONFIG_CPU != PP5002
+    /* COP: Invalidate cache */
+    ldr    r0, =0xf000f044
+    ldr    r1, [r0]
+    orr    r1, r1, #0x6
+    str    r1, [r0]
+
+    ldr    r0, =0x6000c000
+1:
+    ldr    r1, [r0]
+    tst    r1, #0x8000
+    bne    1b
+#endif
+
+    /* Setup stack for COP */
     ldr    sp, =cop_stackend
     mov    r3, sp
     ldr    r2, =cop_stackbegin
@@ -300,6 +223,8 @@
     bhi    2b
 
     ldr    sp, =cop_stackend
+    
+    /* Run cop_main() in apps/main.c */
     bl     cop_main
     
 /* Exception handlers. Will be copied to address 0 after memory remapping */
@@ -385,5 +310,3 @@
 /* 256 words of FIQ stack */
     .space 256*4
 fiq_stack:
-
-#endif /* BOOTLOADER */ 
Index: firmware/target/arm/sandisk/sansa-e200/button-e200.c
===================================================================
RCS file: /cvsroot/rockbox/firmware/target/arm/sandisk/sansa-e200/button-e200.c,v
retrieving revision 1.2
diff -u -r1.2 button-e200.c
--- firmware/target/arm/sandisk/sansa-e200/button-e200.c	16 Oct 2006 00:18:49 -0000	1.2
+++ firmware/target/arm/sandisk/sansa-e200/button-e200.c	13 Dec 2006 00:28:24 -0000
@@ -28,16 +28,125 @@
 #include "backlight.h"
 #include "system.h"
 
+static unsigned int old_wheel_value = 0;
+int int_btn = BUTTON_NONE;
+static bool hold_button = false;
 
-void button_init_device(void)
+static int e200_button_read(void)
 {
-    /* Enable all buttons except the wheel */
-    GPIOF_ENABLE |= 0xff;
+    unsigned char source, wheel_source, state, wheel_state;
+    int btn = BUTTON_NONE;
+    
+    /* get source(s) of interupt */
+    source = GPIOA_INT_STAT & 0x3f;
+    wheel_source = GPIOB_INT_STAT & 0x30;
+
+    if (source == 0 && wheel_source == 0) {
+        return BUTTON_NONE; /* not for us */
+    }
+    
+    /* get current keypad & wheel status */
+    state = GPIOF_INPUT_VAL & 0xff;
+    wheel_state = GPIOH_INPUT_VAL & 0xc0;
+    
+    /* toggle interrupt level */
+    GPIOA_INT_LEV = ~state;
+    GPIOB_INT_LEV = ~wheel_state;
+    
+    /* device buttons */
+    //if (!hold_button)
+    {
+        /* Read normal buttons */
+        if ((state & 0x1) == 0) btn |= BUTTON_REC;
+        if ((state & 0x2) == 0) btn |= BUTTON_DOWN;
+        if ((state & 0x4) == 0) btn |= BUTTON_RIGHT;
+        if ((state & 0x8) == 0) btn |= BUTTON_LEFT;
+        if ((state & 0x10) == 0) btn |= BUTTON_SELECT; /* The centre button */
+        if ((state & 0x20) == 0) btn |= BUTTON_UP; /* The "play" button */
+        if ((state & 0x40) != 0) btn |= BUTTON_POWER;
+        
+        /* Read wheel 
+         * Bits 6 and 7 of GPIOH change as follows:
+         * Clockwise rotation   01 -> 00 -> 10 -> 11
+         * Counter-clockwise    11 -> 10 -> 00 -> 01
+         *
+         * This is equivalent to wheel_value of:
+         * Clockwise rotation   0x40 -> 0x00 -> 0x80 -> 0xc0
+         * Counter-clockwise    0xc0 -> 0x80 -> 0x00 -> 0x40
+         */
+        wheel_state = GPIOH_INPUT_VAL & 0xc0;
+        switch(wheel_state){
+        case 0x00:
+            if(old_wheel_value==0x80)
+                btn |= BUTTON_SCROLL_UP;
+            else if (old_wheel_value==0x40)
+                btn |= BUTTON_SCROLL_DOWN;
+            break;
+        case 0x40:
+            if(old_wheel_value==0x00)
+                btn |= BUTTON_SCROLL_UP;
+            else if (old_wheel_value==0xc0)
+                btn |= BUTTON_SCROLL_DOWN;
+            break;
+        case 0x80:
+                    if(old_wheel_value==0xc0)
+                btn |= BUTTON_SCROLL_UP;
+            else if (old_wheel_value==0x00)
+                btn |= BUTTON_SCROLL_DOWN;
+            break;
+        case 0xc0:
+                    if(old_wheel_value==0x40)
+                btn |= BUTTON_SCROLL_UP;
+            else if (old_wheel_value==0x80)
+                btn |= BUTTON_SCROLL_DOWN;
+            break;
+        }
+        old_wheel_value = wheel_state;
+    }
+
+    /* ack any active interrupts */
+    if (source)
+        GPIOF_INT_CLR = source;
+    if (wheel_source)
+        GPIOH_INT_CLR = wheel_source;
+
+    return btn;
 }
 
-bool button_hold(void)
+void e200_button_int(void)
 {
-    return (GPIOF_INPUT_VAL & 0x80)?true:false;
+    CPU_HI_INT_CLR = GPIO_MASK;
+    int_btn = e200_button_read();
+    //CPU_INT_EN = 0x40000000;
+    CPU_HI_INT_EN = GPIO_MASK;
+}
+
+void button_init_device(void)
+{
+    /* Enable all buttons except the wheel */
+    GPIOF_ENABLE |= 0xff;
+    
+    /* Enable scroll wheel */
+    GPIOH_ENABLE |= 0xc0;
+    
+    /* buttons - set interrupt levels */
+    GPIOF_INT_LEV = ~(GPIOF_INPUT_VAL & 0xff);
+    GPIOF_INT_CLR = GPIOF_INT_STAT & 0xff;
+    
+    /* scroll wheel - set interrupt levels */
+    GPIOH_INT_LEV = ~(GPIOH_INPUT_VAL & 0xc0);
+    GPIOH_INT_CLR = GPIOH_INT_STAT & 0xc0;
+    
+    /* enable interrupts */
+    GPIOF_INT_EN = 0xff;
+    GPIOH_INT_EN = 0xc0;
+    
+    /* unmask interrupt */
+    CPU_INT_EN = 0x40000000;
+    CPU_HI_INT_EN = GPIO_MASK;
+    
+    /* Read initial wheel value (bit 6-7 of GPIOH) */
+    old_wheel_value = GPIOH_INPUT_VAL & 0xc0;
 }
 
 /*
@@ -45,9 +154,6 @@
  */
 int button_read_device(void)
 {
-    int btn = BUTTON_NONE;
-    unsigned char state;
-    static bool hold_button = false;
     bool hold_button_old;
 
     /* Hold */
@@ -64,19 +170,11 @@
 #endif
 #endif
 
-    /* device buttons */
-    if (!hold_button)
-    {
-        /* Read normal buttons */
-        state = GPIOF_INPUT_VAL & 0xff;
-        if ((state & 0x1) == 0) btn |= BUTTON_REC;
-        if ((state & 0x2) == 0) btn |= BUTTON_DOWN;
-        if ((state & 0x4) == 0) btn |= BUTTON_RIGHT;
-        if ((state & 0x8) == 0) btn |= BUTTON_LEFT;
-        if ((state & 0x10) == 0) btn |= BUTTON_SELECT; /* The centre button */
-        if ((state & 0x20) == 0) btn |= BUTTON_UP; /* The "play" button */
-        if ((state & 0x40) != 0) btn |= BUTTON_POWER;
-    }
+    /* The int_btn variable is set in the button interrupt handler */
+    return int_btn;
+}
 
-    return btn;
+bool button_hold(void)
+{
+    return (GPIOF_INPUT_VAL & 0x80)?true:false;
 }
Index: firmware/target/arm/sandisk/sansa-e200/button-target.h
===================================================================
RCS file: /cvsroot/rockbox/firmware/target/arm/sandisk/sansa-e200/button-target.h,v
retrieving revision 1.3
diff -u -r1.3 button-target.h
--- firmware/target/arm/sandisk/sansa-e200/button-target.h	14 Oct 2006 12:16:29 -0000	1.3
+++ firmware/target/arm/sandisk/sansa-e200/button-target.h	13 Dec 2006 00:28:24 -0000
@@ -28,6 +28,7 @@
 bool button_hold(void);
 void button_init_device(void);
 int button_read_device(void);
+void e200_button_int(void);
 
 /* Sandisk Sansa E200 button codes */
 
Index: tools/configure
===================================================================
RCS file: /cvsroot/rockbox/tools/configure,v
retrieving revision 1.245
diff -u -r1.245 configure
--- tools/configure	27 Nov 2006 02:15:39 -0000	1.245
+++ tools/configure	13 Dec 2006 00:28:28 -0000
@@ -1115,10 +1115,10 @@
     target="-DSANSA_E200"
     memory=32 # supposedly
     arm7tdmicc
-    tool="$rootdir/tools/scramble -mi4v3"
+    tool="$rootdir/tools/scramble -add=e200"
     bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
     bmp2rb_native="$rootdir/tools/bmp2rb -f 4"
-    output="PP5022.mi4"
+    output="rockbox.e200"
     appextra="recorder:gui"
     archosrom=""
     flash=""
Index: tools/scramble.c
===================================================================
RCS file: /cvsroot/rockbox/tools/scramble.c,v
retrieving revision 1.35
diff -u -r1.35 scramble.c
--- tools/scramble.c	31 Aug 2006 19:19:35 -0000	1.35
+++ tools/scramble.c	13 Dec 2006 00:28:29 -0000
@@ -89,7 +89,7 @@
            "\t-mi4v3  PortalPlayer .mi4 format (revision 010301)\n"
            "\t-add=X  Rockbox generic \"add-up\" checksum format\n"
            "\t        (X values: h100, h120, h140, h300, ipco, nano, ipvd\n"
-           "\t                   ip3g, ip4g, mini, x5, h10, h10_5gb)\n"
+           "\t                   ip3g, ip4g, mini, x5, h10, h10_5gb, tpj2, e200)\n"
            "\nNo option results in Archos standard player/recorder format.\n");
 
     exit(1);
@@ -207,6 +207,8 @@
             modelnum = 14;
         else if(!strcmp(&argv[1][5], "tpj2"))
             modelnum = 15;
+        else if(!strcmp(&argv[1][5], "e200"))
+            modelnum = 16;
         else {
             fprintf(stderr, "unsupported model: %s\n", &argv[1][5]);
             return 2;