X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=common%2Fcmd_load.c;h=204c3ebf1930ddbb3dcce843402e1a3be9a558f4;hb=ad845beef06245426c57b53dcdc01b7dc70e0d45;hp=5622452ccbff395735f8bf9e1fb1204cdaa2e532;hpb=27b207fd0a0941b03f27e2a82c0468b1a090c745;p=oweals%2Fu-boot.git diff --git a/common/cmd_load.c b/common/cmd_load.c index 5622452ccb..204c3ebf19 100644 --- a/common/cmd_load.c +++ b/common/cmd_load.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2000-2003 + * (C) Copyright 2000-2004 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * See file CREDITS for list of people who contributed to this @@ -29,22 +29,28 @@ #include #include #include +#include +DECLARE_GLOBAL_DATA_PTR; -#if (CONFIG_COMMANDS & CFG_CMD_LOADS) +#if defined(CONFIG_CMD_LOADB) +static ulong load_serial_ymodem (ulong offset); +#endif + +#if defined(CONFIG_CMD_LOADS) static ulong load_serial (ulong offset); static int read_record (char *buf, ulong len); -# if (CONFIG_COMMANDS & CFG_CMD_SAVES) +# if defined(CONFIG_CMD_SAVES) static int save_serial (ulong offset, ulong size); static int write_record (char *buf); -# endif /* CFG_CMD_SAVES */ +#endif static int do_echo = 1; -#endif /* CFG_CMD_LOADS */ +#endif /* -------------------------------------------------------------------- */ -#if (CONFIG_COMMANDS & CFG_CMD_LOADS) +#if defined(CONFIG_CMD_LOADS) int do_load_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { ulong offset = 0; @@ -53,7 +59,6 @@ int do_load_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) char *env_echo; int rcode = 0; #ifdef CFG_LOADS_BAUD_CHANGE - DECLARE_GLOBAL_DATA_PTR; int load_baudrate, current_baudrate; load_baudrate = current_baudrate = gd->baudrate; @@ -104,8 +109,8 @@ int do_load_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) * box some time (100 * 1 ms) */ for (i=0; i<100; ++i) { - if (serial_tstc()) { - (void) serial_getc(); + if (tstc()) { + (void) getc(); } udelay(1000); } @@ -166,7 +171,7 @@ load_serial (ulong offset) if (addr2info(store_addr)) { int rc; - rc = flash_write((uchar *)binbuf,store_addr,binlen); + rc = flash_write((char *)binbuf,store_addr,binlen); if (rc != 0) { flash_perror (rc); return (~0); @@ -192,7 +197,7 @@ load_serial (ulong offset) "## Total Size = 0x%08lX = %ld Bytes\n", start_addr, end_addr, size, size ); - flush_cache (addr, size); + flush_cache (start_addr, size); sprintf(buf, "%lX", size); setenv("filesize", buf); return (addr); @@ -213,16 +218,15 @@ load_serial (ulong offset) static int read_record (char *buf, ulong len) { - DECLARE_GLOBAL_DATA_PTR; char *p; char c; --len; /* always leave room for terminating '\0' byte */ for (p=buf; p < buf+len; ++p) { - c = serial_getc(); /* read character */ + c = getc(); /* read character */ if (do_echo) - serial_putc (c); /* ... and echo it */ + putc (c); /* ... and echo it */ switch (c) { case '\r': @@ -237,7 +241,7 @@ read_record (char *buf, ulong len) } /* Check for the console hangup (if any different from serial) */ - if (gd->jt[XF_getc] != serial_getc) { + if (gd->jt[XF_getc] != getc) { if (ctrlc()) { return (-1); } @@ -249,14 +253,13 @@ read_record (char *buf, ulong len) return (p - buf); } -#if (CONFIG_COMMANDS & CFG_CMD_SAVES) +#if defined(CONFIG_CMD_SAVES) int do_save_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { ulong offset = 0; ulong size = 0; #ifdef CFG_LOADS_BAUD_CHANGE - DECLARE_GLOBAL_DATA_PTR; int save_baudrate, current_baudrate; save_baudrate = current_baudrate = gd->baudrate; @@ -387,7 +390,7 @@ write_record (char *buf) char c; while((c = *buf++)) - serial_putc(c); + putc(c); /* Check for the console hangup (if any different from serial) */ @@ -396,13 +399,15 @@ write_record (char *buf) } return (0); } -# endif /* CFG_CMD_SAVES */ - -#endif /* CFG_CMD_LOADS */ +# endif +#endif -#if (CONFIG_COMMANDS & CFG_CMD_LOADB) /* loadb command (load binary) included */ +#if defined(CONFIG_CMD_LOADB) +/* + * loadb command (load binary) included + */ #define XON_CHAR 17 #define XOFF_CHAR 19 #define START_CHAR 0x01 @@ -433,8 +438,6 @@ char his_quote; /* quote chars he'll use */ int do_load_serial_bin (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { - DECLARE_GLOBAL_DATA_PTR; - ulong offset = 0; ulong addr; int load_baudrate, current_baudrate; @@ -475,21 +478,31 @@ int do_load_serial_bin (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) } } - printf ("## Ready for binary (kermit) download " - "to 0x%08lX at %d bps...\n", - offset, - load_baudrate); - addr = load_serial_bin (offset); + if (strcmp(argv[0],"loady")==0) { + printf ("## Ready for binary (ymodem) download " + "to 0x%08lX at %d bps...\n", + offset, + load_baudrate); + + addr = load_serial_ymodem (offset); - if (addr == ~0) { - load_addr = 0; - printf ("## Binary (kermit) download aborted\n"); - rcode = 1; } else { - printf ("## Start Addr = 0x%08lX\n", addr); - load_addr = addr; - } + printf ("## Ready for binary (kermit) download " + "to 0x%08lX at %d bps...\n", + offset, + load_baudrate); + addr = load_serial_bin (offset); + + if (addr == ~0) { + load_addr = 0; + printf ("## Binary (kermit) download aborted\n"); + rcode = 1; + } else { + printf ("## Start Addr = 0x%08lX\n", addr); + load_addr = addr; + } + } if (load_baudrate != current_baudrate) { printf ("## Switch baudrate to %d bps and press ESC ...\n", current_baudrate); @@ -531,8 +544,8 @@ static ulong load_serial_bin (ulong offset) * box some time (100 * 1 ms) */ for (i=0; i<100; ++i) { - if (serial_tstc()) { - (void) serial_getc(); + if (tstc()) { + (void) getc(); } udelay(1000); } @@ -551,7 +564,7 @@ void send_pad (void) int count = his_pad_count; while (count-- > 0) - serial_putc (his_pad_char); + putc (his_pad_char); } /* converts escaped kermit char to binary char */ @@ -579,7 +592,7 @@ void s1_sendpacket (char *packet) { send_pad (); while (*packet) { - serial_putc (*packet++); + putc (*packet++); } } @@ -841,7 +854,7 @@ static int k_recv (void) /* get a packet */ /* wait for the starting character or ^C */ for (;;) { - switch (serial_getc ()) { + switch (getc ()) { case START_CHAR: /* start packet */ goto START; case ETX_CHAR: /* ^C waiting for packet */ @@ -853,13 +866,13 @@ static int k_recv (void) START: /* get length of packet */ sum = 0; - new_char = serial_getc (); + new_char = getc (); if ((new_char & 0xE0) == 0) goto packet_error; sum += new_char & 0xff; length = untochar (new_char); /* get sequence number */ - new_char = serial_getc (); + new_char = getc (); if ((new_char & 0xE0) == 0) goto packet_error; sum += new_char & 0xff; @@ -886,7 +899,7 @@ START: /* END NEW CODE */ /* get packet type */ - new_char = serial_getc (); + new_char = getc (); if ((new_char & 0xE0) == 0) goto packet_error; sum += new_char & 0xff; @@ -896,19 +909,19 @@ START: if (length == -2) { /* (length byte was 0, decremented twice) */ /* get the two length bytes */ - new_char = serial_getc (); + new_char = getc (); if ((new_char & 0xE0) == 0) goto packet_error; sum += new_char & 0xff; len_hi = untochar (new_char); - new_char = serial_getc (); + new_char = getc (); if ((new_char & 0xE0) == 0) goto packet_error; sum += new_char & 0xff; len_lo = untochar (new_char); length = len_hi * 95 + len_lo; /* check header checksum */ - new_char = serial_getc (); + new_char = getc (); if ((new_char & 0xE0) == 0) goto packet_error; if (new_char != tochar ((sum + ((sum >> 6) & 0x03)) & 0x3f)) @@ -918,7 +931,7 @@ START: } /* bring in rest of packet */ while (length > 1) { - new_char = serial_getc (); + new_char = getc (); if ((new_char & 0xE0) == 0) goto packet_error; sum += new_char & 0xff; @@ -935,13 +948,13 @@ START: } } /* get and validate checksum character */ - new_char = serial_getc (); + new_char = getc (); if ((new_char & 0xE0) == 0) goto packet_error; if (new_char != tochar ((sum + ((sum >> 6) & 0x03)) & 0x3f)) goto packet_error; /* get END_CHAR */ - new_char = serial_getc (); + new_char = getc (); if (new_char != END_CHAR) { packet_error: /* restore state machines */ @@ -963,11 +976,73 @@ START: } return ((ulong) os_data_addr - (ulong) bin_start_address); } -#endif /* CFG_CMD_LOADB */ + +static int getcxmodem(void) { + if (tstc()) + return (getc()); + return -1; +} +static ulong load_serial_ymodem (ulong offset) +{ + int size; + char buf[32]; + int err; + int res; + connection_info_t info; + char ymodemBuf[1024]; + ulong store_addr = ~0; + ulong addr = 0; + + size = 0; + info.mode = xyzModem_ymodem; + res = xyzModem_stream_open (&info, &err); + if (!res) { + + while ((res = + xyzModem_stream_read (ymodemBuf, 1024, &err)) > 0) { + store_addr = addr + offset; + size += res; + addr += res; +#ifndef CFG_NO_FLASH + if (addr2info (store_addr)) { + int rc; + + rc = flash_write ((char *) ymodemBuf, + store_addr, res); + if (rc != 0) { + flash_perror (rc); + return (~0); + } + } else +#endif + { + memcpy ((char *) (store_addr), ymodemBuf, + res); + } + + } + } else { + printf ("%s\n", xyzModem_error (err)); + } + + xyzModem_stream_close (&err); + xyzModem_stream_terminate (false, &getcxmodem); + + + flush_cache (offset, size); + + printf ("## Total Size = 0x%08x = %d Bytes\n", size, size); + sprintf (buf, "%X", size); + setenv ("filesize", buf); + + return offset; +} + +#endif /* -------------------------------------------------------------------- */ -#if (CONFIG_COMMANDS & CFG_CMD_LOADS) +#if defined(CONFIG_CMD_LOADS) #ifdef CFG_LOADS_BAUD_CHANGE U_BOOT_CMD( @@ -992,7 +1067,7 @@ U_BOOT_CMD( */ -#if (CONFIG_COMMANDS & CFG_CMD_SAVES) +#if defined(CONFIG_CMD_SAVES) #ifdef CFG_LOADS_BAUD_CHANGE U_BOOT_CMD( saves, 4, 0, do_save_serial, @@ -1009,11 +1084,11 @@ U_BOOT_CMD( " - save S-Record file over serial line with offset 'off' and size 'size'\n" ); #endif /* CFG_LOADS_BAUD_CHANGE */ -#endif /* CFG_CMD_SAVES */ -#endif /* CFG_CMD_LOADS */ +#endif +#endif -#if (CONFIG_COMMANDS & CFG_CMD_LOADB) +#if defined(CONFIG_CMD_LOADB) U_BOOT_CMD( loadb, 3, 0, do_load_serial_bin, "loadb - load binary file over serial line (kermit mode)\n", @@ -1022,11 +1097,19 @@ U_BOOT_CMD( " with offset 'off' and baudrate 'baud'\n" ); -#endif /* CFG_CMD_LOADB */ +U_BOOT_CMD( + loady, 3, 0, do_load_serial_bin, + "loady - load binary file over serial line (ymodem mode)\n", + "[ off ] [ baud ]\n" + " - load binary file over serial line" + " with offset 'off' and baudrate 'baud'\n" +); + +#endif /* -------------------------------------------------------------------- */ -#if (CONFIG_COMMANDS & CFG_CMD_HWFLOW) +#if defined(CONFIG_CMD_HWFLOW) int do_hwflow (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { extern int hwflow_onoff(int); @@ -1052,4 +1135,4 @@ U_BOOT_CMD( "[on|off]\n - change RTS/CTS hardware flow control over serial line\n" ); -#endif /* CFG_CMD_HWFLOW */ +#endif