X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=lib_generic%2Fcrc32.c;h=b27048ceebf2f07075457aedc5f1b0a3cb6db381;hb=9af9c6bdc16da53772c56b1a79c2c91701fe94e6;hp=b882daa10d62c2fc5168b1a9935228a61b10901c;hpb=be32bf20bc5bbf3e8cf07085743bbc8f05630812;p=u-boot diff --git a/lib_generic/crc32.c b/lib_generic/crc32.c index b882daa10d..b27048ceeb 100644 --- a/lib_generic/crc32.c +++ b/lib_generic/crc32.c @@ -14,7 +14,10 @@ #include #endif -#include "zlib.h" +#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) +#include +#endif +#include "u-boot/zlib.h" #define local static #define ZEXPORT /* empty */ @@ -53,7 +56,7 @@ local void make_crc_table() { uint32_t c; int n, k; - uLong poly; /* polynomial exclusive-or pattern */ + uLong poly; /* polynomial exclusive-or pattern */ /* terms of polynomial defining this crc (except x^32): */ static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; @@ -151,10 +154,7 @@ const uint32_t * ZEXPORT get_crc_table() #define DO8(buf) DO4(buf); DO4(buf); /* ========================================================================= */ -uint32_t ZEXPORT crc32(crc, buf, len) - uint32_t crc; - const Bytef *buf; - uInt len; +uint32_t ZEXPORT crc32 (uint32_t crc, const Bytef *buf, uInt len) { #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) @@ -172,9 +172,7 @@ uint32_t ZEXPORT crc32(crc, buf, len) return crc ^ 0xffffffffL; } -#if defined(CONFIG_CMD_JFFS2) || \ - (defined(CONFIG_CMD_NAND) \ - && !defined(CFG_NAND_LEGACY)) +#if defined(CONFIG_CMD_JFFS2) || defined(CONFIG_CMD_NAND) /* No ones complement version. JFFS2 (and other things ?) * don't use ones compliment in their CRC calculations. @@ -198,3 +196,32 @@ uint32_t ZEXPORT crc32_no_comp(uint32_t crc, const Bytef *buf, uInt len) } #endif + +/* + * Calculate the crc32 checksum triggering the watchdog every 'chunk_sz' bytes + * of input. + */ +uint32_t ZEXPORT crc32_wd (uint32_t crc, + const unsigned char *buf, + uInt len, uInt chunk_sz) +{ +#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) + const unsigned char *end, *curr; + int chunk; + + curr = buf; + end = buf + len; + while (curr < end) { + chunk = end - curr; + if (chunk > chunk_sz) + chunk = chunk_sz; + crc = crc32 (crc, curr, chunk); + curr += chunk; + WATCHDOG_RESET (); + } +#else + crc = crc32 (crc, buf, len); +#endif + + return crc; +}