X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=lib_generic%2Fcrc32.c;h=83d1d1d3a0d180d85a2e6d7af7c73ec15a2f5651;hb=794a5924972fc8073616e98a2668da4a5f9aea90;hp=b882daa10d62c2fc5168b1a9935228a61b10901c;hpb=be32bf20bc5bbf3e8cf07085743bbc8f05630812;p=u-boot diff --git a/lib_generic/crc32.c b/lib_generic/crc32.c index b882daa10d..83d1d1d3a0 100644 --- a/lib_generic/crc32.c +++ b/lib_generic/crc32.c @@ -14,6 +14,9 @@ #include #endif +#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) +#include +#endif #include "zlib.h" #define local static @@ -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) @@ -198,3 +198,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; +}