Port of teensy 3 FastCRC library, uses hardware CRC

Dependents:   fastCRCperf

Port of teensy 3 FastCRC library, uses hardware CRC on K64F. About 30 times faster than Arduino CRC (crc16.h).

https://github.com/FrankBoesing/FastCRC

teensy forum discussions on FastCRC https://forum.pjrc.com/threads/25699-Fast-CRC-library-(uses-the-built-in-crc-module-in-Teensy3)

Revision:
1:1ce0f4ee7357
Parent:
0:7343f324d853
--- a/FastCRCsw.cpp	Fri Apr 22 09:51:51 2016 +0000
+++ b/FastCRCsw.cpp	Fri Apr 22 17:07:33 2016 +0000
@@ -361,8 +361,8 @@
 #define crc_n4d(crc, data, table) crc ^= data; \
     crc = table[(crc & 0xff) + 0x300] ^    \
     table[((crc >> 8) & 0xff) + 0x200] ^   \
-    table[((data >> 16) & 0xff) + 0x100] ^ \
-    table[data >> 24];
+    table[((crc >> 16) & 0xff) + 0x100] ^ \
+    table[(crc >> 24) & 0xff];
     
 #define crcsm_n4d(crc, data, table) crc ^= data; \
     crc = (crc >> 8) ^ table[crc & 0xff]; \
@@ -377,7 +377,11 @@
  * @return CRC value
  */
 
+#if CRC_BIGTABLES
+#define CRC_TABLE_CRC32 crc_table_crc32_big
+#else
 #define CRC_TABLE_CRC32 crc_table_crc32
+#endif
 
 uint32_t FastCRC32::crc32_upd(const uint8_t *data, uint16_t len)
 {
@@ -385,28 +389,28 @@
     uint32_t crc = seed;
 
     while (((uintptr_t)data & 3) && len) {
-        crc = (crc >> 8) ^ crc_table_crc32[(crc & 0xff) ^ *data++];
+        crc = (crc >> 8) ^ CRC_TABLE_CRC32[(crc & 0xff) ^ *data++];
         len--;
     }
 
     while (len >= 16) {
         len -= 16;
         #if CRC_BIGTABLES
-        crc_n4d(crc, ((uint32_t *)data)[0], crc_table_crc32_big);
-        crc_n4d(crc, ((uint32_t *)data)[1], crc_table_crc32_big);
-        crc_n4d(crc, ((uint32_t *)data)[2], crc_table_crc32_big);
-        crc_n4d(crc, ((uint32_t *)data)[3], crc_table_crc32_big);
+        crc_n4d(crc, ((uint32_t *)data)[0], CRC_TABLE_CRC32);
+        crc_n4d(crc, ((uint32_t *)data)[1], CRC_TABLE_CRC32);
+        crc_n4d(crc, ((uint32_t *)data)[2], CRC_TABLE_CRC32);
+        crc_n4d(crc, ((uint32_t *)data)[3], CRC_TABLE_CRC32);
         #else
-        crcsm_n4d(crc, ((uint32_t *)data)[0], crc_table_crc32);
-        crcsm_n4d(crc, ((uint32_t *)data)[1], crc_table_crc32);
-        crcsm_n4d(crc, ((uint32_t *)data)[2], crc_table_crc32);
-        crcsm_n4d(crc, ((uint32_t *)data)[3], crc_table_crc32);
+        crcsm_n4d(crc, ((uint32_t *)data)[0], CRC_TABLE_CRC32);
+        crcsm_n4d(crc, ((uint32_t *)data)[1], CRC_TABLE_CRC32);
+        crcsm_n4d(crc, ((uint32_t *)data)[2], CRC_TABLE_CRC32);
+        crcsm_n4d(crc, ((uint32_t *)data)[3], CRC_TABLE_CRC32);
         #endif
         data += 16;
     }
 
     while (len--) {
-        crc = (crc >> 8) ^ crc_table_crc32[(crc & 0xff) ^ *data++];
+        crc = (crc >> 8) ^ CRC_TABLE_CRC32[(crc & 0xff) ^ *data++];
     }
 
     crc = ~crc;
@@ -428,34 +432,39 @@
  * @param datalen Length of Data
  * @return CRC value
  */
+#if CRC_BIGTABLES
+#define CRC_TABLE_CKSUM crc_table_cksum_big
+#else
+#define CRC_TABLE_CKSUM crc_table_cksum
+#endif
 uint32_t FastCRC32::cksum_upd(const uint8_t *data, uint16_t len)
 {
 
     uint32_t crc = seed;
 
     while (((uintptr_t)data & 3) && len) {
-        crc = (crc >> 8) ^ crc_table_cksum[(crc & 0xff) ^ *data++];
+        crc = (crc >> 8) ^ CRC_TABLE_CKSUM[(crc & 0xff) ^ *data++];
         len--;
     }
 
     while (len >= 16) {
         len -= 16;
         #if CRC_BIGTABLES
-        crc_n4d(crc, ((uint32_t *)data)[0], crc_table_cksum_big);
-        crc_n4d(crc, ((uint32_t *)data)[1], crc_table_cksum_big);
-        crc_n4d(crc, ((uint32_t *)data)[2], crc_table_cksum_big);
-        crc_n4d(crc, ((uint32_t *)data)[3], crc_table_cksum_big);
+        crc_n4d(crc, ((uint32_t *)data)[0], CRC_TABLE_CKSUM);
+        crc_n4d(crc, ((uint32_t *)data)[1], CRC_TABLE_CKSUM);
+        crc_n4d(crc, ((uint32_t *)data)[2], CRC_TABLE_CKSUM);
+        crc_n4d(crc, ((uint32_t *)data)[3], CRC_TABLE_CKSUM);
         #else
-        crcsm_n4d(crc, ((uint32_t *)data)[0], crc_table_cksum);
-        crcsm_n4d(crc, ((uint32_t *)data)[1], crc_table_cksum);
-        crcsm_n4d(crc, ((uint32_t *)data)[2], crc_table_cksum);
-        crcsm_n4d(crc, ((uint32_t *)data)[3], crc_table_cksum);
+        crcsm_n4d(crc, ((uint32_t *)data)[0], CRC_TABLE_CKSUM);
+        crcsm_n4d(crc, ((uint32_t *)data)[1], CRC_TABLE_CKSUM);
+        crcsm_n4d(crc, ((uint32_t *)data)[2], CRC_TABLE_CKSUM);
+        crcsm_n4d(crc, ((uint32_t *)data)[3], CRC_TABLE_CKSUM);
         #endif
         data += 16;
     }
 
     while (len--) {
-        crc = (crc >> 8) ^ crc_table_cksum[(crc & 0xff) ^ *data++];
+        crc = (crc >> 8) ^ CRC_TABLE_CKSUM[(crc & 0xff) ^ *data++];
     }
 
     crc = ~REV32(crc);