Zephyr Project API  3.3.0
A Scalable Open Source RTOS
crc.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018 Workaround GmbH.
3 * Copyright (c) 2017 Intel Corporation.
4 * Copyright (c) 2017 Nordic Semiconductor ASA
5 * Copyright (c) 2015 Runtime Inc
6 * Copyright (c) 2018 Google LLC.
7 * Copyright (c) 2022 Meta
8 *
9 * SPDX-License-Identifier: Apache-2.0
10 */
15#ifndef ZEPHYR_INCLUDE_SYS_CRC_H_
16#define ZEPHYR_INCLUDE_SYS_CRC_H_
17
18#include <zephyr/types.h>
19#include <stdbool.h>
20#include <stddef.h>
21
22#include <zephyr/sys/__assert.h>
23
24#ifdef __cplusplus
25extern "C" {
26#endif
27
28/* Initial value expected to be used at the beginning of the crc8_ccitt
29 * computation.
30 */
31#define CRC8_CCITT_INITIAL_VALUE 0xFF
32
58};
59
79uint16_t crc16(uint16_t poly, uint16_t seed, const uint8_t *src, size_t len);
80
109uint16_t crc16_reflect(uint16_t poly, uint16_t seed, const uint8_t *src, size_t len);
125uint8_t crc8(const uint8_t *src, size_t len, uint8_t polynomial, uint8_t initial_value,
126 bool reversed);
127
159uint16_t crc16_ccitt(uint16_t seed, const uint8_t *src, size_t len);
160
196uint16_t crc16_itu_t(uint16_t seed, const uint8_t *src, size_t len);
197
209static inline uint16_t crc16_ansi(const uint8_t *src, size_t len)
210{
211 return crc16_reflect(0xA001, 0xffff, src, len);
212}
213
223uint32_t crc32_ieee(const uint8_t *data, size_t len);
224
236
250 size_t len, bool first_pkt, bool last_pkt);
251
263uint8_t crc8_ccitt(uint8_t initial_value, const void *buf, size_t len);
264
278uint8_t crc7_be(uint8_t seed, const uint8_t *src, size_t len);
279
302static inline uint32_t crc_by_type(enum crc_type type, const uint8_t *src, size_t len,
303 uint32_t seed, uint32_t poly, bool reflect, bool first,
304 bool last)
305{
306 switch (type) {
307 case CRC7_BE:
308 return crc7_be(seed, src, len);
309 case CRC8:
310 return crc8(src, len, poly, seed, reflect);
311 case CRC8_CCITT:
312 return crc8_ccitt(seed, src, len);
313 case CRC16:
314 if (reflect) {
315 return crc16_reflect(poly, seed, src, len);
316 } else {
317 return crc16(poly, seed, src, len);
318 }
319 case CRC16_ANSI:
320 return crc16_ansi(src, len);
321 case CRC16_CCITT:
322 return crc16_ccitt(seed, src, len);
323 case CRC16_ITU_T:
324 return crc16_itu_t(seed, src, len);
325 case CRC32_C:
326 return crc32_c(seed, src, len, first, last);
327 case CRC32_IEEE:
328 return crc32_ieee_update(seed, src, len);
329 default:
330 break;
331 }
332
333 __ASSERT_NO_MSG(false);
334 return -1;
335}
336
341#ifdef __cplusplus
342}
343#endif
344
345#endif
uint8_t crc7_be(uint8_t seed, const uint8_t *src, size_t len)
Compute the CRC-7 checksum of a buffer.
uint32_t crc32_ieee_update(uint32_t crc, const uint8_t *data, size_t len)
Update an IEEE conforming CRC32 checksum.
uint16_t crc16(uint16_t poly, uint16_t seed, const uint8_t *src, size_t len)
Generic function for computing a CRC-16 without input or output reflection.
uint16_t crc16_itu_t(uint16_t seed, const uint8_t *src, size_t len)
Compute the checksum of a buffer with polynomial 0x1021, no reflection of input or output.
static uint32_t crc_by_type(enum crc_type type, const uint8_t *src, size_t len, uint32_t seed, uint32_t poly, bool reflect, bool first, bool last)
Compute a CRC checksum, in a generic way.
Definition: crc.h:302
uint16_t crc16_ccitt(uint16_t seed, const uint8_t *src, size_t len)
Compute the checksum of a buffer with polynomial 0x1021, reflecting input and output.
uint32_t crc32_c(uint32_t crc, const uint8_t *data, size_t len, bool first_pkt, bool last_pkt)
Calculate CRC32C (Castagnoli) checksum.
uint8_t crc8_ccitt(uint8_t initial_value, const void *buf, size_t len)
Compute CCITT variant of CRC 8.
uint8_t crc8(const uint8_t *src, size_t len, uint8_t polynomial, uint8_t initial_value, bool reversed)
Generic function for computing CRC 8.
static uint16_t crc16_ansi(const uint8_t *src, size_t len)
Compute the ANSI (or Modbus) variant of CRC-16.
Definition: crc.h:209
crc_type
CRC algorithm enumeration.
Definition: crc.h:48
uint16_t crc16_reflect(uint16_t poly, uint16_t seed, const uint8_t *src, size_t len)
Generic function for computing a CRC-16 with input and output reflection.
uint32_t crc32_ieee(const uint8_t *data, size_t len)
Generate IEEE conform CRC32 checksum.
@ CRC7_BE
Definition: crc.h:49
@ CRC16
Definition: crc.h:52
@ CRC16_ITU_T
Definition: crc.h:55
@ CRC32_C
Definition: crc.h:56
@ CRC16_ANSI
Definition: crc.h:53
@ CRC8
Definition: crc.h:50
@ CRC16_CCITT
Definition: crc.h:54
@ CRC8_CCITT
Definition: crc.h:51
@ CRC32_IEEE
Definition: crc.h:57
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
static fdata_t data[2]
Definition: test_fifo_contexts.c:15