Add the CRC32 algorithm to the list of available hashes, and make
the crc32 command use hash_command(). Add a new crc32_wd_buf() to
make this possible, which puts its result in a buffer rather than
returning it as a 32-bit value.

Signed-off-by: Simon Glass <s...@chromium.org>
---
 common/cmd_mem.c     |   73 ++++---------------------------------------------
 common/hash.c        |    6 ++++
 include/hash.h       |    2 +-
 include/u-boot/crc.h |   11 +++++++
 lib/crc32.c          |    9 ++++++
 5 files changed, 33 insertions(+), 68 deletions(-)

diff --git a/common/cmd_mem.c b/common/cmd_mem.c
index c45a31e..701157d 100644
--- a/common/cmd_mem.c
+++ b/common/cmd_mem.c
@@ -32,6 +32,7 @@
 #ifdef CONFIG_HAS_DATAFLASH
 #include <dataflash.h>
 #endif
+#include <hash.h>
 #include <watchdog.h>
 #include <asm/io.h>
 
@@ -1093,89 +1094,27 @@ mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int 
argc, char * const argv[])
 
 #ifdef CONFIG_CMD_CRC32
 
-#ifndef CONFIG_CRC32_VERIFY
-
 static int do_mem_crc(cmd_tbl_t *cmdtp, int flag, int argc, char * const 
argv[])
 {
-       ulong addr, length;
-       ulong crc;
-       ulong *ptr;
-
-       if (argc < 3)
-               return CMD_RET_USAGE;
-
-       addr = simple_strtoul (argv[1], NULL, 16);
-       addr += base_address;
-
-       length = simple_strtoul (argv[2], NULL, 16);
-
-       crc = crc32_wd (0, (const uchar *) addr, length, CHUNKSZ_CRC32);
-
-       printf ("CRC32 for %08lx ... %08lx ==> %08lx\n",
-                       addr, addr + length - 1, crc);
-
-       if (argc > 3) {
-               ptr = (ulong *) simple_strtoul (argv[3], NULL, 16);
-               *ptr = crc;
-       }
-
-       return 0;
-}
-
-#else  /* CONFIG_CRC32_VERIFY */
-
-int do_mem_crc (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
-{
-       ulong addr, length;
-       ulong crc;
-       ulong *ptr;
-       ulong vcrc;
-       int verify;
+       int verify = 0;
        int ac;
        char * const *av;
 
-       if (argc < 3) {
-usage:
+       if (argc < 3)
                return CMD_RET_USAGE;
-       }
 
        av = argv + 1;
        ac = argc - 1;
+#ifdef CONFIG_HASH_VERIFY
        if (strcmp(*av, "-v") == 0) {
                verify = 1;
                av++;
                ac--;
-               if (ac < 3)
-                       goto usage;
-       } else
-               verify = 0;
-
-       addr = simple_strtoul(*av++, NULL, 16);
-       addr += base_address;
-       length = simple_strtoul(*av++, NULL, 16);
-
-       crc = crc32_wd (0, (const uchar *) addr, length, CHUNKSZ_CRC32);
-
-       if (!verify) {
-               printf ("CRC32 for %08lx ... %08lx ==> %08lx\n",
-                               addr, addr + length - 1, crc);
-               if (ac > 2) {
-                       ptr = (ulong *) simple_strtoul (*av++, NULL, 16);
-                       *ptr = crc;
-               }
-       } else {
-               vcrc = simple_strtoul(*av++, NULL, 16);
-               if (vcrc != crc) {
-                       printf ("CRC32 for %08lx ... %08lx ==> %08lx != %08lx 
** ERROR **\n",
-                                       addr, addr + length - 1, crc, vcrc);
-                       return 1;
-               }
        }
+#endif
 
-       return 0;
-
+       return hash_command("crc32", verify, cmdtp, flag, ac, av);
 }
-#endif /* CONFIG_CRC32_VERIFY */
 
 #endif
 
diff --git a/common/hash.c b/common/hash.c
index e3a6e43..e92b4b1 100644
--- a/common/hash.c
+++ b/common/hash.c
@@ -50,6 +50,12 @@ static struct hash_algo hash_algo[] = {
                CHUNKSZ_SHA256,
        },
 #endif
+       {
+               "CRC32",
+               4,
+               crc32_wd_buf,
+               CHUNKSZ_CRC32,
+       },
 };
 
 /**
diff --git a/include/hash.h b/include/hash.h
index 34ba558..ba2ba65 100644
--- a/include/hash.h
+++ b/include/hash.h
@@ -22,7 +22,7 @@
 #ifndef _HASH_H
 #define _HASH_H
 
-#ifdef CONFIG_SHA1SUM_VERIFY
+#if defined(CONFIG_SHA1SUM_VERIFY) || defined(CONFIG_CRC32_VERIFY)
 #define CONFIG_HASH_VERIFY
 #endif
 
diff --git a/include/u-boot/crc.h b/include/u-boot/crc.h
index 07badbf..08e509e 100644
--- a/include/u-boot/crc.h
+++ b/include/u-boot/crc.h
@@ -30,4 +30,15 @@ uint32_t crc32 (uint32_t, const unsigned char *, uint);
 uint32_t crc32_wd (uint32_t, const unsigned char *, uint, uint);
 uint32_t crc32_no_comp (uint32_t, const unsigned char *, uint);
 
+/**
+ * crc32_wd_buf - Perform CRC32 on a buffer and return result in buffer
+ *
+ * @input:     Input buffer
+ * @ilen:      Input buffer length
+ * @output:    Place to put checksum result (4 bytes)
+ * @chunk_sz:  Trigger watchdog after processing this many bytes
+ */
+void crc32_wd_buf(const unsigned char *input, uint ilen,
+                   unsigned char *output, uint chunk_sz);
+
 #endif /* _UBOOT_CRC_H */
diff --git a/lib/crc32.c b/lib/crc32.c
index 27335a3..76205da 100644
--- a/lib/crc32.c
+++ b/lib/crc32.c
@@ -249,3 +249,12 @@ uint32_t ZEXPORT crc32_wd (uint32_t crc,
 
        return crc;
 }
+
+void crc32_wd_buf(const unsigned char *input, unsigned int ilen,
+               unsigned char *output, unsigned int chunk_sz)
+{
+       uint32_t crc;
+
+       crc = crc32_wd(0, input, ilen, chunk_sz);
+       memcpy(output, &crc, sizeof(crc));
+}
-- 
1.7.7.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to