45 lines
977 B
C
45 lines
977 B
C
uint8_t crc_checksum(uint8_t *dat, int len, const uint8_t poly) {
|
|
uint8_t crc = 0xFF;
|
|
int i, j;
|
|
for (i = len - 1; i >= 0; i--) {
|
|
crc ^= dat[i];
|
|
for (j = 0; j < 8; j++) {
|
|
if ((crc & 0x80U) != 0U) {
|
|
crc = (uint8_t)((crc << 1) ^ poly);
|
|
}
|
|
else {
|
|
crc <<= 1;
|
|
}
|
|
}
|
|
}
|
|
return crc;
|
|
}
|
|
|
|
void gen_crc_lookup_table(uint8_t poly, uint8_t crc_lut[]) {
|
|
|
|
uint8_t j;
|
|
uint16_t i;
|
|
|
|
for (i = 0; i < 256; i++) {
|
|
uint8_t crc;
|
|
crc = i;
|
|
for (j = 0; j < 8; j++) {
|
|
if ((crc & 0x80) != 0)
|
|
crc = (uint8_t)((crc << 1) ^ poly);
|
|
else
|
|
crc <<= 1;
|
|
}
|
|
crc_lut[i] = crc;
|
|
}
|
|
}
|
|
|
|
uint8_t lut_checksum(uint8_t *d, int l, uint8_t *table) {
|
|
uint8_t crc = 0xFF; // Standard init value for CRC8
|
|
// CRC the payload, skipping over the first byte where the CRC lives.
|
|
for (int i = 1; i < l; i++) {
|
|
crc ^= d[i] & 0xFF;
|
|
crc = table[crc] ^ crc<<8;
|
|
}
|
|
crc = crc ^ 0xFF; //final xor
|
|
return crc;
|
|
} |