//! @brief Calculate crc over framing data packet. static uint16_t calculate_framing_crc16(framing_data_packet_t * packet, const uint8_t * data) { uint16_t crc16; // Initialize the CRC16 information crc16_data_t crcInfo; crc16_init(&crcInfo); // Run CRC on all header bytes besides the CRC field crc16_update(&crcInfo, (uint8_t *)&packet->header.startByte, sizeof(framing_data_packet_t) - sizeof(uint16_t)); // Continue running CRC on any payload bytes crc16_update(&crcInfo, data, packet->length); // Finalize the CRC calculations crc16_finalize(&crcInfo, &crc16); return crc16; }
/* mode = 0/1/2 0=init, 1=update, 2=finalize */ uint32_t update_crc_ne(uint32_t old_crc, int crclen, void *data, int datasiz, int datalen, int mode) { uint32_t seed=old_crc; uint32_t new_crc; crc16_t crc16; crc24_t crc24; crc32_t crc32; unsigned int mask=0 ; int data_len=datasiz*datalen ; new_crc = seed ; if( (*little_endian) & (datasiz>1)){ /* multibyte tokens on little endian machine */ mask = datasiz-1 ; /* 0/1/3/7 magic mask to get stitching order count on little endian machines */ } if (crclen==16) { crc16 = seed & 0xFFFF ; if(mode==0) crc16 = crc16_init() ; crc16 = crc16_update_le(crc16, (const unsigned char *) data, data_len, mask) ; if(mode==2) crc16 = crc16_finalize(crc16) ; new_crc = crc16 ; } else if (crclen==24) { crc24 = seed & 0xFFFFFF ; if(mode==0) crc24 = crc24_init() ; crc24 = crc24_update_le(crc24, (const unsigned char *) data, data_len, mask) ; if(mode==2) crc24 = crc24_finalize(crc24) ; new_crc = crc24 ; } else if (crclen==32) { crc32 = seed & 0xFFFFFFFF ; if(mode==0) crc32 = crc32_init() ; crc32 = crc32_update_le(crc32, (const unsigned char *) data, data_len, mask) ; if(mode==2) crc32 = crc32_finalize(crc32) ; new_crc = crc32 ; } else { new_crc = seed ; } return new_crc; }