MotorControlModuleSDFM_TMS3.../Projects/mem_test/device/driverlib/bgcrc.h

954 lines
29 KiB
C
Raw Normal View History

//###########################################################################
//
// FILE: bgcrc.h
//
// TITLE: C28x BGCRC driver.
//
//###########################################################################
// $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 BGCRC_H
#define BGCRC_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 bgcrc_api BGCRC
//! \brief This module is used for configuring BGCRC.
//! @{
//
//*****************************************************************************
#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_bgcrc.h"
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "debug.h"
#include "cpu.h"
//*****************************************************************************
//
//! Values that can be passed to BGCRC_setConfig() as the \e nmiConfig
//! parameter
//
//*****************************************************************************
#define BGCRC_NMI_ENABLE 0x5U //!< Generate NMI on memory check failure
#define BGCRC_NMI_DISABLE 0xAU //!< Do not generate NMI on memory check
//!<failure
//*****************************************************************************
//
//! Values that can be passed to BGCRC_setConfig() as the \e emuCtrl parameter
//
//*****************************************************************************
#define BGCRC_EMUCTRL_SOFT 0x00U //!< CRC module and CRC watchdog stops
//!< immediately on DEBUG SUSPEND
#define BGCRC_EMUCTRL_FREE 0x10U //!< CRC calculation and CRC watchdog is
//!< not affected by DEBUG HALT
//*****************************************************************************
//
//! Values that can be passed to BGCRC_setRegion() as the \e mode parameter
//
//*****************************************************************************
#define BGCRC_SCRUB_MODE 0xAU //!< CRC of data is not compared with the
//!< golden CRC. Error check is done using
//!< the ECC/Parity logic.
#define BGCRC_CRC_MODE 0x5U //!< CRC value is compared with golden CRC
//!< at the end in addition to the data
//!< correctness check by ECC/Parity logic
//*****************************************************************************
//
//! Values that can be passed to all interrupt/NMI functions as \e intflags or
//! \e nmiflags parameter
//
//*****************************************************************************
#define BGCRC_GLOBAL_INT 0x01U //!< Global Interrupt
#define BGCRC_TEST_DONE 0x02U //!< Test done interrupt
#define BGCRC_CRC_FAIL 0x04U //!< CRC Fail Interrupt/NMI
#define BGCRC_UNCORR_ERR 0x08U //!< Uncorrectable Error Interrupt/NMI
#define BGCRC_CORR_ERR 0x10U //!< Correctable Error Interrupt/NMI
#define BGCRC_WD_UNDERFLOW 0x20U //!< Watchdog Underflow Error Interrupt/NMI
#define BGCRC_WD_OVERFLOW 0x40U //!< Watchdog Overflow Error Interrupt/NMI
#define BGCRC_ALL_ERROR_FLAGS (BGCRC_CRC_FAIL | BGCRC_UNCORR_ERR | \
BGCRC_CORR_ERR | BGCRC_WD_UNDERFLOW | \
BGCRC_WD_OVERFLOW)
//*****************************************************************************
//
//! Values that can be passed to BGCRC_setRegion as the \e blockSize parameter
//! For example, to configure a region of size 2.5KB, set \e blockSize as
//! BGCRC_SIZE_KBYTES(2) + BGCRC_SIZE_BYTES_512
//
//*****************************************************************************
#define BGCRC_SIZE_BYTES_0 0U
#define BGCRC_SIZE_BYTES_256 1U
#define BGCRC_SIZE_BYTES_512 2U
#define BGCRC_SIZE_BYTES_768 3U
#define BGCRC_SIZE_KBYTES(x) (4U * (x))
//*****************************************************************************
//
//! Values returned by the function BGCRC_getRunStatus
//
//*****************************************************************************
#define BGCRC_ACTIVE 0x80000000U
#define BGCRC_IDLE 0x00000000U
//*****************************************************************************
//
//! Values that can be passed to BGCRC_lockRegister(), BGCRC_unlockRegister()
//! and BGCRC_commitLockRegister() as the \e regs parameter
//!
//
//*****************************************************************************
#define BGCRC_REG_EN 0x00000001U
#define BGCRC_REG_CTRL1 0x00000002U
#define BGCRC_REG_CTRL2 0x00000004U
#define BGCRC_REG_START_ADDR 0x00000008U
#define BGCRC_REG_SEED 0x00000010U
#define BGCRC_REG_GOLDEN 0x00000080U
#define BGCRC_REG_WD_CFG 0x00004000U
#define BGCRC_REG_WD_MIN 0x00008000U
#define BGCRC_REG_WD_MAX 0x00010000U
#define BGCRC_REG_NMIFRC 0x00800000U
#define BGCRC_REG_INTEN 0x04000000U
#define BGCRC_REG_INTFRC 0x20000000U
#define BGCRC_REG_ALL 0xFFFFFFFFU
//*****************************************************************************
//
//! Values that are used by the BGCRC APIs
//
//*****************************************************************************
#define BGCRC_WD_ENABLE 0x5UL
#define BGCRC_WD_DISABLE 0xAUL
#define BGCRC_START_KEY 0xAUL
#define BGCRC_HALT_KEY 0xAUL
//*****************************************************************************
//
// Prototypes for the APIs.
//
//*****************************************************************************
//*****************************************************************************
//
//! \internal
//! Checks an BGCRC base address.
//!
//! \param base is the BGCRC module base address.
//!
//! This function determines if a BGCRC module base address is valid.
//!
//! \return Returns \b true if the base address is valid and \b false
//! otherwise.
//
//*****************************************************************************
#ifdef DEBUG
static inline bool
BGCRC_isBaseValid(uint32_t base)
{
return(
(base == BGCRC_CPU_BASE) ||
(base == BGCRC_CLA1_BASE)
);
}
#endif
//*****************************************************************************
//
//! Sets the NMI and emulation control configurations
//!
//! \param base is the BGCRC module base address.
//! \param nmiConfig specifies whether NMI needs to be enabled or not for
//! memory check failure
//! \param emuCtrl specifies the behaviour of CRC during emulation
//!
//! This function configures the NMI and emulation control configurations for
//! the BGCRC module.
//!
//! \e nmiConfig can take values \b BGCRC_NMI_ENABLE or \b BGCRC_NMI_DISABLE.
//! NMI is enabled by default for the memory check failures.
//!
//! \e emuCtrl can take values \b BGCRC_EMUCTRL_FREE or \b BGCRC_EMUCTRL_SOFT.
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_setConfig(uint32_t base, uint32_t nmiConfig, uint32_t emuCtrl)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
ASSERT((nmiConfig == BGCRC_NMI_ENABLE) || (nmiConfig == BGCRC_NMI_DISABLE));
ASSERT((emuCtrl == BGCRC_EMUCTRL_FREE) || (emuCtrl == BGCRC_EMUCTRL_SOFT));
//
// Set emulation control and NMI configuration
//
EALLOW;
HWREG(base + BGCRC_O_CTRL1) = (nmiConfig << BGCRC_CTRL1_NMIDIS_S) | emuCtrl;
EDIS;
}
//*****************************************************************************
//
//! Enables the watchdog
//!
//! \param base is the BGCRC module base address.
//!
//! This function enables the BGCRC watchdog timer. The counter is started
//! when the BGCRC test starts
//!
//! \note The watchDog window can be configured using the function
//! BGCRC_setWatchdogWindow()
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_enableWatchdog(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
//
// Enable watchdog
//
EALLOW;
HWREG(base + BGCRC_O_WD_CFG) = BGCRC_WD_ENABLE;
EDIS;
}
//*****************************************************************************
//
//! Disables the watchdog
//!
//! \param base is the BGCRC module base address.
//!
//! This function disables the BGCRC watchdog.
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_disableWatchdog(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
//
// Disable watchdog
//
EALLOW;
HWREG(base + BGCRC_O_WD_CFG) = BGCRC_WD_DISABLE;
EDIS;
}
//*****************************************************************************
//
//! Configures the BGCRC watchdog window
//!
//! \param base is the BGCRC module base address.
//! \param min is minimum value configuration for the windowed watchdog
//! \param max is maximum value configuration for the windowed watchdog
//!
//! This function configures the BGCRC windowed watchdog
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_setWatchdogWindow(uint32_t base, uint32_t min, uint32_t max)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
ASSERT(max > min);
//
// Set the min and max values
//
EALLOW;
HWREG(base + BGCRC_O_WD_MIN) = min;
HWREG(base + BGCRC_O_WD_MAX) = max;
EDIS;
}
//*****************************************************************************
//
//! Configures the memory region for check
//!
//! \param base is the BGCRC module base address.
//! \param startAddr is the start address of the block
//! \param blockSize is the size of the block
//! \param mode is the BGCRC test mode
//!
//! This function configures the memory region to be checked
//!
//! \e blockSize can take values \b BGCRC_SIZE_KBYTES(x) and/or
//! \b BGCRC_SIZE_BYTES_x. For example, to configure a region of size 2.5KB,
//! set \e blockSize as BGCRC_SIZE_KBYTES(2) + BGCRC_SIZE_BYTES_512
//!
//! \e mode can take values \b BGCRC_SCRUB_MODE or \b BGCRC_CRC_MODE. In Scrub
//! mode, CRC of data is not compared with the golden CRC. Error check is done
//! using the ECC/Parity logic. In CRC mode, value is compared with golden CRC
//! at the end in addition to the data correctness check by ECC/Parity logic.
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_setRegion(uint32_t base, uint32_t startAddr,
uint32_t blockSize, uint32_t mode)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
ASSERT((blockSize > BGCRC_SIZE_BYTES_0) &&
(blockSize <= BGCRC_SIZE_KBYTES(256U)));
ASSERT((mode == BGCRC_SCRUB_MODE) || (mode == BGCRC_CRC_MODE));
//
// Set the start address and size of the block. Set the mode of operation
//
EALLOW;
HWREG(base + BGCRC_O_START_ADDR) = startAddr;
HWREG(base + BGCRC_O_CTRL2) =
((blockSize - 1U) << BGCRC_CTRL2_BLOCK_SIZE_S) |
(mode << BGCRC_CTRL2_SCRUB_MODE_S);
EDIS;
}
//*****************************************************************************
//
//! Gets the BGCRC watchdog counter value
//!
//! \param base is the BGCRC module base address.
//!
//! This function returns the BGCRC watchdog counter value
//!
//! \return Watchdog counter value.
//
//*****************************************************************************
static inline uint32_t
BGCRC_getWatchdogCounterValue(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
return(HWREG(base + BGCRC_O_WD_CNT));
}
//*****************************************************************************
//
//! Enables individual BGCRC interrupt sources
//!
//! \param base is the BGCRC module base address.
//! \param intFlags is the bit mask of the interrupt sources to be disabled.
//!
//! This function enables the indicated BGCRC interrupt sources. Only the
//! sources that are enabled can be reflected to the processor interrupt,
//! disabled sources have no effect on the processor.
//!
//! The \e intFlags parameter is the logical OR of any of the following:
//!
//! - \b BGCRC_TEST_DONE - Test done interrupt
//! - \b BGCRC_CRC_FAIL - CRC Fail Interrupt
//! - \b BGCRC_UNCORR_ERR - Uncorrectable Error Interrupt
//! - \b BGCRC_CORR_ERR - Correctable Error Interrupt
//! - \b BGCRC_WD_UNDERFLOW - Watchdog Underflow Error Interrupt
//! - \b BGCRC_WD_OVERFLOW - Watchdog Overflow Error Interrupt
//!
//! \return None
//
//*****************************************************************************
static inline void
BGCRC_enableInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
ASSERT((intFlags & (BGCRC_TEST_DONE | BGCRC_ALL_ERROR_FLAGS)) == intFlags);
EALLOW;
HWREG(base + BGCRC_O_INTEN) |= intFlags;
EDIS;
}
//*****************************************************************************
//
//! Disables individual BGCRC interrupt sources.
//!
//! \param base is the BGCRC module base address.
//! \param intFlags is the bit mask of the interrupt sources to be disabled.
//!
//! This function disables the indicated BGCRC interrupt sources. Only the
//! sources that are enabled can be reflected to the processor interrupt
//! disabled sources have no effect on the processor.
//!
//! The \e intFlags parameter has the same definition as the
//! \e intFlags parameter to BGCRC_enableInterrupt().
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_disableInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
ASSERT((intFlags & (BGCRC_TEST_DONE | BGCRC_ALL_ERROR_FLAGS)) == intFlags);
EALLOW;
HWREG(base + BGCRC_O_INTEN) &= ~intFlags;
EDIS;
}
//*****************************************************************************
//
//! Gets the current BGCRC interrupt status
//!
//! \param base is the BGCRC module base address
//!
//! This function returns the status of the BGCRC interrupts
//!
//! \return The current interrupt status, which is a logical OR of any of the
//! following:
//!
//! - \b BGCRC_GLOBAL_INT - Global Interrupt
//! - \b BGCRC_TEST_DONE - Test done interrupt
//! - \b BGCRC_CRC_FAIL - CRC Fail Interrupt
//! - \b BGCRC_UNCORR_ERR - Uncorrectable Error Interrupt
//! - \b BGCRC_CORR_ERR - Correctable Error Interrupt
//! - \b BGCRC_WD_UNDERFLOW - Watchdog Underflow Error Interrupt
//! - \b BGCRC_WD_OVERFLOW - Watchdog Overflow Error Interrupt
//
//*****************************************************************************
static inline uint32_t
BGCRC_getInterruptStatus(uint32_t base)
{
return(HWREG(base + BGCRC_O_INTFLG));
}
//*****************************************************************************
//
//! Clears the BGCRC interrupt sources
//!
//! \param base is the BGCRC module base address
//! \param intFlags is a bit mask of the interrupt sources to be cleared.
//!
//! The specified BGCRC interrupt sources are cleared, so that they no longer
//! assert. This function must be called in the interrupt handler to keep the
//! interrupt from being triggered again immediately upon exit.
//!
//! The \e intFlags parameter has the same definition as the
//! \e intFlags parameter to BGCRC_getInterruptStatus().
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_clearInterruptStatus(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
ASSERT((intFlags & (BGCRC_GLOBAL_INT | BGCRC_TEST_DONE |
BGCRC_ALL_ERROR_FLAGS)) == intFlags);
EALLOW;
HWREG(base + BGCRC_O_INTCLR) = intFlags;
EDIS;
}
//*****************************************************************************
//
//! Force the BGCRC interrupt flag
//!
//! \param base is the BGCRC module base address
//! \param intFlags is a bit mask of the interrupt flags to be forced.
//!
//! This function forces the specified interrupt flags
//!
//! The \e intFlags parameter has the same definition as the
//! \e intFlags parameter to BGCRC_enableInterrupt().
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_forceInterrupt(uint32_t base, uint32_t intFlags)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
ASSERT((intFlags & (BGCRC_TEST_DONE | BGCRC_ALL_ERROR_FLAGS)) == intFlags);
EALLOW;
HWREG(base + BGCRC_O_INTFRC) = intFlags;
EDIS;
}
//*****************************************************************************
//
//! Gets the current BGCRC NMI status
//!
//! \param base is the BGCRC module base address
//!
//! This function returns the status of the BGCRC NMI flags
//!
//! \return The current NMI status, which is a logical OR of any of the
//! following:
//!
//! - \b BGCRC_CRC_FAIL - CRC Fail NMI
//! - \b BGCRC_UNCORR_ERR - Uncorrectable Error NMI
//! - \b BGCRC_CORR_ERR - Correctable Error NMI
//! - \b BGCRC_WD_UNDERFLOW - Watchdog Underflow Error NMI
//! - \b BGCRC_WD_OVERFLOW - Watchdog Overflow Error NMI
//
//*****************************************************************************
static inline uint32_t
BGCRC_getNMIStatus(uint32_t base)
{
return(HWREG(base + BGCRC_O_NMIFLG));
}
//*****************************************************************************
//
//! Clears the BGCRC NMI sources
//!
//! \param base is the BGCRC module base address
//! \param nmiFlags is a bit mask of the NMI sources to be cleared.
//!
//! The specified BGCRC NMI sources are cleared, so that they no longer
//! assert. This function must be called in the NMI handler to keep the
//! NMI from being triggered again immediately upon exit.
//!
//! The \e nmiFlags parameter has the same definition as the
//! \e nmiFlags parameter to BGCRC_getNMIStatus().
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_clearNMIStatus(uint32_t base, uint32_t nmiFlags)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
ASSERT((nmiFlags & BGCRC_ALL_ERROR_FLAGS) == nmiFlags);
EALLOW;
HWREG(base + BGCRC_O_NMICLR) = nmiFlags;
EDIS;
}
//*****************************************************************************
//
//! Force the BGCRC NMI flag
//!
//! \param base is the BGCRC module base address
//! \param nmiFlags is a bit mask of the NMI flags to be forced.
//!
//! This function forces the specified interrupt flags
//!
//! The \e nmiFlags parameter has the same definition as the
//! \e nmiFlags parameter to BGCRC_getNMIStatus().
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_forceNMI(uint32_t base, uint32_t nmiFlags)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
ASSERT((nmiFlags & BGCRC_ALL_ERROR_FLAGS) == nmiFlags);
EALLOW;
HWREG(base + BGCRC_O_NMIFRC) = nmiFlags;
EDIS;
}
//*****************************************************************************
//
//! Sets the golden CRC value
//!
//! \param base is the BGCRC module base address
//! \param crcVal is a golden CRC value to be programmed
//!
//! This function sets the golden CRC value of the memory block being tested.
//! If run in CRC mode, the calculated CRC value is compared with golden CRC
//! and status is updated.
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_setGoldenCRCValue(uint32_t base, uint32_t crcVal)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
EALLOW;
HWREG(base + BGCRC_O_GOLDEN) = crcVal;
EDIS;
}
//*****************************************************************************
//
//! Starts the module operation
//!
//! \param base is the BGCRC module base address
//!
//! This function starts the module operation. Calling this function during
//! the CRC calculation will reset and re-start the CRC calculation.
//! This also resets the watchdog timer.
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_start(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
EALLOW;
HWREG(base + BGCRC_O_EN) = BGCRC_START_KEY;
EDIS;
}
//*****************************************************************************
//
//! Halts the module operation
//!
//! \param base is the BGCRC module base address
//!
//! This function halts the module operation. This function does not stall the
//! watchdog timer.
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_halt(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
EALLOW;
HWREG(base + BGCRC_O_CTRL2) =
(HWREG(base + BGCRC_O_CTRL2) & ~BGCRC_CTRL2_TEST_HALT_M) |
(BGCRC_HALT_KEY << BGCRC_CTRL2_TEST_HALT_S);
EDIS;
}
//*****************************************************************************
//
//! Resumes the module operation
//!
//! \param base is the BGCRC module base address
//!
//! This function resumes the module operation. The CRC calculation will
//! continue/resume from where it was halted
//!
//! \return None.
//
//*****************************************************************************
static inline void
BGCRC_resume(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
EALLOW;
HWREG(base + BGCRC_O_CTRL2) &= ~BGCRC_CTRL2_TEST_HALT_M;
EDIS;
}
//*****************************************************************************
//
//! Gets the running status of the module
//!
//! \param base is the BGCRC module base address
//!
//! This function returns whether the module is in ACTIVE or IDLE state
//!
//! \return \b BGCRC_ACTIVE if CRC module is active,
//! \b BGCRC_IDLE if CRC module is idle
//
//*****************************************************************************
static inline uint32_t
BGCRC_getRunStatus(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
return(HWREG(base + BGCRC_O_EN) & BGCRC_EN_RUN_STS);
}
//*****************************************************************************
//
//! Sets the seed value for CRC calculations
//!
//! \param base is the BGCRC module base address
//! \param seed is the seed value to be set
//!
//! This function sets the seed value for the CRC calculations
//!
//! \return None
//
//*****************************************************************************
static inline void
BGCRC_setSeedValue(uint32_t base, uint32_t seed)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
EALLOW;
HWREG(base + BGCRC_O_SEED) = seed;
EDIS;
}
//*****************************************************************************
//
//! Gets the calculated CRC value
//!
//! \param base is the BGCRC module base address
//!
//! This function returns the calculated CRC value
//!
//! \return 32-bit CRC result
//
//*****************************************************************************
static inline uint32_t
BGCRC_getResult(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
return(HWREG(base + BGCRC_O_RESULT));
}
//*****************************************************************************
//
//! Gets the current address
//!
//! \param base is the BGCRC module base address
//!
//! This function returns the current address from where the data is fetched
//!
//! \return 32-bit address
//
//*****************************************************************************
static inline uint32_t
BGCRC_getCurrentAddress(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
return(HWREG(base + BGCRC_O_CURR_ADDR));
}
//*****************************************************************************
//
//! Locks the register configuration
//!
//! \param base is the BGCRC module base address
//! \param regs is the configuration registers to be locked
//!
//! This function locks the register configuration. The register once
//! locked, cannot be updated until the lock is removed
//!
//! The \e regs parameter is the logical OR of any of the following:
//!
//! - \b BGCRC_REG_EN
//! - \b BGCRC_REG_CTRL1
//! - \b BGCRC_REG_CTRL2
//! - \b BGCRC_REG_START_ADDR
//! - \b BGCRC_REG_SEED
//! - \b BGCRC_REG_GOLDEN
//! - \b BGCRC_REG_WD_CFG
//! - \b BGCRC_REG_WD_MIN
//! - \b BGCRC_REG_WD_MAX
//! - \b BGCRC_REG_NMIFRC
//! - \b BGCRC_REG_INTEN
//! - \b BGCRC_REG_INTFRC
//! - \b BGCRC_REG_ALL
//!
//! \return None
//
//*****************************************************************************
static inline void
BGCRC_lockRegister(uint32_t base, uint32_t regs)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
EALLOW;
HWREG(base + BGCRC_O_LOCK) |= regs;
EDIS;
}
//*****************************************************************************
//
//! Unlocks the register configuration
//!
//! \param base is the BGCRC module base address
//! \param regs is the configuration registers to be unlocked
//!
//! This function unlocks the register configuration.
//!
//! The \e regs parameter has the same definition as the \e regs parameter
//! to BGCRC_lockRegister().
//!
//! \return None
//
//*****************************************************************************
static inline void
BGCRC_unlockRegister(uint32_t base, uint32_t regs)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
EALLOW;
HWREG(base + BGCRC_O_LOCK) &= ~regs;
EDIS;
}
//*****************************************************************************
//
//! Commits the register configuration
//!
//! \param base is the BGCRC module base address
//! \param regs is the configuration registers to be unlocked
//!
//! This function commits the register configuration. Once configuration is
//! committed, only reset can change the configuration.
//!
//! The \e regs parameter has the same definition as the \e regs parameter
//! to BGCRC_lockRegister().
//!
//! \return None
//
//*****************************************************************************
static inline void
BGCRC_commitRegisterLock(uint32_t base, uint32_t regs)
{
//
// Check the arguments.
//
ASSERT(BGCRC_isBaseValid(base));
EALLOW;
HWREG(base + BGCRC_O_COMMIT) |= regs;
EDIS;
}
//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************
//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif
#endif // BGCRC_H