summaryrefslogtreecommitdiffstats
path: root/bsps/arm/imxrt/mcux-sdk/drivers/xecc/fsl_xecc.h
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/arm/imxrt/mcux-sdk/drivers/xecc/fsl_xecc.h')
-rw-r--r--bsps/arm/imxrt/mcux-sdk/drivers/xecc/fsl_xecc.h322
1 files changed, 322 insertions, 0 deletions
diff --git a/bsps/arm/imxrt/mcux-sdk/drivers/xecc/fsl_xecc.h b/bsps/arm/imxrt/mcux-sdk/drivers/xecc/fsl_xecc.h
new file mode 100644
index 0000000000..21b2226596
--- /dev/null
+++ b/bsps/arm/imxrt/mcux-sdk/drivers/xecc/fsl_xecc.h
@@ -0,0 +1,322 @@
+/*
+ * Copyright 2019-2020 NXP
+ * All rights reserved.
+ *
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef _FSL_XECC_H_
+#define _FSL_XECC_H_
+
+#include "fsl_common.h"
+
+/*!
+ * @addtogroup xecc
+ * @{
+ */
+
+/******************************************************************************
+ * Definitions.
+ *****************************************************************************/
+
+/*! @name Driver version */
+/*@{*/
+/*! @brief Driver version 2.0.0. */
+#define FSL_XECC_DRIVER_VERSION (MAKE_VERSION(2U, 0U, 0U))
+/*@}*/
+
+/*!
+ * @brief XECC interrupt configuration structure, , xecc_interrupt_enable_t.
+ *
+ * This structure contains the settings for all of the XECC interrupt configurations.
+ */
+enum
+{
+ kXECC_SingleErrorInterruptEnable = XECC_ERR_SIG_EN_SINGLE_ERR_SIG_EN_MASK, /*!< Single bit error interrupt enable*/
+ kXECC_MultiErrorInterruptEnable = XECC_ERR_SIG_EN_MULTI_ERR_SIG_EN_MASK, /*!< Multiple bit error interrupt enable*/
+
+ kXECC_AllInterruptsEnable =
+ XECC_ERR_SIG_EN_SINGLE_ERR_SIG_EN_MASK | XECC_ERR_SIG_EN_MULTI_ERR_SIG_EN_MASK, /*!< all interrupts enable */
+};
+
+/*!
+ * @brief XECC interrupt status configuration structure, xecc_interrupt_status_enable_t.
+ *
+ * This structure contains the settings for all of the XECC interrupt status configurations.
+ */
+enum
+{
+ kXECC_SingleErrorInterruptStatusEnable =
+ XECC_ERR_STAT_EN_SINGLE_ERR_STAT_EN_MASK, /*!< Single bit error interrupt status enable*/
+ kXECC_MultiErrorInterruptStatusEnable =
+ XECC_ERR_STAT_EN_MULIT_ERR_STAT_EN_MASK, /*!< Multiple bits error interrupt status enable*/
+
+ kXECC_AllInterruptsStatusEnable = XECC_ERR_STAT_EN_SINGLE_ERR_STAT_EN_MASK |
+ XECC_ERR_STAT_EN_MULIT_ERR_STAT_EN_MASK, /*!< all interrupts enable */
+};
+
+/*!
+ * @brief XECC status flags, xecc_interrupt_status_t.
+ *
+ * This provides constants for the XECC status flags for use in the XECC functions.
+ */
+enum
+{
+ kXECC_SingleErrorInterruptFlag =
+ XECC_ERR_STATUS_SINGLE_ERR_MASK, /*!< Single bit error interrupt happens on read data*/
+ kXECC_MultiErrorInterruptFlag =
+ XECC_ERR_STATUS_MULTI_ERR_MASK, /*!< Multiple bits error interrupt happens on read data*/
+
+ kXECC_AllInterruptsFlag =
+ XECC_ERR_STATUS_SINGLE_ERR_MASK | XECC_ERR_STATUS_MULTI_ERR_MASK, /*!< all interrupts happens on read data*/
+};
+
+/*! @brief XECC user configuration.*/
+typedef struct _xecc_config
+{
+ bool enableXECC; /*!< Enable the XECC function. */
+ bool enableWriteECC; /*!< Enable write ECC function. */
+ bool enableReadECC; /*!< Enable read ECC function. */
+ bool enableSwap; /*!< Enable swap function. */
+
+ /*!< The minimum ECC region range is 4k, so the lower 12 bits of this register must be 0.*/
+ uint32_t Region0BaseAddress; /*!< ECC region 0 base address. */
+ uint32_t Region0EndAddress; /*!< ECC region 0 end address. */
+ uint32_t Region1BaseAddress; /*!< ECC region 1 base address. */
+ uint32_t Region1EndAddress; /*!< ECC region 1 end address. */
+ uint32_t Region2BaseAddress; /*!< ECC region 2 base address. */
+ uint32_t Region2EndAddress; /*!< ECC region 2 end address. */
+ uint32_t Region3BaseAddress; /*!< ECC region 3 base address. */
+ uint32_t Region3EndAddress; /*!< ECC region 3 end address. */
+} xecc_config_t;
+
+/*! @brief XECC single error information, including single error address, ECC code, error data, error bit
+ * position and error bit field */
+typedef struct _xecc_single_error_info
+{
+ uint32_t singleErrorAddress; /*!< Single error address */
+ uint32_t singleErrorData; /*!< Single error read data */
+ uint32_t singleErrorEccCode; /*!< Single error ECC code */
+ uint32_t singleErrorBitPos; /*!< Single error bit postion */
+ uint32_t singleErrorBitField; /*!< Single error bit field */
+} xecc_single_error_info_t;
+
+/*! @brief XECC multiple error information, including multiple error address, ECC code, error data and error bit field
+ */
+typedef struct _xecc_multi_error_info
+{
+ uint32_t multiErrorAddress; /*!< Multiple error address */
+ uint32_t multiErrorData; /*!< Multiple error read data */
+ uint32_t multiErrorEccCode; /*!< Multiple error ECC code */
+ uint32_t multiErrorBitField; /*!< Single error bit field */
+} xecc_multi_error_info_t;
+
+/*******************************************************************************
+ * APIs
+ ******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/*!
+ * @name Initialization and deinitialization
+ * @{
+ */
+
+/*!
+ * @brief XECC module initialization function.
+ *
+ * @param base XECC base address.
+ * @param config pointer to the XECC configuration structure.
+ */
+void XECC_Init(XECC_Type *base, const xecc_config_t *config);
+
+/*!
+ * @brief Deinitializes the XECC.
+ *
+ * @param base XECC base address.
+ */
+void XECC_Deinit(XECC_Type *base);
+
+/*!
+ * @brief Sets the XECC configuration structure to default values.
+ *
+ * @param config pointer to the XECC configuration structure.
+ */
+void XECC_GetDefaultConfig(xecc_config_t *config);
+
+/* @} */
+
+/*!
+ * @name Status
+ * @{
+ */
+/*!
+ * @brief Gets XECC status flags.
+ *
+ * @param base XECC peripheral base address.
+ * @return XECC status flags.
+ */
+static inline uint32_t XECC_GetStatusFlags(XECC_Type *base)
+{
+ return base->ERR_STATUS & (uint32_t)kXECC_AllInterruptsFlag;
+}
+
+/*!
+ * @brief XECC module clear interrupt status.
+ *
+ * @param base XECC base address.
+ * @param mask status to clear from xecc_interrupt_status_t.
+ */
+static inline void XECC_ClearStatusFlags(XECC_Type *base, uint32_t mask)
+{
+ base->ERR_STATUS = mask;
+}
+
+/*!
+ * @brief XECC module enable interrupt status.
+ *
+ * @param base XECC base address.
+ * @param mask status to enable from xecc_interrupt_status_enable_t.
+ */
+static inline void XECC_EnableInterruptStatus(XECC_Type *base, uint32_t mask)
+{
+ base->ERR_STAT_EN |= mask;
+}
+
+/*!
+ * @brief XECC module disable interrupt status.
+ *
+ * @param base XECC base address.
+ * @param mask status to disable from xecc_interrupt_status_enable_t.
+ */
+static inline void XECC_DisableInterruptStatus(XECC_Type *base, uint32_t mask)
+{
+ base->ERR_STAT_EN &= ~mask;
+}
+
+/* @} */
+
+/*!
+ * @name Interrupts
+ * @{
+ */
+
+/*!
+ * @brief XECC module enable interrupt.
+ *
+ * @param base XECC base address.
+ * @param mask The interrupts to enable from xecc_interrupt_enable_t.
+ */
+static inline void XECC_EnableInterrupts(XECC_Type *base, uint32_t mask)
+{
+ base->ERR_SIG_EN |= mask;
+}
+
+/*!
+ * @brief XECC module disable interrupt.
+ *
+ * @param base XECC base address.
+ * @param mask The interrupts to disable from xecc_interrupt_enable_t.
+ */
+static inline void XECC_DisableInterrupts(XECC_Type *base, uint32_t mask)
+{
+ base->ERR_SIG_EN &= ~mask;
+}
+/* @} */
+
+/*!
+ * @name functional
+ * @{
+ */
+/*!
+ * @brief XECC module write ECC function enable.
+ *
+ * @param base XECC base address.
+ * @param enable enable or disable.
+ */
+static inline void XECC_WriteECCEnable(XECC_Type *base, bool enable)
+{
+ if (enable)
+ {
+ base->ECC_CTRL |= XECC_ECC_CTRL_WECC_EN(1);
+ }
+ else
+ {
+ base->ECC_CTRL |= XECC_ECC_CTRL_WECC_EN(0);
+ }
+}
+
+/*!
+ * @brief XECC module read ECC function enable.
+ *
+ * @param base XECC base address.
+ * @param enable enable or disable.
+ */
+static inline void XECC_ReadECCEnable(XECC_Type *base, bool enable)
+{
+ if (enable)
+ {
+ base->ECC_CTRL |= XECC_ECC_CTRL_RECC_EN(1);
+ }
+ else
+ {
+ base->ECC_CTRL |= XECC_ECC_CTRL_RECC_EN(0);
+ }
+}
+
+/*!
+ * @brief XECC module swap data enable.
+ *
+ * @param base XECC base address.
+ * @param enable enable or disable.
+ */
+static inline void XECC_SwapECCEnable(XECC_Type *base, bool enable)
+{
+ if (enable)
+ {
+ base->ECC_CTRL |= XECC_ECC_CTRL_SWAP_EN(1);
+ }
+ else
+ {
+ base->ECC_CTRL |= XECC_ECC_CTRL_SWAP_EN(0);
+ }
+}
+
+/*!
+ * @brief XECC module error injection.
+ *
+ * @param base XECC base address.
+ * @param errordata error data.
+ * @param erroreccdata ecc code.
+ * @retval kStatus_Success.
+ */
+status_t XECC_ErrorInjection(XECC_Type *base, uint32_t errordata, uint8_t erroreccdata);
+
+/*!
+ * @brief XECC module get single error information.
+ *
+ * @param base XECC base address.
+ * @param info single error information.
+ */
+void XECC_GetSingleErrorInfo(XECC_Type *base, xecc_single_error_info_t *info);
+
+/*!
+ * @brief XECC module get multiple error information.
+ *
+ * @param base XECC base address.
+ * @param info multiple error information.
+ */
+void XECC_GetMultiErrorInfo(XECC_Type *base, xecc_multi_error_info_t *info);
+
+/*! @}*/
+
+#if defined(__cplusplus)
+}
+#endif
+
+/*! @}*/
+
+#endif