54 lines
1.0 KiB
C
54 lines
1.0 KiB
C
/*
|
|
* Copyright (c) 2023 Michal Morsisko
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/sys/crc.h>
|
|
|
|
uint8_t crc4(const uint8_t *src, size_t len, uint8_t polynomial, uint8_t initial_value,
|
|
bool reversed)
|
|
{
|
|
uint8_t crc = initial_value;
|
|
size_t i, j, k;
|
|
|
|
for (i = 0; i < len; i++) {
|
|
for (j = 0; j < 2; j++) {
|
|
crc ^= ((src[i] >> (4 * (1 - j))) & 0xf);
|
|
|
|
for (k = 0; k < 4; k++) {
|
|
if (reversed) {
|
|
if (crc & 0x01) {
|
|
crc = (crc >> 1) ^ polynomial;
|
|
} else {
|
|
crc >>= 1;
|
|
}
|
|
} else {
|
|
if (crc & 0x8) {
|
|
crc = (crc << 1) ^ polynomial;
|
|
} else {
|
|
crc <<= 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return crc & 0xF;
|
|
}
|
|
|
|
uint8_t crc4_ti(uint8_t seed, const uint8_t *src, size_t len)
|
|
{
|
|
static const uint8_t lookup[8] = { 0x03, 0x65, 0xcf, 0xa9, 0xb8, 0xde, 0x74, 0x12 };
|
|
uint8_t index;
|
|
|
|
for (size_t i = 0; i < len; i++) {
|
|
for (size_t j = 0U; j < 2U; j++) {
|
|
index = seed ^ ((src[i] >> (4*(1-j))) & 0xf);
|
|
seed = (lookup[index >> 1] >> (1 - (index & 1)) * 4) & 0xf;
|
|
}
|
|
}
|
|
|
|
return seed;
|
|
}
|