#include <avr/crc16.h>
This header file provides a optimized inline functions for calculating 16 bit cyclic redundancy checks (CRC) using common polynomials.
Functions | |
static __inline__ uint16_t | _crc16_update (uint16_t __crc, uint8_t __data) |
static __inline__ uint16_t | _crc_xmodem_update (uint16_t __crc, uint8_t __data) |
static __inline__ uint16_t | _crc_ccitt_update (uint16_t __crc, uint8_t __data) |
|
Optimized CRC-16 calcutation.
Polynomial: x^16 + x^15 + x^2 + 1 (0xa001) This CRC is normally used in disk-drive controllers. |
|
Optimized CRC-CCITT calculation.
Polynomial: x^16 + x^12 + x^5 + 1 (0x8408) This is the CRC used by PPP and IrDA. See RFC1171 (PPP protocol) and IrDA IrLAP 1.1
uint16_t
crc_ccitt_update (uint16_t crc, uint8_t data)
{
data ^= lo8 (crc);
data ^= data << 4;
return ((((uint16_t)data << 8) | hi8 (crc)) ^ (uint8_t)(data >> 4)
^ ((uint16_t)data << 3));
}
|
|
Optimized CRC-XMODEM calculation.
Polynomial: x^16 + x^12 + x^5 + 1 (0x1021) This is the CRC used by the Xmodem-CRC protocol. The following is the equivalent functionality written in C.
uint16_t crc_xmodem_update (uint16_t crc, uint8_t data) { int i; crc = crc ^ ((uint16_t)data << 8); for (i=0; i<8; i++) { if (crc & 0x8000) crc = (crc << 1) ^ 0x1021; else crc <<= 1; } return crc; } |