You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.5 KiB
74 lines
1.5 KiB
/* |
|
* Copyright (c) 2020 Intel Corporation |
|
* Copyright (c) 2017 Nordic Semiconductor ASA |
|
* Copyright (c) 2015 Runtime Inc |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#include <zephyr/sys/crc.h> |
|
|
|
static const uint8_t crc8_ccitt_small_table[16] = { |
|
0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, |
|
0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d |
|
}; |
|
|
|
static const uint8_t crc8_rohc_small_table[16] = { |
|
0x00, 0x1c, 0x38, 0x24, 0x70, 0x6c, 0x48, 0x54, |
|
0xe0, 0xfc, 0xd8, 0xc4, 0x90, 0x8c, 0xa8, 0xb4 |
|
}; |
|
|
|
uint8_t crc8_ccitt(uint8_t val, const void *buf, size_t cnt) |
|
{ |
|
size_t i; |
|
const uint8_t *p = buf; |
|
|
|
for (i = 0; i < cnt; i++) { |
|
val ^= p[i]; |
|
val = (val << 4) ^ crc8_ccitt_small_table[val >> 4]; |
|
val = (val << 4) ^ crc8_ccitt_small_table[val >> 4]; |
|
} |
|
return val; |
|
} |
|
|
|
uint8_t crc8_rohc(uint8_t val, const void *buf, size_t cnt) |
|
{ |
|
size_t i; |
|
const uint8_t *p = buf; |
|
|
|
for (i = 0; i < cnt; i++) { |
|
val ^= p[i]; |
|
val = (val >> 4) ^ crc8_rohc_small_table[val & 0x0f]; |
|
val = (val >> 4) ^ crc8_rohc_small_table[val & 0x0f]; |
|
} |
|
return val; |
|
} |
|
|
|
uint8_t crc8(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; |
|
|
|
for (i = 0; i < len; i++) { |
|
crc ^= src[i]; |
|
|
|
for (j = 0; j < 8; j++) { |
|
if (reversed) { |
|
if ((crc & 0x01) != 0) { |
|
crc = (crc >> 1) ^ polynomial; |
|
} else { |
|
crc >>= 1; |
|
} |
|
} else { |
|
if ((crc & 0x80) != 0) { |
|
crc = (crc << 1) ^ polynomial; |
|
} else { |
|
crc <<= 1; |
|
} |
|
} |
|
} |
|
} |
|
|
|
return crc; |
|
}
|
|
|