Index: bootloader/SOURCES
===================================================================
--- bootloader/SOURCES	(revision 12136)
+++ bootloader/SOURCES	(working copy)
@@ -1,10 +1,10 @@
+common.c
+
 #if defined(IPOD_ARCH)
-common.c
 ipod.c
 #elif defined(GIGABEAT_F)
 gigabeat.c
 #elif defined(IRIVER_H10) || defined(IRIVER_H10_5GB) || defined(SANSA_E200)
-common.c
 main-pp.c
 #elif defined(ELIO_TPJ1022)
 tpj1022.c
Index: bootloader/tpj1022.c
===================================================================
--- bootloader/tpj1022.c	(revision 12134)
+++ bootloader/tpj1022.c	(working copy)
@@ -37,11 +37,10 @@
 #include "panic.h"
 #include "power.h"
 #include "file.h"
+#include "common.h"
 
 char version[] = APPSVERSION;
 
-int line=0;
-
 void* main(void)
 {
     int i;
@@ -54,8 +53,7 @@
     lcd_init();
     font_init();
 
-    lcd_puts(0, line++ ,"Hello World!");
-    lcd_update();
+    printf("Hello World!");
 #endif
 
     i=ata_init();
@@ -108,20 +106,6 @@
 
 /* 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)
 {
 }
@@ -129,7 +113,3 @@
 void usb_wait_for_disconnect(void)
 {
 }
-
-void sys_poweroff(void)
-{
-}
Index: bootloader/gigabeat.c
===================================================================
--- bootloader/gigabeat.c	(revision 12134)
+++ bootloader/gigabeat.c	(working copy)
@@ -18,11 +18,10 @@
 #include "power.h"
 #include "file.h"
 #include "button-target.h"
+#include "common.h"
 
 extern void map_memory(void);
 
-int line = 0;
-
 char version[] = APPSVERSION;
 
 static void go_usb_mode(void)
@@ -55,30 +54,25 @@
     int orig_file = 0, dest_file = 0;
     int size = 0, size_read;
     static char buf[4096];
-    char lcd_buf[64];
-
+    
     orig_file = open("/GBSYSTEM/FWIMG/FWIMG01.DAT.ORIG", O_RDONLY);
     if(orig_file < 0) {
         /* Couldn't open source file */
-        lcd_puts(0, line++, "Couldn't open FWIMG01.DAT.ORIG for reading");
-        lcd_update();
+        printf("Couldn't open FWIMG01.DAT.ORIG for reading");
         return(1);
     }
 
-    lcd_puts(0, line++, "FWIMG01.DAT.ORIG opened for reading");
-    lcd_update();
+    printf("FWIMG01.DAT.ORIG opened for reading");
 
     dest_file = open("/GBSYSTEM/FWIMG/FWIMG01.DAT", O_RDWR);
     if(dest_file < 0) {
         /* Couldn't open destination file */
-        lcd_puts(0, line++, "Couldn't open FWIMG01.DAT.ORIG for writing");
-        lcd_update();
+        printf("Couldn't open FWIMG01.DAT.ORIG for writing");
         close(orig_file);
         return(2);
     }
 
-    lcd_puts(0, line++, "FWIMG01.DAT opened for writing");
-    lcd_update();
+    printf("FWIMG01.DAT opened for writing");
 
     do {
         /* Copy in chunks */
@@ -95,65 +89,22 @@
     close(orig_file);
     close(dest_file);
 
-    snprintf(lcd_buf, sizeof(lcd_buf), "Finished copying %ld bytes from", size);
-    lcd_puts(0, line++, lcd_buf);
-    lcd_puts(0, line++, "FWIMG01.DAT.ORIG to FWIMG01.DAT");
+    printf("Finished copying %ld bytes from", size);
+    printf("FWIMG01.DAT.ORIG to FWIMG01.DAT");
 
     return(0);
 }
 
