summaryrefslogtreecommitdiff
path: root/include/crc16.h
blob: f041203d0c8fa9b5bcc1c68ed17d05296e325ae3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
 * Copyright (c) 2017 Intel Corporation.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/** @file
 * @brief CRC 16 computation function
 */

#ifndef __CRC16_H
#define __CRC16_H

#include <zephyr/types.h>
#include <stddef.h>

/**
 * @brief Generic function for computing CRC 16
 *
 * Compute CRC 16 by passing in the address of the input, the input length
 * and polynomial used in addition to the initial value.
 *
 * @param src Input bytes for the computation
 * @param len Length of the input in bytes
 * @param polynomial The polynomial to use omitting the leading x^16
 *        coefficient
 * @param initial_value Initial value for the CRC computation
 *
 * @return The computed CRC16 value
 */
u16_t crc16(const u8_t *src, size_t len, u16_t polynomial,
	       u16_t initial_value);

/**
 * @brief Compute CCITT variant of CRC 16
 *
 * CCITT variant of CRC 16 is using 0x1021 as its polynomial with the initial
 * value set to 0xffff.
 *
 * @param src Input bytes for the computation
 * @param len Length of the input in bytes
 *
 * @return The computed CRC16 value
 */
static inline u16_t crc16_ccitt(const u8_t *src, size_t len)
{
	return crc16(src, len, 0x1021, 0xffff);
}

/**
 * @brief Compute ANSI variant of CRC 16
 *
 * ANSI variant of CRC 16 is using 0x8005 as its polynomial with the initial
 * value set to 0xffff.
 *
 * @param src Input bytes for the computation
 * @param len Length of the input in bytes
 *
 * @return The computed CRC16 value
 */
static inline u16_t crc16_ansi(const u8_t *src, size_t len)
{
	return crc16(src, len, 0x8005, 0xffff);
}

#endif