]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/cmd_load.c
I2C: adding new "i2c bus" Command to the I2C Subsystem.
[karo-tx-uboot.git] / common / cmd_load.c
index 0ea8c4b4e43bb3c2b570e2018b901a006566cc80..1351fe22cac02d47d330cba238b90dbd4a482645 100644 (file)
@@ -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
 #include <command.h>
 #include <s_record.h>
 #include <net.h>
-#include <syscall.h>
+#include <exports.h>
+#include <xyzModem.h>
 
+DECLARE_GLOBAL_DATA_PTR;
 
-#if (CONFIG_COMMANDS & CFG_CMD_LOADS)
-static ulong load_serial (ulong offset);
+#if defined(CONFIG_CMD_LOADB)
+static ulong load_serial_ymodem (ulong offset);
+#endif
+
+#if defined(CONFIG_CMD_LOADS)
+static ulong load_serial (long 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;
+       long offset = 0;
        ulong addr;
        int i;
        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;
@@ -67,7 +72,7 @@ int do_load_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
 #ifdef CFG_LOADS_BAUD_CHANGE
        if (argc >= 2) {
-               offset = simple_strtoul(argv[1], NULL, 16);
+               offset = simple_strtol(argv[1], NULL, 16);
        }
        if (argc == 3) {
                load_baudrate = (int)simple_strtoul(argv[2], NULL, 10);
@@ -90,7 +95,7 @@ int do_load_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        }
 #else  /* ! CFG_LOADS_BAUD_CHANGE */
        if (argc == 2) {
-               offset = simple_strtoul(argv[1], NULL, 16);
+               offset = simple_strtol(argv[1], NULL, 16);
        }
 #endif /* CFG_LOADS_BAUD_CHANGE */
 
@@ -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);
        }
@@ -136,7 +141,7 @@ int do_load_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 }
 
 static ulong
-load_serial (ulong offset)
+load_serial (long offset)
 {
        char    record[SREC_MAXRECLEN + 1];     /* buffer for one S-Record      */
        char    binbuf[SREC_MAXBINLEN];         /* buffer for binary data       */
@@ -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
@@ -419,9 +423,6 @@ write_record (char *buf)
 #define tochar(x) ((char) (((x) + SPACE) & 0xff))
 #define untochar(x) ((int) (((x) - SPACE) & 0xff))
 
-extern int os_data_count;
-extern int os_data_header[8];
-
 static void set_kerm_bin_mode(unsigned long *);
 static int k_recv(void);
 static ulong load_serial_bin (ulong offset);
@@ -434,8 +435,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 +475,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 +518,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 +548,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 +568,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 +596,7 @@ void s1_sendpacket (char *packet)
 {
        send_pad ();
        while (*packet) {
-               serial_putc (*packet++);
+               putc (*packet++);
        }
 }
 
@@ -612,46 +628,39 @@ void send_nack (int n)
 }
 
 
-/* os_data_* takes an OS Open image and puts it into memory, and
-   puts the boot header in an array named os_data_header
-
-   if image is binary, no header is stored in os_data_header.
-*/
 void (*os_data_init) (void);
 void (*os_data_char) (char new_char);
 static int os_data_state, os_data_state_saved;
-int os_data_count;
-static int os_data_count_saved;
 static char *os_data_addr, *os_data_addr_saved;
 static char *bin_start_address;
-int os_data_header[8];
+
 static void bin_data_init (void)
 {
        os_data_state = 0;
-       os_data_count = 0;
        os_data_addr = bin_start_address;
 }
+
 static void os_data_save (void)
 {
        os_data_state_saved = os_data_state;
-       os_data_count_saved = os_data_count;
        os_data_addr_saved = os_data_addr;
 }
+
 static void os_data_restore (void)
 {
        os_data_state = os_data_state_saved;
-       os_data_count = os_data_count_saved;
        os_data_addr = os_data_addr_saved;
 }
+
 static void bin_data_char (char new_char)
 {
        switch (os_data_state) {
        case 0:                                 /* data */
                *os_data_addr++ = new_char;
-               --os_data_count;
                break;
        }
 }
+
 static void set_kerm_bin_mode (unsigned long *addr)
 {
        bin_start_address = (char *) addr;
@@ -667,16 +676,19 @@ void k_data_init (void)
        k_data_escape = 0;
        os_data_init ();
 }
+
 void k_data_save (void)
 {
        k_data_escape_saved = k_data_escape;
        os_data_save ();
 }
+
 void k_data_restore (void)
 {
        k_data_escape = k_data_escape_saved;
        os_data_restore ();
 }
+
 void k_data_char (char new_char)
 {
        if (k_data_escape) {
@@ -795,7 +807,6 @@ static int k_recv (void)
        int done;
        int length;
        int n, last_n;
-       int z = 0;
        int len_lo, len_hi;
 
        /* initialize some protocol parameters */
@@ -842,7 +853,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 +865,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 +898,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 +908,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 +930,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 +947,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 */
@@ -960,15 +971,76 @@ START:
                        if (k_state == BREAK_TYPE)
                                done = 1;
                }
-               ++z;
        }
        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(
@@ -993,7 +1065,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,
@@ -1010,11 +1082,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",
@@ -1023,11 +1095,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);
@@ -1053,4 +1133,4 @@ U_BOOT_CMD(
        "[on|off]\n - change RTS/CTS hardware flow control over serial line\n"
 );
 
-#endif /* CFG_CMD_HWFLOW */
+#endif