-
-int load_rockbox(const char* file_name, unsigned char* buf, int buffer_size)
-{
-    int fd;
-    int rc;
-    int len;
-    char str[256];
-
-    fd = open("/.rockbox/" BOOTFILE, O_RDONLY);
-    if(fd < 0) {
-        fd = open("/" BOOTFILE, O_RDONLY);
-        if(fd < 0)
-            return -1;
-    }
-    fd = open(file_name, O_RDONLY);
-    if(fd < 0)
-        return -2;
-
-    len = filesize(fd);
-
-    if(len > buffer_size) {
-        snprintf(str, sizeof(str), "len: %d buf: %d", len, buffer_size);
-        lcd_puts(0, line++, str);
-        lcd_update();
-        return -6;
-    }
-
-    rc = read(fd, buf, len);
-    if(rc < len) {
-        snprintf(str, sizeof(str), "len: %d rc: %d", len, rc);
-        lcd_puts(0, line++, str);
-        lcd_update();
-        return -4;
-    }
-
-    close(fd);
-
-    return len;
-}
-
 char buf[256];
 
 void display_instructions(void)
 {
     lcd_setfont(FONT_SYSFIXED);
-    lcd_puts(0, line++, "Hold MENU when booting for rescue mode.");
-    lcd_puts(0, line++, "  \"VOL+\" button to restore original kernel");
-    lcd_puts(0, line++, "  \"A\" button to load original firmware");
-    line++;
-    snprintf(buf, sizeof(buf), "FRAME %x TTB %x", FRAME, TTB_BASE);
-    lcd_puts(0, line++, buf);
-    lcd_update();
+    printf("Hold MENU when booting for rescue mode.");
+    printf("  \"VOL+\" button to restore original kernel");
+    printf("  \"A\" button to load original firmware");
+    printf("");
+    printf("FRAME %x TTB %x", FRAME, TTB_BASE);
 }
 
 void * main(void)
