|
|
@@ -0,0 +1,65 @@ |
|
|
|
#ifndef _UTIL_CRC16_H_ |
|
|
|
#define _UTIL_CRC16_H_ |
|
|
|
|
|
|
|
#include <stdint.h> |
|
|
|
|
|
|
|
static inline uint16_t _crc16_update(uint16_t crc, uint8_t data) __attribute__((always_inline, unused)); |
|
|
|
static inline uint16_t _crc16_update(uint16_t crc, uint8_t data) |
|
|
|
{ |
|
|
|
unsigned int i; |
|
|
|
|
|
|
|
crc ^= data; |
|
|
|
for (i = 0; i < 8; ++i) { |
|
|
|
if (crc & 1) { |
|
|
|
crc = (crc >> 1) ^ 0xA001; |
|
|
|
} else { |
|
|
|
crc = (crc >> 1); |
|
|
|
} |
|
|
|
} |
|
|
|
return crc; |
|
|
|
} |
|
|
|
|
|
|
|
static inline uint16_t _crc_xmodem_update(uint16_t crc, uint8_t data) __attribute__((always_inline, unused)); |
|
|
|
static inline uint16_t _crc_xmodem_update(uint16_t crc, uint8_t data) |
|
|
|
{ |
|
|
|
unsigned 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; |
|
|
|
} |
|
|
|
|
|
|
|
static inline uint16_t _crc_ccitt_update (uint16_t crc, uint8_t data) __attribute__((always_inline, unused)); |
|
|
|
static inline uint16_t _crc_ccitt_update (uint16_t crc, uint8_t data) |
|
|
|
{ |
|
|
|
data ^= (crc & 255); |
|
|
|
data ^= data << 4; |
|
|
|
|
|
|
|
return ((((uint16_t)data << 8) | (crc >> 8)) ^ (uint8_t)(data >> 4) |
|
|
|
^ ((uint16_t)data << 3)); |
|
|
|
} |
|
|
|
|
|
|
|
static inline uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data) __attribute__((always_inline, unused)); |
|
|
|
static inline uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data) |
|
|
|
{ |
|
|
|
unsigned int i; |
|
|
|
|
|
|
|
crc = crc ^ data; |
|
|
|
for (i = 0; i < 8; i++) { |
|
|
|
if (crc & 0x01) { |
|
|
|
crc = (crc >> 1) ^ 0x8C; |
|
|
|
} else { |
|
|
|
crc >>= 1; |
|
|
|
} |
|
|
|
} |
|
|
|
return crc; |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|