blob: a4a483598ad3cc335cb5a41f0289a740375c96c4 [file] [log] [blame]
/*
* Copyright 2018 NXP
* All rights reserved.
*
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef _CRC_H_
#define _CRC_H_
#include "fsl_common.h"
/*!
* @addtogroup CRC_Adapter
* @{
*/
/************************************************************************************
*************************************************************************************
* Include
*************************************************************************************
***********************************************************************************/
/************************************************************************************
*************************************************************************************
* Public types
*************************************************************************************
************************************************************************************/
/*! @brief crcRefIn definitions. */
typedef enum _hal_crc_cfg_refin
{
KHAL_CrcInputNoRef = 0U, /*!< Do not manipulate input data stream. */
KHAL_CrcRefInput = 1U /*!< Reflect each byte in the input stream bitwise. */
} hal_crc_cfg_refin_t;
/*! @brief crcRefOut definitions. */
typedef enum _hal_crc_cfg_refout
{
KHAL_CrcOutputNoRef = 0U, /*!< Do not manipulate CRC result. */
KHAL_CrcRefOutput = 1U /*!< CRC result is to be reflected bitwise (operated on entire word). */
} hal_crc_cfg_refout_t;
/*! @brief crcByteOrder definitions. */
typedef enum _hal_crc_cfg_byteord
{
KHAL_CrcLSByteFirst = 0U, /*!< Byte order of the CRC LS Byte first. */
KHAL_CrcMSByteFirst = 1U /*!< Bit order of the CRC MS Byte first. */
} hal_crc_cfg_byteord_t;
/*! @brief CRC polynomials to use. */
typedef enum _hal_crc_polynomial
{
KHAL_CrcPolynomial_CRC_8_CCITT = 0x103, /*!< x^8+x^2+x^1+1 */
KHAL_CrcPolynomial_CRC_16 = 0x1021, /*!< x^16+x^12+x^5+1 */
KHAL_CrcPolynomial_CRC_32 = 0x4C11DB7U, /*!< x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1 */
} hal_crc_polynomial_t;
/*! @brief CRC configuration structure. */
typedef struct _hal_crc_config
{
hal_crc_cfg_refin_t crcRefIn; /*!< CRC reflect input. See "hal_crc_cfg_refin_t". */
hal_crc_cfg_refout_t crcRefOut; /*!< CRC reflect output. See "hal_crc_cfg_refout_t". */
hal_crc_cfg_byteord_t crcByteOrder; /*!< CRC byte order. See "hal_crc_cfg_byteord_t". */
uint32_t crcSeed; /*!< CRC Seed value. Initial value for CRC LFSR. */
uint32_t crcPoly; /*!< CRC Polynomial value. */
uint32_t crcXorOut; /*!< XOR mask for CRC result (for no mask, should be 0). */
uint8_t complementChecksum; /*!< wether output the complement checksum. */
uint8_t crcSize; /*!< Number of CRC octets, 2 mean use CRC16, 4 mean use CRC32. */
uint8_t crcStartByte; /*!< Start CRC with this byte position. Byte #0 is the first byte of Sync Address. */
} hal_crc_config_t;
/************************************************************************************
*************************************************************************************
* Public prototypes
*************************************************************************************
************************************************************************************/
#if defined(__cplusplus)
extern "C" {
#endif
/*!
* @name CRC
* @{
*/
/*!
* @brief Compute CRC function.
*
* The function computes the CRC.
*
* @code
* config = (hal_crc_config_t) {
* .crcSize = 4,
* .crcStartByte = 0,
* .crcRefIn = KHAL_CrcInputNoRef,
* .crcRefOut = KHAL_CrcOutputNoRef,
* .crcByteOrder = KHAL_CrcMSByteFirst,
* .complementChecksum = true,
* .crcSeed = 0xFFFFFFFF,
* .crcPoly = KHAL_CrcPolynomial_CRC_32,
* .crcXorOut = 0xFFFFFFFF,
* };
*
* res = HAL_CrcCompute(&config, (uint8_t *) pattern, strlen(pattern));
* @endcode
*
* @note The settings for compute CRC are taken from the passed CRC_config_t structure.
*
* @param crcConfig configuration structure.
* @param dataIn input data buffer.
* @param length input data buffer size.
*
* @retval Computed CRC value.
*/
uint32_t HAL_CrcCompute(hal_crc_config_t *crcConfig, uint8_t *dataIn, uint32_t length);
/*! @} */
#if defined(__cplusplus)
}
#endif
/*! @} */
#endif /* _CRC_H_ */