/* * Copyright (c) 2018 Workaround GmbH. * Copyright (c) 2017 Intel Corporation. * Copyright (c) 2017 Nordic Semiconductor ASA * Copyright (c) 2015 Runtime Inc * Copyright (c) 2018 Google LLC. * * SPDX-License-Identifier: Apache-2.0 */ /** @file * @brief CRC computation function */ #ifndef ZEPHYR_INCLUDE_CRC_H_ #define ZEPHYR_INCLUDE_CRC_H_ #include #include #include #ifdef __cplusplus extern "C" { #endif /* Initial value expected to be used at the beginning of the crc8_ccitt * computation. */ #define CRC8_CCITT_INITIAL_VALUE 0xFF /** * @defgroup checksum Checksum */ /** * @defgroup crc CRC * @ingroup checksum * @{ */ /** * @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 * @param pad Adds padding with zeros at the end of input bytes * * @return The computed CRC16 value */ u16_t crc16(const u8_t *src, size_t len, u16_t polynomial, u16_t initial_value, bool pad); /** * @brief Compute the CRC-16/CCITT checksum of a buffer. * * See ITU-T Recommendation V.41 (November 1988). Uses 0x1021 as the * polynomial, reflects the input, and reflects the output. * * To calculate the CRC across non-contiguous blocks use the return * value from block N-1 as the seed for block N. * * For CRC-16/CCITT, use 0 as the initial seed. Other checksums in * the same family can be calculated by changing the seed and/or * XORing the final value. Examples include: * * - X-25 (used in PPP): seed=0xffff, xor=0xffff, residual=0xf0b8 * * @note API changed in Zephyr 1.11. * * @param seed Value to seed the CRC with * @param src Input bytes for the computation * @param len Length of the input in bytes * * @return The computed CRC16 value */ u16_t crc16_ccitt(u16_t seed, const u8_t *src, size_t len); /** * @brief Compute the CRC-16/XMODEM checksum of a buffer. * * The MSB first version of ITU-T Recommendation V.41 (November 1988). * Uses 0x1021 as the polynomial with no reflection. * * To calculate the CRC across non-contiguous blocks use the return * value from block N-1 as the seed for block N. * * For CRC-16/XMODEM, use 0 as the initial seed. Other checksums in * the same family can be calculated by changing the seed and/or * XORing the final value. Examples include: * * - CCIITT-FALSE: seed=0xffff * - GSM: seed=0, xorout=0xffff, residue=0x1d0f * * @param seed Value to seed the CRC with * @param src Input bytes for the computation * @param len Length of the input in bytes * * @return The computed CRC16 value */ u16_t crc16_itu_t(u16_t seed, const u8_t *src, size_t len); /** * @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, true); } /** * @brief Generate IEEE conform CRC32 checksum. * * @param *data Pointer to data on which the CRC should be calculated. * @param len Data length. * * @return CRC32 value. * */ u32_t crc32_ieee(const u8_t *data, size_t len); /** * @brief Update an IEEE conforming CRC32 checksum. * * @param crc CRC32 checksum that needs to be updated. * @param *data Pointer to data on which the CRC should be calculated. * @param len Data length. * * @return CRC32 value. * */ u32_t crc32_ieee_update(u32_t crc, const u8_t *data, size_t len); /** * @brief Compute CCITT variant of CRC 8 * * Normal CCITT variant of CRC 8 is using 0x07. * * @param initial_value Initial value for the CRC computation * @param buf Input bytes for the computation * @param len Length of the input in bytes * * @return The computed CRC8 value */ u8_t crc8_ccitt(u8_t initial_value, const void *buf, size_t len); /** * @brief Compute the CRC-7 checksum of a buffer. * * See JESD84-A441. Used by the MMC protocol. Uses 0x09 as the * polynomial with no reflection. The CRC is left * justified, so bit 7 of the result is bit 6 of the CRC. * * @param seed Value to seed the CRC with * @param src Input bytes for the computation * @param len Length of the input in bytes * * @return The computed CRC7 value */ u8_t crc7_be(u8_t seed, const u8_t *src, size_t len); /** * @} */ #ifdef __cplusplus } #endif #endif