summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/telechips.c32
-rw-r--r--tools/telechips.h2
2 files changed, 29 insertions, 5 deletions
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 <fcntl.h>
#include <stdint.h>
#include <stdlib.h>
+#include <string.h>
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