Fast boot from flash
authorlekernel <sebastien.bourdeauducq@lekernel.net>
Fri, 25 Jun 2010 19:11:49 +0000 (21:11 +0200)
committerlekernel <sebastien.bourdeauducq@lekernel.net>
Fri, 25 Jun 2010 19:11:49 +0000 (21:11 +0200)
software/bios/Makefile
software/bios/boot.c
software/bios/boot.h
software/bios/main.c

index 9623b40..365c6ee 100644 (file)
@@ -35,7 +35,9 @@ boot.o: ../../software/include/base/console.h
 boot.o: ../../software/include/base/uart.h
 boot.o: ../../software/include/base/system.h
 boot.o: ../../software/include/base/board.h ../../software/include/base/crc.h
-boot.o: ../../tools/sfl.h ../../software/include/net/microudp.h
+boot.o: ../../tools/sfl.h ../../software/include/base/blockdev.h
+boot.o: ../../software/include/base/fatfs.h
+boot.o: ../../software/include/net/microudp.h
 boot.o: ../../software/include/net/tftp.h ../../software/include/hw/hpdmc.h
 boot.o: ../../software/include/hw/common.h boot.h
 main.o: ../../software/include/base/stdio.h
@@ -43,6 +45,7 @@ main.o: ../../software/include/base/stdlib.h
 main.o: ../../software/include/base/console.h
 main.o: ../../software/include/base/string.h
 main.o: ../../software/include/base/uart.h
+main.o: ../../software/include/base/blockdev.h
 main.o: ../../software/include/base/fatfs.h ../../software/include/base/crc.h
 main.o: ../../software/include/base/system.h
 main.o: ../../software/include/base/board.h
index 36f0797..fce584c 100644 (file)
@@ -22,6 +22,8 @@
 #include <board.h>
 #include <crc.h>
 #include <sfl.h>
+#include <blockdev.h>
+#include <fatfs.h>
 
 #include <net/microudp.h>
 #include <net/tftp.h>
@@ -58,7 +60,7 @@ static int check_ack()
        int recognized;
        static const char str[SFL_MAGIC_LEN] = SFL_MAGIC_ACK;
        
-       timeout = 4500000;
+       timeout = 2000000;
        recognized = 0;
        while(timeout > 0) {
                if(readchar_nonblock()) {
@@ -259,7 +261,57 @@ void netboot()
        boot(cmdline_adr, initrdstart_adr, initrdend_adr, SDRAM_BASE);
 }
 
-void cardboot(int alt)
+static int tryload(char *filename, unsigned int address)
 {
-       printf("FIXME: memory card boot is not implemented\n");
+       int devsize, realsize;
+
+       devsize = fatfs_load(filename, (char *)address, 16*1024*1024, &realsize);
+       if(devsize <= 0)
+               return -1;
+       if(realsize > devsize) {
+               printf("E: File size larger than the blocks read (corrupted FS or IO error ?)\n");
+               return -1;
+       }
+       printf("I: Read a %d byte image from %s\n", realsize, filename);
+
+       return realsize;
+}
+
+void fsboot()
+{
+       int size;
+       unsigned int cmdline_adr, initrdstart_adr, initrdend_adr;
+
+       printf("I: Booting from filesystem...\n");
+       if(!fatfs_init(BLOCKDEV_FLASH, 0)) {
+               printf("E: Unable to initialize filesystem\n");
+               return;
+       }
+
+       if(tryload("BOOT.BIN", SDRAM_BASE) <= 0) {
+               printf("E: Firmware image not found\n");
+               fatfs_done();
+               return;
+       }
+
+       cmdline_adr = SDRAM_BASE+0x1000000;
+       size = tryload("CMDLINE.TXT", cmdline_adr);
+       if(size <= 0) {
+               printf("I: No command line parameters found (CMDLINE.TXT)\n");
+               cmdline_adr = 0;
+       } else
+               *((char *)(cmdline_adr+size)) = 0x00;
+
+       initrdstart_adr = SDRAM_BASE+0x1002000;
+       size = tryload("INITRD.BIN", initrdstart_adr);
+       if(size <= 0) {
+               printf("I: No initial ramdisk found (INITRD.BIN)\n");
+               initrdstart_adr = 0;
+               initrdend_adr = 0;
+       } else
+               initrdend_adr = initrdstart_adr + size - 1;
+
+       fatfs_done();
+       printf("I: Booting...\n");
+       boot(cmdline_adr, initrdstart_adr, initrdend_adr, SDRAM_BASE);
 }
index a0b9e38..d352d64 100644 (file)
@@ -20,7 +20,6 @@
 
 void serialboot();
 void netboot();
-void cardboot(int alt);
-
+void fsboot();
 
 #endif /* __BOOT_H */
index 10d5202..589cc9e 100644 (file)
@@ -19,6 +19,7 @@
 #include <console.h>
 #include <string.h>
 #include <uart.h>
+#include <blockdev.h>
 #include <fatfs.h>
 #include <crc.h>
 #include <system.h>
@@ -210,7 +211,7 @@ static int lscb(const char *filename, const char *longname, void *param)
 
 static void ls()
 {
-       fatfs_init();
+       fatfs_init(BLOCKDEV_FLASH, 0);
        fatfs_list_files(lscb, NULL);
        fatfs_done();
 }
@@ -229,7 +230,7 @@ static void load(char *filename, char *addr)
                printf("incorrect address\n");
                return;
        }
-       fatfs_init();
+       fatfs_init(BLOCKDEV_FLASH, 0);
        fatfs_load(filename, (char *)addr2, 16*1024*1024, NULL);
        fatfs_done();
 }
@@ -289,11 +290,11 @@ static void help()
        puts("mw         - write address space");
        puts("mc         - copy address space");
        puts("crc        - compute CRC32 of a part of the address space");
-       puts("ls         - list files on the memory card");
-       puts("load       - load a file from the memory card");
-       puts("serialboot - attempt SFL boot");
+       puts("ls         - list files on the filesystem");
+       puts("load       - load a file from the filesystem");
+       puts("serialboot - boot via SFL");
        puts("netboot    - boot via TFTP");
-       puts("cardboot   - attempt booting from memory card");
+       puts("fsboot     - boot from the filesystem");
        puts("mdior      - read MDIO register");
        puts("mdiow      - write MDIO register");
        puts("reboot     - system reset");
@@ -333,7 +334,7 @@ static void do_command(char *c)
        
        else if(strcmp(token, "serialboot") == 0) serialboot();
        else if(strcmp(token, "netboot") == 0) netboot();
-       else if(strcmp(token, "cardboot") == 0) cardboot(0);
+       else if(strcmp(token, "fsboot") == 0) fsboot();
 
        else if(strcmp(token, "mdior") == 0) mdior(get_token(&c));
        else if(strcmp(token, "mdiow") == 0) mdiow(get_token(&c), get_token(&c));
@@ -352,7 +353,7 @@ static int test_user_abort()
        char c;
        
        puts("I: Press Q to abort boot");
-       for(i=0;i<4000000;i++) {
+       for(i=0;i<3500000;i++) {
                if(readchar_nonblock()) {
                        c = readchar();
                        if(c == 'Q') {
@@ -429,12 +430,9 @@ static void boot_sequence()
 {
        splash_display();
        if(test_user_abort()) {
-               serialboot(1);
+               serialboot();
+               fsboot();
                netboot();
-               if(CSR_GPIO_IN & GPIO_BTN1)
-                       cardboot(1);
-               else
-                       cardboot(0);
                printf("E: No boot medium found\n");
        }
 }