@@ -179,23 +130,20 @@
     }
     if(GPGDAT & 2) {
         lcd_init();
-        lcd_puts(0, line++, "Entering rescue mode..");
-        lcd_update();
+        printf("Entering rescue mode..");
         go_usb_mode();
         while(1);
     }
     if(GPGDAT & 0x10) {
         lcd_init();
         load_original = true;
-        lcd_puts(0, line++, "Loading original firmware...");
-        lcd_update();
+        printf("Loading original firmware...");
     }
 
     i = ata_init();
     i = disk_mount_all();
     if(!show_bootsplash) {
-        snprintf(buf, sizeof(buf), "disk_mount_all: %d", i);
-        lcd_puts(0, line++, buf);
+        printf("disk_mount_all: %d", i);
     }
     if(show_bootsplash) {
         int fd = open("/bootsplash.raw", O_RDONLY);
@@ -216,17 +164,15 @@
     if(GPGDAT & 4) {
 
         /* Try to restore the original kernel/bootloader if a copy is found */
-        lcd_puts(0, line++, "Restoring FWIMG01.DAT...");
-        lcd_update();
+        printf("Restoring FWIMG01.DAT...");
 
         if(!restore_fwimg01dat()) {
-            lcd_puts(0, line++, "Restoring FWIMG01.DAT successful.");
+            printf("Restoring FWIMG01.DAT successful.");
         } else {
-            lcd_puts(0, line++, "Restoring FWIMG01.DAT failed.");
+            printf("Restoring FWIMG01.DAT failed.");
         }
 
-        lcd_puts(0, line++, "Now power cycle to boot original");
-        lcd_update();
+        printf("Now power cycle to boot original");
         while(1);
     }
 
@@ -242,76 +188,66 @@
         for(i=39; i && buf[i]==' '; i--)
             buf[i] = 0;
 
-        lcd_puts(0, line++, "Model");
-        lcd_puts(0, line++, buf);
+        printf("Model");
+        printf(buf);
 
         for(i=0; i < 4; i++)
             ((unsigned short*)buf)[i]=htobe16(identify_info[i+23]);
 
         buf[8]=0;
 
-        lcd_puts(0, line++, "Firmware");
-        lcd_puts(0, line++, buf);
+        printf("Firmware");
+        printf(buf);
 
         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();
+        printf("Partition 0: 0x%02x %ld MB", pinfo->type, pinfo->size / 2048);
     }
     /* Load original firmware */
     if(load_original) {
         loadbuffer = (unsigned char*)0x30008000;
         buffer_size =(unsigned char*)0x31000000 - loadbuffer;
-        rc = load_rockbox("/rockbox.gigabeat", loadbuffer, buffer_size);
-        if(rc < 0) {
-            lcd_puts(0, line++, "failed to load original firmware. Loading rockbox");
-            lcd_update();
+        rc = load_firmware("rockbox.gigabeat", loadbuffer, buffer_size);
+        if(rc < EOK) {
+            printf("Error!");
+            printf("Failed to load original firmware:");
+            printf(strerror(rc));
+            printf("Loading rockbox");
             sleep(2*HZ);
             goto load_rockbox;
         }
 
-        snprintf(buf, sizeof(buf), "Loaded: %d", rc);
-        lcd_puts(0, line++, buf);
-        lcd_update();
+        printf("Loaded: %d", rc);
         sleep(2*HZ);
 
         (*((int*)0x7000000)) = 333;
         rc = *((int*)0x7000000+0x8000000);
-        snprintf(buf, sizeof(buf), "Bank0 mem test: %d", rc);
-        lcd_puts(0, line++, buf);
-        lcd_update();
+        printf("Bank0 mem test: %d", rc);
         sleep(3*HZ);
 
-        lcd_puts(0, line++, "Woops, should not return from firmware!");
-        lcd_update();
+        printf("Woops, should not return from firmware!");
         goto usb;
     }
 
 load_rockbox:
     map_memory();
     if(!show_bootsplash) {
-        lcd_puts(0, line, "Loading Rockbox...");
-        lcd_update();
+        printf("Loading Rockbox...");
     }
 
     loadbuffer = (unsigned char*) 0x100;
     buffer_size = (unsigned char*)0x400000 - loadbuffer;
-    rc=load_rockbox("/rockbox.gigabeat", loadbuffer, buffer_size);
-    if(rc < 0) {
-        snprintf(buf, sizeof(buf), "Rockbox error: %d",rc);
-        lcd_puts(0, line++, buf);
-        lcd_update();
+    rc=load_firmware("rockbox.gigabeat", loadbuffer, buffer_size);
+    if(rc < EOK) {
+            printf("Error!");
+            printf("Can't load rockbox.gigabeat:");
+            printf(strerror(rc));
     } else {
         if(!show_bootsplash) {
-            lcd_puts(0, line++, "Rockbox loaded.");
-            lcd_update();
+            printf("Rockbox loaded.");
         }
         kernel_entry = (void*) loadbuffer;
         rc = kernel_entry();
-        snprintf(buf, sizeof(buf), "Woops, should not return from firmware: %d", rc);
-        lcd_puts(0, line++, buf);
-        lcd_update();
+        printf("Woops, should not return from firmware: %d", rc);
         goto usb;
     }
 usb:
Index: bootloader/main.c
===================================================================
--- bootloader/main.c	(revision 12134)
+++ bootloader/main.c	(working copy)
@@ -43,20 +43,19 @@
 #include "eeprom_settings.h"
 
 #include "pcf50606.h"
+#include "common.h"
 
 #include <stdarg.h>
 
+/* Maximum allowed firmware image size. 10MB is more than enough */
+#define MAX_LOADSIZE (10*1024*1024)
+
 #define DRAM_START 0x31000000
 
 #ifdef HAVE_EEPROM_SETTINGS
 static bool recovery_mode = false;
 #endif
 
-int line = 0;
-#ifdef HAVE_REMOTE_LCD
-int remote_line = 0;
-#endif
-
 int usb_screen(void)
 {
    return 0;
@@ -64,41 +63,6 @@
 
 char version[] = APPSVERSION;
 
-char printfbuf[256];
-
-void reset_screen(void)
-{
-    lcd_clear_display();
-    line = 0;
-#ifdef HAVE_REMOTE_LCD
-    lcd_remote_clear_display();
-    remote_line = 0;
-#endif
-}
-
-void printf(const char *format, ...)
-{
-    int len;
-    unsigned char *ptr;
-    va_list ap;
-    va_start(ap, format);
-
-    ptr = printfbuf;
-    len = vsnprintf(ptr, sizeof(printfbuf), format, ap);
-    va_end(ap);
-
-    lcd_puts(0, line++, ptr);
-    lcd_update();
-    if(line >= 16)
-        line = 0;
-#ifdef HAVE_REMOTE_LCD
-    lcd_remote_puts(0, remote_line++, ptr);
-    lcd_remote_update();
-    if(remote_line >= 8)
-        remote_line = 0;
-#endif
-}
-
 /* Reset the cookie for the crt0 crash check */
 inline void __reset_cookie(void)
 {
@@ -116,68 +80,6 @@
     asm(" jmp (%a0)");
 }
 
-int load_firmware(void)
-{
-    int fd;
-    int rc;
-    int len;
-    unsigned long chksum;
-    char model[5];
-    unsigned long sum;
-    int i;
-    unsigned char *buf = (unsigned char *)DRAM_START;
-
-    fd = open("/.rockbox/" BOOTFILE, O_RDONLY);
-    if(fd < 0)
-    {
-        fd = open("/" BOOTFILE, O_RDONLY);
-        if(fd < 0)
-            return -1;
-    }
-
-    len = filesize(fd) - 8;
-
-    printf("Length: %x", len);
-
-    lseek(fd, FIRMWARE_OFFSET_FILE_CRC, SEEK_SET);
-
-    rc = read(fd, &chksum, 4);
-    if(rc < 4)
-        return -2;
-
-    printf("Checksum: %x", chksum);
-
-    rc = read(fd, model, 4);
-    if(rc < 4)
-        return -3;
-
-    model[4] = 0;
-
-    printf("Model name: %s", model);
-    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];
-    }
-
-    printf("Sum: %x", sum);
-
-    if(sum != chksum)
-        return -5;
-
-    return 0;
-}
-
 void start_firmware(void)
 {
     asm(" move.w #0x2700,%sr");
@@ -353,6 +255,7 @@
     int defopt = -1;
     char buf[32];
     int i;
+    extern int line;
     
     reset_screen();
     printf("Bootloader %s", version);
@@ -516,8 +419,8 @@
     }
 
     printf("Loading firmware");
-    i = load_firmware();
-    printf("Result: %d", i);
+    i = load_firmware((unsigned char *)DRAM_START, BOOTFILE, MAX_LOADSIZE);
+    printf("Result: %s", strerror(i));
 
     if(i == 0)
         start_firmware();
@@ -525,6 +428,7 @@
     power_off();
 
 #else
+    extern int line;
     /* We want to read the buttons as early as possible, before the user
        releases the ON button */
 
@@ -721,8 +625,8 @@
     }
 
     printf("Loading firmware");
-    i = load_firmware();
-    printf("Result: %d", i);
+    i = load_firmware((unsigned char *)DRAM_START, BOOTFILE, MAX_LOADSIZE);
+    printf("Result: %d", strerror(i));
 
     if (i == 0)
         start_firmware();
@@ -739,24 +643,6 @@
 
 /* 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)
-{
-}
-
 void screen_dump(void)
 {
 }
-
-int dbg_ports(void)
-{
-   return 0;
-}
-
-void mpeg_stop(void)
-{
-}
-
-void sys_poweroff(void)
-{
-}
