From bcadf96066c20953ae6be7447f1ee2cd8742ab4f Mon Sep 17 00:00:00 2001 From: Tomer Shalev Date: Sun, 1 Nov 2009 18:26:00 +0000 Subject: FS#10740 - rbutil: Test Cowon D2 OF file for CRC consistency before patching git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23470 a1c6a512-1295-4272-9138-f99709370657 --- tools/telechips.c | 32 ++++++++++++++++++++++++++++---- tools/telechips.h | 2 +- 2 files changed, 29 insertions(+), 5 deletions(-) (limited to 'tools') diff --git a/tools/telechips.c b/tools/telechips.c index 8eefffcb98..acb15b8b14 100644 --- a/tools/telechips.c +++ b/tools/telechips.c @@ -31,6 +31,7 @@ #include #include #include +#include static uint32_t crctable[256]; @@ -57,11 +58,11 @@ static void gentable(uint32_t poly) { int i; uint32_t r; - uint32_t index; + uint32_t idx; - for (index = 0; index < 256; index++) + for (idx = 0; idx < 256; idx++) { - r = bitreverse(index,8) << 24; + r = bitreverse(idx,8) << 24; for (i=0; i<8; i++) { if (r & (1 << 31)) @@ -69,7 +70,7 @@ static void gentable(uint32_t poly) else r<<=1; } - crctable[index] = bitreverse(r,32); + crctable[idx] = bitreverse(r,32); } } @@ -156,3 +157,26 @@ void telechips_encode_crc(unsigned char* buf, int length) put_uint32le(buf+0x10, crc1); } } + +int telechips_test_crc(unsigned char* buf, int length) +{ + uint32_t crc1, crc2, test_crc1, test_crc2; + unsigned char *test_buf; + + crc1 = get_uint32le(buf + 0x10); + crc2 = get_uint32le(buf + 0x18); + + test_buf = malloc(length); + if (!test_buf) + return 1; + + memcpy(test_buf, buf, length); + telechips_encode_crc(test_buf, length); + + test_crc1 = get_uint32le(test_buf + 0x10); + test_crc2 = get_uint32le(test_buf + 0x18); + + free(test_buf); + + return (crc1 == test_crc1 && crc2 == test_crc2) ? 0 : 2; +} diff --git a/tools/telechips.h b/tools/telechips.h index 27e133b7a6..6550af70d0 100644 --- a/tools/telechips.h +++ b/tools/telechips.h @@ -24,5 +24,5 @@ void telechips_encode_sum(unsigned char* buf, int length); void telechips_encode_crc(unsigned char* buf, int length); - +int telechips_test_crc(unsigned char* buf, int length); #endif -- cgit