Mercurial > flash_v2
diff packages/redboot/current/src/load.c @ 132:0ae0bc38e387 ecos-sw-2000-10-31
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
| author | jlarmour |
|---|---|
| date | Tue, 31 Oct 2000 20:53:09 +0000 |
| parents | 518f42066aba |
| children | 6b5f480c6929 |
line wrap: on
line diff
--- a/packages/redboot/current/src/load.c +++ b/packages/redboot/current/src/load.c @@ -44,15 +44,17 @@ //========================================================================== #include <redboot.h> +#include <xyzModem.h> // Buffer used by redboot_getc getc_info_t getc_info; +static char usage[] = "[-r] [-v] [-h <host>] [-m {TFTP | xyzMODEM}] [-b <base_address>] <file_name>"; // Exported CLI function RedBoot_cmd("load", "Load a file", - "[-v] [-r] [-b <mem_addr>] <file_name>", + usage, do_load ); @@ -240,18 +242,19 @@ redboot_getc_rewind(void) } #define MODE_TFTP 0 -#define MODE_ZMODEM 1 +#define MODE_XMODEM xyzModem_xmodem +#define MODE_YMODEM xyzModem_ymodem +#define MODE_ZMODEM xyzModem_zmodem void do_load(int argc, char *argv[]) { int res, num_options; - int mode; + int i, err, mode; bool verbose, raw; bool base_addr_set, mode_str_set; char *mode_str; #ifdef CYGPKG_REDBOOT_NETWORKING - int i, err; struct sockaddr_in host; bool hostname_set; char *hostname; @@ -259,7 +262,6 @@ do_load(int argc, char *argv[]) unsigned long base = 0; char type[4]; char *filename = 0; - char *usage = "usage: load <file_name> [-r] [-v] [-h <host>] [-m {TFTP | ZMODEM}] [-b <base_address>]\n"; struct option_info opts[5]; #ifdef CYGPKG_REDBOOT_NETWORKING @@ -272,7 +274,7 @@ do_load(int argc, char *argv[]) #ifdef CYGPKG_REDBOOT_NETWORKING mode = MODE_TFTP; #else - mode = MODE_ZMODEM; + mode = MODE_YMODEM; #endif init_opts(&opts[0], 'v', false, OPTION_ARG_TYPE_FLG, @@ -282,7 +284,7 @@ do_load(int argc, char *argv[]) init_opts(&opts[2], 'b', true, OPTION_ARG_TYPE_NUM, (void **)&base, (bool *)&base_addr_set, "load address"); init_opts(&opts[3], 'm', true, OPTION_ARG_TYPE_STR, - (void **)&mode_str, (bool *)&mode_str_set, "download mode (TFTP or ZMODEM)"); + (void **)&mode_str, (bool *)&mode_str_set, "download mode (TFTP or xyzMODEM)"); num_options = 4; #ifdef CYGPKG_REDBOOT_NETWORKING init_opts(&opts[4], 'h', true, OPTION_ARG_TYPE_STR, @@ -302,8 +304,21 @@ do_load(int argc, char *argv[]) } #endif if (mode_str_set) { - if (strcmpci(mode_str, "zmodem") == 0) { - mode = MODE_ZMODEM; + if (strncmpci(&mode_str[1], "modem", strlen(&mode_str[1])) == 0) { + switch (tolower(mode_str[0])) { + case 'x': + mode = MODE_XMODEM; + break; + case 'y': + mode = MODE_YMODEM; + break; + case 'z': + mode = MODE_ZMODEM; + break; + default: + printf("Invalid 'mode': %s\n", mode_str); + return; + } #ifdef CYGPKG_REDBOOT_NETWORKING } else if (strcmpci(mode_str, "tftp") == 0) { mode = MODE_TFTP; @@ -319,7 +334,7 @@ do_load(int argc, char *argv[]) } if ((mode == MODE_TFTP) && !filename) { printf("File name missing\n"); - printf(usage); + printf("usage: load %s\n", usage); return; } #ifdef CYGPKG_REDBOOT_NETWORKING @@ -330,44 +345,46 @@ do_load(int argc, char *argv[]) return; } redboot_getc_init(tftp_stream_read, verbose); - for (i = 0; i < sizeof(type); i++) { - if ((res = redboot_getc()) < 0) { - err = getc_info.err; - break; - } - type[i] = res; - } - if (res < 0) { - printf("Error reading header via TFTP: %s\n", tftp_error(err)); - tftp_stream_close(&err); - return; - } } #endif - if (mode == MODE_ZMODEM) { - printf("Sorry, zmodem download not yet available\n"); - return; + else { + res = xyzModem_stream_open(filename, mode, &err); + if (res < 0) { + printf("Can't load '%s': %s\n", filename, xyzModem_error(err)); + return; + } + redboot_getc_init(xyzModem_stream_read, verbose); } - redboot_getc_rewind(); // Restore header to stream - if (raw) { - if (!base_addr_set) { - printf("Raw load requires a memory address\n"); + // Read initial header - to determine file [image] type + for (i = 0; i < sizeof(type); i++) { + if ((res = redboot_getc()) < 0) { + err = getc_info.err; + break; + } + type[i] = res; + } + if (res >= 0) { + redboot_getc_rewind(); // Restore header to stream + if (raw) { + if (!base_addr_set) { + printf("Raw load requires a memory address\n"); + } else { + unsigned char *mp = (unsigned char *)base; + while ((res = redboot_getc()) >= 0) { + *mp++ = res; + } + printf("Raw file loaded %p-%p\n", (void *)base, (void *)mp); + } } else { - unsigned char *mp = (unsigned char *)base; - while ((res = redboot_getc()) >= 0) { - *mp++ = res; + // Treat data as some sort of executable image + if (strncmp(&type[1], "ELF", 3) == 0) { + load_elf_image(redboot_getc); + } else if ((type[0] == 'S') && + ((type[1] >= '0') && (type[1] <= '9'))) { + load_srec_image(redboot_getc, base); + } else { + printf("Unrecognized image type: %lx\n", *(unsigned long *)type); } - printf("Raw file loaded %p-%p\n", (void *)base, (void *)mp); - } - } else { - // Treat data as some sort of executable image - if (strncmp(&type[1], "ELF", 3) == 0) { - load_elf_image(redboot_getc); - } else if ((type[0] == 'S') && - ((type[1] >= '0') && (type[1] <= '9'))) { - load_srec_image(redboot_getc, base); - } else { - printf("Unrecognized image type: %lx\n", *(unsigned long *)type); } } #ifdef CYGPKG_REDBOOT_NETWORKING
