X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=common%2Fcmd_load.c;h=1b75a7b5eccf15289e03d9f341efd5c193ba444e;hb=58b575e575c25fdf8c88141e145db201f3092149;hp=5272b0f2d02a8bc0f746548e14c3ecd6b2e9621b;hpb=b0fce99bfc116c2ddb4506268d6e4a0a7054478d;p=u-boot diff --git a/common/cmd_load.c b/common/cmd_load.c index 5272b0f2d0..1b75a7b5ec 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 @@ -28,23 +28,29 @@ #include #include #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); @@ -219,9 +224,9 @@ read_record (char *buf, ulong len) --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': @@ -236,13 +241,11 @@ read_record (char *buf, ulong len) } /* Check for the console hangup (if any different from serial) */ -#ifdef CONFIG_PPC /* we don't have syscall_tbl anywhere else */ - if (syscall_tbl[SYSCALL_GETC] != serial_getc) { + if (gd->jt[XF_getc] != getc) { if (ctrlc()) { return (-1); } } -#endif } /* line too long - truncate */ @@ -250,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; @@ -388,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) */ @@ -397,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 @@ -434,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; @@ -476,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, - current_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); @@ -509,8 +521,15 @@ int do_load_serial_bin (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) char *s; if (((s = getenv("autoscript")) != NULL) && (strcmp(s,"yes") == 0)) { - printf("Running autoscript at addr 0x%08lX ...\n", load_addr); - rcode = autoscript (load_addr); + printf ("Running autoscript at addr 0x%08lX", load_addr); + + s = getenv ("autoscript_uname"); + if (s) + printf (":%s ...\n", s); + else + puts (" ...\n"); + + rcode = autoscript (load_addr, s); } } #endif @@ -532,8 +551,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); } @@ -552,7 +571,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 */ @@ -580,7 +599,7 @@ void s1_sendpacket (char *packet) { send_pad (); while (*packet) { - serial_putc (*packet++); + putc (*packet++); } } @@ -842,7 +861,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 */ @@ -854,13 +873,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; @@ -887,7 +906,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; @@ -897,19 +916,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)) @@ -919,7 +938,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; @@ -936,13 +955,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 */ @@ -964,15 +983,77 @@ 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 -cmd_tbl_t U_BOOT_CMD(LOADS) = MK_CMD_ENTRY( - "loads", 3, 0, do_load_serial, +U_BOOT_CMD( + loads, 3, 0, do_load_serial, "loads - load S-Record file over serial line\n", "[ off ] [ baud ]\n" " - load S-Record file over serial line" @@ -980,8 +1061,8 @@ cmd_tbl_t U_BOOT_CMD(LOADS) = MK_CMD_ENTRY( ); #else /* ! CFG_LOADS_BAUD_CHANGE */ -cmd_tbl_t U_BOOT_CMD(LOADS) = MK_CMD_ENTRY( - "loads", 2, 0, do_load_serial, +U_BOOT_CMD( + loads, 2, 0, do_load_serial, "loads - load S-Record file over serial line\n", "[ off ]\n" " - load S-Record file over serial line with offset 'off'\n" @@ -993,41 +1074,49 @@ cmd_tbl_t U_BOOT_CMD(LOADS) = MK_CMD_ENTRY( */ -#if (CONFIG_COMMANDS & CFG_CMD_SAVES) +#if defined(CONFIG_CMD_SAVES) #ifdef CFG_LOADS_BAUD_CHANGE -cmd_tbl_t U_BOOT_CMD(SAVES) = MK_CMD_ENTRY( - "saves", 4, 0, do_save_serial, +U_BOOT_CMD( + saves, 4, 0, do_save_serial, "saves - save S-Record file over serial line\n", "[ off ] [size] [ baud ]\n" " - save S-Record file over serial line" " with offset 'off', size 'size' and baudrate 'baud'\n" ); #else /* ! CFG_LOADS_BAUD_CHANGE */ -cmd_tbl_t U_BOOT_CMD(SAVES) = MK_CMD_ENTRY( - "saves", 3, 0, do_save_serial, +U_BOOT_CMD( + saves, 3, 0, do_save_serial, "saves - save S-Record file over serial line\n", "[ off ] [size]\n" " - 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) -cmd_tbl_t U_BOOT_CMD(LOADB) = MK_CMD_ENTRY( - "loadb", 3, 0, do_load_serial_bin, +#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", "[ off ] [ baud ]\n" " - load binary file over serial line" " 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); @@ -1047,10 +1136,10 @@ int do_hwflow (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) /* -------------------------------------------------------------------- */ -cmd_tbl_t U_BOOT_CMD(HWFLOW) = MK_CMD_ENTRY( - "hwflow [on|off]", 2, 0, do_hwflow, +U_BOOT_CMD( + hwflow, 2, 0, do_hwflow, "hwflow - turn the harwdare flow control on/off\n", - "\n - change RTS/CTS hardware flow control over serial line\n" + "[on|off]\n - change RTS/CTS hardware flow control over serial line\n" ); -#endif /* CFG_CMD_HWFLOW */ +#endif