+/****************************************************************************/
+/* CRC32 stuff taken and adapted from lib_crc version 1.16 : */
+/* Library : lib_crc */
+/* File : lib_crc.c */
+/* Author : Lammert Bies 1999-2008 */
+/* E-mail : info@lammertbies.nl */
+/****************************************************************************/
+
+/* the ATxmega series NVM CRC compatible polynom */
+/* on ATxmega you can do this much faster in hardware */
+#define P_32 0xEDB88320L
+#define D_32 0xFFFFFFFFL
+
+uint32_t crc_tab32_value(uint8_t address) {
+ uint32_t result;
+ uint8_t j;
+
+ result = (uint32_t)address & 0xffL;
+ for (j=0; j<8; j++) {
+ if (result & 0x00000001L) result = (result >> 1) ^ P_32;
+ else result = result >> 1;
+ }
+
+ return result;
+}
+
+uint32_t update_crc_32(uint32_t crc, uint8_t c) {
+ uint32_t tmp, long_c;
+
+ long_c = (uint32_t)c & 0xffL;
+
+ tmp = crc ^ long_c;
+ crc = (crc >> 8) ^ crc_tab32_value(tmp & 0xffL);
+
+ return crc;
+}