]> git.sur5r.net Git - u-boot/blobdiff - common/cmd_mem.c
* Cleanup lowboot code for MPC5200
[u-boot] / common / cmd_mem.c
index aca69260ac650fd6255a3d8d3d916839615252fc..6ccad70fe128aa845c963a59219eff03dfb91317 100644 (file)
@@ -29,7 +29,6 @@
 
 #include <common.h>
 #include <command.h>
-#include <cmd_mem.h>
 #if (CONFIG_COMMANDS & CFG_CMD_MMC)
 #include <mmc.h>
 #endif
 #include <dataflash.h>
 #endif
 
-#if (CONFIG_COMMANDS & (CFG_CMD_MEMORY | CFG_CMD_PCI | CFG_CMD_I2C\
-                       | CMD_CMD_PORTIO))
+#if (CONFIG_COMMANDS & (CFG_CMD_MEMORY | \
+                       CFG_CMD_I2C     | \
+                       CFG_CMD_PCI     | \
+                       CMD_CMD_PORTIO  ) )
 int cmd_get_data_size(char* arg, int default_size)
 {
        /* Check for a size specification .b, .w or .l.
@@ -52,6 +53,8 @@ int cmd_get_data_size(char* arg, int default_size)
                        return 2;
                case 'l':
                        return 4;
+               default:
+                       return -1;
                }
        }
        return default_size;
@@ -85,9 +88,10 @@ static       ulong   base_address = 0;
 #define DISP_LINE_LEN  16
 int do_mem_md ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
-       ulong   addr, size, length;
+       ulong   addr, length;
        ulong   i, nbytes, linebytes;
        u_char  *cp;
+       int     size;
        int rc = 0;
 
        /* We use the last specified parameters, unless new ones are
@@ -106,7 +110,8 @@ int do_mem_md ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                /* New command specified.  Check for a size specification.
                 * Defaults to long if no or incorrect specification.
                 */
-               size = cmd_get_data_size(argv[0], 4);
+               if ((size = cmd_get_data_size(argv[0], 4)) < 0)
+                       return 1;
 
                /* Address is specified since argc > 1
                */
@@ -131,13 +136,19 @@ int do_mem_md ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                uint    *uip = (uint   *)linebuf;
                ushort  *usp = (ushort *)linebuf;
                u_char  *ucp = (u_char *)linebuf;
-
+#ifdef CONFIG_HAS_DATAFLASH
+               int rc;
+#endif
                printf("%08lx:", addr);
                linebytes = (nbytes>DISP_LINE_LEN)?DISP_LINE_LEN:nbytes;
 
 #ifdef CONFIG_HAS_DATAFLASH
-               if (read_dataflash(addr, (linebytes/size)*size, linebuf) != -1){
-
+               if ((rc = read_dataflash(addr, (linebytes/size)*size, linebuf)) == DATAFLASH_OK){
+                       /* if outside dataflash */
+                       /*if (rc != 1) {
+                               dataflash_perror (rc);
+                               return (1);
+                       }*/
                        for (i=0; i<linebytes; i+= size) {
                                if (size == 4) {
                                        printf(" %08x", *uip++);
@@ -148,7 +159,7 @@ int do_mem_md ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                                }
                                addr += size;
                        }
-                       
+
                } else {        /* addr does not correspond to DataFlash */
 #endif
                for (i=0; i<linebytes; i+= size) {
@@ -198,7 +209,8 @@ int do_mem_nm ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
 int do_mem_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
-       ulong   addr, size, writeval, count;
+       ulong   addr, writeval, count;
+       int     size;
 
        if ((argc < 3) || (argc > 4)) {
                printf ("Usage:\n%s\n", cmdtp->usage);
@@ -207,7 +219,8 @@ int do_mem_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
        /* Check for size specification.
        */
-       size = cmd_get_data_size(argv[0], 4);
+       if ((size = cmd_get_data_size(argv[0], 4)) < 1)
+               return 1;
 
        /* Address is specified since argc > 1
        */
@@ -239,7 +252,8 @@ int do_mem_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
 int do_mem_cmp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
-       ulong   size, addr1, addr2, count, ngood;
+       ulong   addr1, addr2, count, ngood;
+       int     size;
        int     rcode = 0;
 
        if (argc != 4) {
@@ -249,7 +263,8 @@ int do_mem_cmp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
        /* Check for size specification.
        */
-       size = cmd_get_data_size(argv[0], 4);
+       if ((size = cmd_get_data_size(argv[0], 4)) < 0)
+               return 1;
 
        addr1 = simple_strtoul(argv[1], NULL, 16);
        addr1 += base_address;
@@ -315,7 +330,8 @@ int do_mem_cmp (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
 int do_mem_cp ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
-       ulong   addr, size, dest, count;
+       ulong   addr, dest, count;
+       int     size;
 
        if (argc != 4) {
                printf ("Usage:\n%s\n", cmdtp->usage);
@@ -324,7 +340,8 @@ int do_mem_cp ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
        /* Check for size specification.
        */
-       size = cmd_get_data_size(argv[0], 4);
+       if ((size = cmd_get_data_size(argv[0], 4)) < 0)
+               return 1;
 
        addr = simple_strtoul(argv[1], NULL, 16);
        addr += base_address;
@@ -416,10 +433,15 @@ int do_mem_cp ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                puts ("done\n");
                return 0;
        }
-       
+
        /* Check if we are copying from DataFlash to RAM */
        if (addr_dataflash(addr) && !addr_dataflash(dest) && (addr2info(dest)==NULL) ){
-               read_dataflash(addr, count * size, (char *) dest);
+               int rc;
+               rc = read_dataflash(addr, count * size, (char *) dest);
+               if (rc != 1) {
+                       dataflash_perror (rc);
+                       return (1);
+               }
                return 0;
        }
 
@@ -457,7 +479,8 @@ int do_mem_base (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
 int do_mem_loop (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
-       ulong   addr, size, length, i, junk;
+       ulong   addr, length, i, junk;
+       int     size;
        volatile uint   *longp;
        volatile ushort *shortp;
        volatile u_char *cp;
@@ -470,7 +493,8 @@ int do_mem_loop (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        /* Check for a size spefication.
         * Defaults to long if no or incorrect specification.
         */
-       size = cmd_get_data_size(argv[0], 4);
+       if ((size = cmd_get_data_size(argv[0], 4)) < 0)
+               return 1;
 
        /* Address is always specified.
        */
@@ -542,7 +566,11 @@ int do_mem_mtest (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        vu_long temp;
        vu_long anti_pattern;
        vu_long num_words;
+#if defined(CFG_MEMTEST_SCRATCH)
+       vu_long *dummy = (vu_long*)CFG_MEMTEST_SCRATCH;
+#else
        vu_long *dummy = NULL;
+#endif
        int     j;
        int iterations = 1;
 
@@ -838,8 +866,8 @@ int do_mem_mtest (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 static int
 mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char *argv[])
 {
-       ulong   addr, size, i;
-       int     nbytes;
+       ulong   addr, i;
+       int     nbytes, size;
        extern char console_buffer[];
 
        if (argc != 2) {
@@ -860,7 +888,8 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char *argv[])
                /* New command specified.  Check for a size specification.
                 * Defaults to long if no or incorrect specification.
                 */
-               size = cmd_get_data_size(argv[0], 4);
+               if ((size = cmd_get_data_size(argv[0], 4)) < 0)
+                       return 1;
 
                /* Address is specified since argc > 1
                */
@@ -960,4 +989,72 @@ int do_mem_crc (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        return 0;
 }
 
+/**************************************************/
+#if (CONFIG_COMMANDS & CFG_CMD_MEMORY)
+U_BOOT_CMD(
+       md,     3,     1,      do_mem_md,
+       "md      - memory display\n",
+       "[.b, .w, .l] address [# of objects]\n    - memory display\n"
+);
+
+
+U_BOOT_CMD(
+       mm,     2,      1,       do_mem_mm,
+       "mm      - memory modify (auto-incrementing)\n",
+       "[.b, .w, .l] address\n" "    - memory modify, auto increment address\n"
+);
+
+
+U_BOOT_CMD(
+       nm,     2,          1,          do_mem_nm,
+       "nm      - memory modify (constant address)\n",
+       "[.b, .w, .l] address\n    - memory modify, read and keep address\n"
+);
+
+U_BOOT_CMD(
+       mw,    4,    1,     do_mem_mw,
+       "mw      - memory write (fill)\n",
+       "[.b, .w, .l] address value [count]\n    - write memory\n"
+);
+
+U_BOOT_CMD(
+       cp,    4,    1,    do_mem_cp,
+       "cp      - memory copy\n",
+       "[.b, .w, .l] source target count\n    - copy memory\n"
+);
+
+U_BOOT_CMD(
+       cmp,    4,     1,     do_mem_cmp,
+       "cmp     - memory compare\n",
+       "[.b, .w, .l] addr1 addr2 count\n    - compare memory\n"
+);
+
+U_BOOT_CMD(
+       crc32,    4,    1,     do_mem_crc,
+       "crc32   - checksum calculation\n",
+       "address count [addr]\n    - compute CRC32 checksum [save at addr]\n"
+);
+
+U_BOOT_CMD(
+       base,    2,    1,     do_mem_base,
+       "base    - print or set address offset\n",
+       "\n    - print address offset for memory commands\n"
+       "base off\n    - set address offset for memory commands to 'off'\n"
+);
+
+U_BOOT_CMD(
+       loop,    3,    1,    do_mem_loop,
+       "loop    - infinite loop on address range\n",
+       "[.b, .w, .l] address number_of_objects\n"
+       "    - loop on a set of addresses\n"
+);
+
+U_BOOT_CMD(
+       mtest,    4,    1,     do_mem_mtest,
+       "mtest   - simple RAM test\n",
+       "[start [end [pattern]]]\n"
+       "    - simple RAM read/write test\n"
+);
+
+#endif
 #endif /* CFG_CMD_MEMORY */