[helper] Make crc8 function more flexible to avoid reimplementation in individual components (#10201)
This commit is contained in:
1 parent
0e31bc1a67
commit
0b50ef227b
19 files changed
+379
-147
No files matched your search
@@ -41,17 +41,28 @@ static const uint16_t CRC16_1021_BE_LUT_H[] = {0x0000, 0x1231, 0x2462, 0x3653, 0
|
||||
|
||||
// Mathematics
|
||||
|
||||
uint8_t crc8(const uint8_t *data, uint8_t len) {
|
||||
uint8_t crc = 0;
|
||||
|
||||
uint8_t crc8(const uint8_t *data, uint8_t len, uint8_t crc, uint8_t poly, bool msb_first) {
|
||||
while ((len--) != 0u) {
|
||||
uint8_t inbyte = *data++;
|
||||
for (uint8_t i = 8; i != 0u; i--) {
|
||||
bool mix = (crc ^ inbyte) & 0x01;
|
||||
crc >>= 1;
|
||||
if (mix)
|
||||
crc ^= 0x8C;
|
||||
inbyte >>= 1;
|
||||
if (msb_first) {
|
||||
// MSB first processing (for polynomials like 0x31, 0x07)
|
||||
crc ^= inbyte;
|
||||
for (uint8_t i = 8; i != 0u; i--) {
|
||||
if (crc & 0x80) {
|
||||
crc = (crc << 1) ^ poly;
|
||||
} else {
|
||||
crc <<= 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// LSB first processing (default for Dallas/Maxim 0x8C)
|
||||
for (uint8_t i = 8; i != 0u; i--) {
|
||||
bool mix = (crc ^ inbyte) & 0x01;
|
||||
crc >>= 1;
|
||||
if (mix)
|
||||
crc ^= poly;
|
||||
inbyte >>= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
|
||||
Reference in new issue
Block a user