f2838x_cm_cia402_solution/device/driverlib_cm/gcrc.h

440 lines
14 KiB
C

//###########################################################################
//
// FILE: gcrc.h
//
// TITLE: Driver for the GCRC module.
//
//###########################################################################
// $Copyright:
// Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the
// distribution.
//
// Neither the name of Texas Instruments Incorporated nor the names of
// its contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// $
//###########################################################################
#ifndef GCRC_H
#define GCRC_H
//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif
//*****************************************************************************
//
//! \addtogroup gcrc_api GCRC
//! \brief This module is used for CRC calculations using GCRC.
//! @{
//
//*****************************************************************************
#include <stdbool.h>
#include <stdint.h>
#include "debug.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gcrc.h"
//*****************************************************************************
//
// Defines for the API.
//
//*****************************************************************************
//*****************************************************************************
//
// GCRC endianness values that can be passed to GCRC_setDataEndianness()
// Endianness applies to word and half word writes.
//
//*****************************************************************************
#define GCRC_ENDIANNESS_LITTLE 0x00000000U //!< Little Endian
#define GCRC_ENDIANNESS_BIG 0x00000040U //!< Big Endian
//*****************************************************************************
//
// GCRC data types that can be passed as datatype param to GCRC_setDataType()
// and datasize param to GCRC_writeData()
//
//*****************************************************************************
#define GCRC_DATATYPE_8BIT 0x00000000U //!< Byte data type
#define GCRC_DATATYPE_16BIT 0x00000100U //!< 16-bit data type
#define GCRC_DATATYPE_32BIT 0x00000200U //!< 32 bit data type
//*****************************************************************************
//
// GCRC configuration for fixed polynomial path
//
//*****************************************************************************
#define GCRC_FIXEDPATH_POLY 0x04c11db7U //!< 32 bit polynomial
#define GCRC_FIXEDPATH_POLYSIZE 0x00000020U //!< 32 bit polynomial
#define GCRC_FIXEDPATH_ENDIANNESS GCRC_ENDIANNESS_LITTLE //!< Little Endian
#define GCRC_FIXEDPATH_BITREVERSE 0U //!< No bit reversal
#define GCRC_FIXEDPATH_DATATYPE GCRC_DATATYPE_32BIT //!< 32 bit datatype
#define GCRC_FIXEDPATH_DATAMASK 0U //!< No masking
#define GCRC_POLYSIZE_MAXVALUE 0x20U //!< Max value possible for POLYSIZE
//!< field in CRCCTRL register
//*****************************************************************************
//
// API Function prototypes
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks GCRC base address.
//!
//! \param base is the base address of the GCRC instance used.
//!
//! This function determines if GCRC module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
#ifdef DEBUG
static inline bool
GCRC_isBaseValid(uint32_t base)
{
return(base == GCRC_BASE);
}
#endif
//*****************************************************************************
//
//! Sets the generator polynomial.
//!
//! \param base is the base address of the GCRC instance used
//! \param poly is the generator polynomial
//! \param polySize is the order of the polynomial (1 - 32)
//!
//! This function sets the generator polynomial for computing CRC.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GCRC_setPolynomial(uint32_t base, uint32_t poly, uint32_t polySize)
{
//
// Check the arguments
//
ASSERT(GCRC_isBaseValid(base));
ASSERT((polySize != 0U) && (polySize <= GCRC_POLYSIZE_MAXVALUE));
//
// Set the polynomial size
//
HWREG(base + GCRC_O_CRCCTRL) = (polySize << GCRC_CRCCTRL_POLYSIZE_S) |
(HWREG(base + GCRC_O_CRCCTRL) &
~(uint32_t)GCRC_CRCCTRL_POLYSIZE_M);
//
// Set the polynomial
//
HWREG(base + GCRC_O_CRCPOLY) = poly;
}
//*****************************************************************************
//
//! Sets the endianness of the data.
//!
//! \param base is the base address of the GCRC instance used
//! \param endianness is the data endianness. Use macros
//! GCRC_ENDIANNESS_LITTLE or GCRC_ENDIANNESS_BIG
//!
//! This function sets the endianness of the data.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GCRC_setDataEndianness(uint32_t base, uint32_t endianness)
{
//
// Check the arguments
//
ASSERT(GCRC_isBaseValid(base));
ASSERT((endianness == GCRC_ENDIANNESS_LITTLE) ||
(endianness == GCRC_ENDIANNESS_BIG));
//
// Set the endianness in the control register
//
HWREG(base + GCRC_O_CRCCTRL) = (HWREG(base + GCRC_O_CRCCTRL) &
~(uint32_t)GCRC_CRCCTRL_ENDIANNESS) |
endianness;
}
//*****************************************************************************
//
//! Sets the datatype of the data.
//!
//! \param base is the base address of the GCRC instance used
//! \param dataType is the data type of the input data. Use macros
//! GCRC_DATATYPE_8BIT, GCRC_DATATYPE_16BIT, GCRC_DATATYPE_32BIT
//!
//! This function set the data type of the element of the data array,
//! on which CRC is to be computed..
//!
//! \return None.
//
//*****************************************************************************
static inline void
GCRC_setDataType(uint32_t base, uint32_t dataType)
{
//
// Check the arguments
//
ASSERT(GCRC_isBaseValid(base));
ASSERT((dataType == GCRC_DATATYPE_8BIT) ||
(dataType == GCRC_DATATYPE_16BIT) ||
(dataType == GCRC_DATATYPE_32BIT));
//
// Set the data type in the control register
//
HWREG(base + GCRC_O_CRCCTRL) = (HWREG(base + GCRC_O_CRCCTRL) &
~(uint32_t)GCRC_CRCCTRL_DATATYPE_M) |
dataType;
}
//*****************************************************************************
//
//! Enable/Disable bit reverse feature.
//!
//! \param base is the base address of the GCRC instance used
//! \param enable : TRUE if bit reverse needs to be enabled.
//! : FALSE if bit reverse needs to be disabled
//!
//! This function enables/disables the bit reverse of the input data
//!
//! \return None.
//
//*****************************************************************************
static inline void
GCRC_enableBitReverse(uint32_t base, bool enable)
{
//
// Check the arguments
//
ASSERT(GCRC_isBaseValid(base));
if(enable)
{
//
// Set the bit reverse bit in control register
//
HWREG(base + GCRC_O_CRCCTRL) |= GCRC_CRCCTRL_BITREVERSE;
}
else
{
//
// Clear the bit reverse bit in the control register
//
HWREG(base + GCRC_O_CRCCTRL) &= ~GCRC_CRCCTRL_BITREVERSE;
}
}
//*****************************************************************************
//
//! Sets the data mask for the input data.
//!
//! \param base is the base address of the GCRC instance used
//! \param dataMask is the number of bits to be masked.
//!
//! This function set the data mask for the input data.
//! For example, dataMask equals 0x3, 3 most significant bits of data will
//! be masked.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GCRC_setDataMask(uint32_t base, uint32_t dataMask)
{
#ifdef DEBUG
uint32_t dataType = HWREG(base + GCRC_O_CRCCTRL) & GCRC_CRCCTRL_DATATYPE_M;
#endif
//
// Check the arguments
//
ASSERT(GCRC_isBaseValid(base));
ASSERT(((dataType == GCRC_DATATYPE_8BIT) && (dataMask < 8U)) ||
((dataType == GCRC_DATATYPE_16BIT) && (dataMask < 16U)) ||
((dataType == GCRC_DATATYPE_32BIT) && (dataMask < 32U)));
//
// Set the DATAMASK register
//
HWREG(base + GCRC_O_CRCDATAMASK) = dataMask;
}
//*****************************************************************************
//
//! Sets the seed value.
//!
//! \param base is the base address of the GCRC instance used
//! \param value is the seed value that needs to be set.
//!
//! This function sets the seed value for CRC computation.
//!
//! \return None.
//
//*****************************************************************************
static inline void
GCRC_setSeedValue(uint32_t base, uint32_t value)
{
//
// Check the arguments
//
ASSERT(GCRC_isBaseValid(base));
//
// Set the DATAOUT register with seed value
//
HWREG(base + GCRC_O_CRCDATAOUT) = value;
}
//*****************************************************************************
//
//! Reads the computed CRC value.
//!
//! \param base is the base address of the GCRC instance used
//!
//! This function read the computed CRC value.
//!
//! \note Reads from CRCDATAOUT register will be stalled if CRC engine is
//! busy computing CRC
//!
//! \return None.
//
//*****************************************************************************
static inline uint32_t
GCRC_readResult(uint32_t base)
{
//
// Check the arguments
//
ASSERT(GCRC_isBaseValid(base));
return(HWREG(base + GCRC_O_CRCDATAOUT));
}
//*****************************************************************************
//
//! Reads the transformed data
//!
//! \param base is the base address of the GCRC instance used
//!
//! This function returns the data value as seen by the core CRC engine after
//! endianess, bit reversal and masking transformation
//!
//! \return None.
//
//*****************************************************************************
static inline uint32_t
GCRC_getTransData(uint32_t base)
{
//
// Check the arguments
//
ASSERT(GCRC_isBaseValid(base));
return(HWREG(base + GCRC_O_CRCDATATRANS));
}
//*****************************************************************************
//
//! Sets the fixed polynomial data path.
//!
//! \param base is the base address of the GCRC instance used
//!
//! This function sets the fixed polynomial data path which computes
//! the CRC in a single cycle.
//!
//! \note Only 32-bit writes. Byte and halfword accesses would take the
//! generic CRC data path.
//!
//! \return None.
//
//*****************************************************************************
extern void
GCRC_setFixedPolynomialDataPath(uint32_t base);
//*****************************************************************************
//
//! Writes the input data.
//!
//! \param base is the base address of the GCRC instance used
//! \param data is value that needs to be written.
//! \param dataSize is the size of the data. Use macros GCRC_DATATYPE_8BIT,
//! GCRC_DATATYPE_16BIT, GCRC_DATATYPE_32BIT
//!
//! This function writes the input data for the CRC computation.
//!
//! \note Writes to CRCDATAIN register will be stalled if CRC engine is
//! busy computing CRC
//!
//! \return None.
//
//*****************************************************************************
extern void
GCRC_writeData(uint32_t base, uint32_t data, uint32_t dataSize);
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif
#endif // GCRC_H