panda/board/crc.h

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;
}