Mercurial > ecos
diff packages/redboot/current/src/load.c @ 124:0ec04793409a ecos-sw-2000-09-11
Merge from eCos master repository on 2000-09-11-03:00:13-BST
| author | jlarmour |
|---|---|
| date | Mon, 11 Sep 2000 02:42:46 +0000 |
| parents | bd1a71e3e476 |
| children | 518f42066aba |
line wrap: on
line diff
--- a/packages/redboot/current/src/load.c +++ b/packages/redboot/current/src/load.c @@ -45,6 +45,10 @@ #include <redboot.h> +// Buffer used by redboot_getc +getc_info_t getc_info; + + // Exported CLI function RedBoot_cmd("load", "Load a file", @@ -186,19 +190,14 @@ load_srec_image(int (*getc)(void), unsig } } -#define BUF_SIZE 256 -static struct { - int (*fun)(char *, int len, int *err); - unsigned char buf[BUF_SIZE]; - unsigned char *bufp; - int avail, len, err; - int verbose, tick; -} getc_info; -static int -getc(void) +int +redboot_getc(void) { static char spin[] = "|/-\\|-"; + if (getc_info.avail < 0) { + return -1; + } if (getc_info.avail == 0) { if (getc_info.verbose) { printf("%c\b", spin[getc_info.tick++]); @@ -222,8 +221,8 @@ getc(void) return *getc_info.bufp++; } -static void -getc_init(int (*fun)(char *, int, int *), int verbose) +void +redboot_getc_init(int (*fun)(char *, int, int *), int verbose) { getc_info.avail = 0; getc_info.len = BUF_SIZE; @@ -232,8 +231,8 @@ getc_init(int (*fun)(char *, int, int *) getc_info.tick = 0; } -static void -getc_rewind(void) +void +redboot_getc_rewind(void) { getc_info.bufp = getc_info.buf; getc_info.avail = getc_info.len; @@ -328,9 +327,9 @@ do_load(int argc, char *argv[]) printf("Can't load '%s': %s\n", filename, tftp_error(err)); return; } - getc_init(tftp_stream_read, verbose); + redboot_getc_init(tftp_stream_read, verbose); for (i = 0; i < sizeof(type); i++) { - if ((res = getc()) < 0) { + if ((res = redboot_getc()) < 0) { err = getc_info.err; break; } @@ -347,13 +346,13 @@ do_load(int argc, char *argv[]) printf("Sorry, zmodem download not yet available\n"); return; } - getc_rewind(); // Restore header to stream + 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 = getc()) >= 0) { + while ((res = redboot_getc()) >= 0) { *mp++ = res; } printf("Raw file loaded %p-%p\n", (void *)base, (void *)mp); @@ -361,10 +360,10 @@ do_load(int argc, char *argv[]) } else { // Treat data as some sort of executable image if (strncmp(&type[1], "ELF", 3) == 0) { - load_elf_image(getc); + load_elf_image(redboot_getc); } else if ((type[0] == 'S') && ((type[1] >= '0') && (type[1] <= '9'))) { - load_srec_image(getc, base); + load_srec_image(redboot_getc, base); } else { printf("Unrecognized image type: %lx\n", *(unsigned long *)type); }
