Port of teensy 3 FastCRC library, uses hardware CRC
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, committed 2016-04-22
- Comitter:
- manitou
- Date:
- Fri Apr 22 17:07:33 2016 +0000
- Parent:
- 0:7343f324d853
- Commit message:
- table-drive bug fix
Changed in this revision
FastCRCsw.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 7343f324d853 -r 1ce0f4ee7357 FastCRCsw.cpp --- 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);