summaryrefslogtreecommitdiffstats
path: root/stm32/app/gen/c.c
diff options
context:
space:
mode:
Diffstat (limited to 'stm32/app/gen/c.c')
-rw-r--r--stm32/app/gen/c.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/stm32/app/gen/c.c b/stm32/app/gen/c.c
new file mode 100644
index 0000000..56e7237
--- /dev/null
+++ b/stm32/app/gen/c.c
@@ -0,0 +1,109 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+uint8_t crc_table[256];
+
+uint8_t flip_byte (uint8_t value)
+{
+ value = ((value >> 1) & 0x55) | ((value & 0x55) << 1);
+ value = ((value >> 2) & 0x33) | ((value & 0x33) << 2);
+ value = ((value >> 4) & 0x0F) | ((value & 0x0F) << 4);
+ return value;
+}
+
+
+uint8_t
+crc8 (uint8_t * data, size_t len)
+{
+ unsigned i, j;
+ uint8_t crc = 0, b;
+
+ for (i = 0; i < len; ++i, ++data)
+ {
+
+ b = *data;
+ for (j = 0; j < 8; j++)
+ {
+ if ((crc >> 7) ^ (b & 1))
+ {
+ crc = (crc << 1) ^ 7;
+ }
+ else
+ {
+ crc = crc << 1;
+ }
+
+ b >>= 1;
+ }
+ }
+ return crc;
+}
+
+void
+make_table (void)
+{
+ unsigned i;
+ unsigned j;
+ uint8_t b;
+
+ for (i = 0; i < 256; ++i)
+ {
+ b = i;
+ for (j = 0; j < 8; j++)
+ {
+
+ if (b & 1)
+ {
+ b = (b >> 1 ) ^ 0xe0;
+ }
+ else
+ {
+ b = b >> 1;
+ }
+
+ }
+ crc_table[i] = b;
+ }
+}
+
+uint8_t
+crc8_better (uint8_t * data, size_t len)
+{
+ uint8_t crc = 0;
+ unsigned i;
+
+ for (i = 0; i < len; i++, data++)
+ {
+ crc = crc_table[crc ^ *data];
+ }
+
+ return flip_byte(crc);
+}
+
+
+
+int
+main (int argc, char *argv[])
+{
+ uint8_t fish[4] = "\5\0\1\301";
+ size_t l;
+
+ make_table ();
+
+ for (l=0;l<256;++l) {
+ printf("0x%02x, ",crc_table[l]);
+ }
+
+ printf("\n");
+
+ for (l=0;l<4;++l ) {
+ printf ("%u %02x %02x %02x\n",(unsigned)l, crc8 (fish, l), crc8_better (fish, l), fish[l]);
+ }
+
+
+
+ return 0;
+}
+
+