128 lines
4.3 KiB
C
128 lines
4.3 KiB
C
/*
|
|
* 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_ */
|