1 /*
2 * Copyright 2019-2020 NXP
3 * All rights reserved.
4 *
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8
9 #ifndef _FSL_XECC_H_
10 #define _FSL_XECC_H_
11
12 #include "fsl_common.h"
13
14 /*!
15 * @addtogroup xecc
16 * @{
17 */
18
19 /******************************************************************************
20 * Definitions.
21 *****************************************************************************/
22
23 /*! @name Driver version */
24 /*@{*/
25 /*! @brief Driver version 2.0.0. */
26 #define FSL_XECC_DRIVER_VERSION (MAKE_VERSION(2U, 0U, 0U))
27 /*@}*/
28
29 /*!
30 * @brief XECC interrupt configuration structure, , xecc_interrupt_enable_t.
31 *
32 * This structure contains the settings for all of the XECC interrupt configurations.
33 */
34 enum
35 {
36 kXECC_SingleErrorInterruptEnable = XECC_ERR_SIG_EN_SINGLE_ERR_SIG_EN_MASK, /*!< Single bit error interrupt enable*/
37 kXECC_MultiErrorInterruptEnable = XECC_ERR_SIG_EN_MULTI_ERR_SIG_EN_MASK, /*!< Multiple bit error interrupt enable*/
38
39 kXECC_AllInterruptsEnable =
40 XECC_ERR_SIG_EN_SINGLE_ERR_SIG_EN_MASK | XECC_ERR_SIG_EN_MULTI_ERR_SIG_EN_MASK, /*!< all interrupts enable */
41 };
42
43 /*!
44 * @brief XECC interrupt status configuration structure, xecc_interrupt_status_enable_t.
45 *
46 * This structure contains the settings for all of the XECC interrupt status configurations.
47 */
48 enum
49 {
50 kXECC_SingleErrorInterruptStatusEnable =
51 XECC_ERR_STAT_EN_SINGLE_ERR_STAT_EN_MASK, /*!< Single bit error interrupt status enable*/
52 kXECC_MultiErrorInterruptStatusEnable =
53 XECC_ERR_STAT_EN_MULIT_ERR_STAT_EN_MASK, /*!< Multiple bits error interrupt status enable*/
54
55 kXECC_AllInterruptsStatusEnable = XECC_ERR_STAT_EN_SINGLE_ERR_STAT_EN_MASK |
56 XECC_ERR_STAT_EN_MULIT_ERR_STAT_EN_MASK, /*!< all interrupts enable */
57 };
58
59 /*!
60 * @brief XECC status flags, xecc_interrupt_status_t.
61 *
62 * This provides constants for the XECC status flags for use in the XECC functions.
63 */
64 enum
65 {
66 kXECC_SingleErrorInterruptFlag =
67 XECC_ERR_STATUS_SINGLE_ERR_MASK, /*!< Single bit error interrupt happens on read data*/
68 kXECC_MultiErrorInterruptFlag =
69 XECC_ERR_STATUS_MULTI_ERR_MASK, /*!< Multiple bits error interrupt happens on read data*/
70
71 kXECC_AllInterruptsFlag =
72 XECC_ERR_STATUS_SINGLE_ERR_MASK | XECC_ERR_STATUS_MULTI_ERR_MASK, /*!< all interrupts happens on read data*/
73 };
74
75 /*! @brief XECC user configuration.*/
76 typedef struct _xecc_config
77 {
78 bool enableXECC; /*!< Enable the XECC function. */
79 bool enableWriteECC; /*!< Enable write ECC function. */
80 bool enableReadECC; /*!< Enable read ECC function. */
81 bool enableSwap; /*!< Enable swap function. */
82
83 /*!< The minimum ECC region range is 4k, so the lower 12 bits of this register must be 0.*/
84 uint32_t Region0BaseAddress; /*!< ECC region 0 base address. */
85 uint32_t Region0EndAddress; /*!< ECC region 0 end address. */
86 uint32_t Region1BaseAddress; /*!< ECC region 1 base address. */
87 uint32_t Region1EndAddress; /*!< ECC region 1 end address. */
88 uint32_t Region2BaseAddress; /*!< ECC region 2 base address. */
89 uint32_t Region2EndAddress; /*!< ECC region 2 end address. */
90 uint32_t Region3BaseAddress; /*!< ECC region 3 base address. */
91 uint32_t Region3EndAddress; /*!< ECC region 3 end address. */
92 } xecc_config_t;
93
94 /*! @brief XECC single error information, including single error address, ECC code, error data, error bit
95 * position and error bit field */
96 typedef struct _xecc_single_error_info
97 {
98 uint32_t singleErrorAddress; /*!< Single error address */
99 uint32_t singleErrorData; /*!< Single error read data */
100 uint32_t singleErrorEccCode; /*!< Single error ECC code */
101 uint32_t singleErrorBitPos; /*!< Single error bit postion */
102 uint32_t singleErrorBitField; /*!< Single error bit field */
103 } xecc_single_error_info_t;
104
105 /*! @brief XECC multiple error information, including multiple error address, ECC code, error data and error bit field
106 */
107 typedef struct _xecc_multi_error_info
108 {
109 uint32_t multiErrorAddress; /*!< Multiple error address */
110 uint32_t multiErrorData; /*!< Multiple error read data */
111 uint32_t multiErrorEccCode; /*!< Multiple error ECC code */
112 uint32_t multiErrorBitField; /*!< Single error bit field */
113 } xecc_multi_error_info_t;
114
115 /*******************************************************************************
116 * APIs
117 ******************************************************************************/
118
119 #if defined(__cplusplus)
120 extern "C" {
121 #endif
122
123 /*!
124 * @name Initialization and deinitialization
125 * @{
126 */
127
128 /*!
129 * @brief XECC module initialization function.
130 *
131 * @param base XECC base address.
132 * @param config pointer to the XECC configuration structure.
133 */
134 void XECC_Init(XECC_Type *base, const xecc_config_t *config);
135
136 /*!
137 * @brief Deinitializes the XECC.
138 *
139 * @param base XECC base address.
140 */
141 void XECC_Deinit(XECC_Type *base);
142
143 /*!
144 * @brief Sets the XECC configuration structure to default values.
145 *
146 * @param config pointer to the XECC configuration structure.
147 */
148 void XECC_GetDefaultConfig(xecc_config_t *config);
149
150 /* @} */
151
152 /*!
153 * @name Status
154 * @{
155 */
156 /*!
157 * @brief Gets XECC status flags.
158 *
159 * @param base XECC peripheral base address.
160 * @return XECC status flags.
161 */
XECC_GetStatusFlags(XECC_Type * base)162 static inline uint32_t XECC_GetStatusFlags(XECC_Type *base)
163 {
164 return base->ERR_STATUS & (uint32_t)kXECC_AllInterruptsFlag;
165 }
166
167 /*!
168 * @brief XECC module clear interrupt status.
169 *
170 * @param base XECC base address.
171 * @param mask status to clear from xecc_interrupt_status_t.
172 */
XECC_ClearStatusFlags(XECC_Type * base,uint32_t mask)173 static inline void XECC_ClearStatusFlags(XECC_Type *base, uint32_t mask)
174 {
175 base->ERR_STATUS = mask;
176 }
177
178 /*!
179 * @brief XECC module enable interrupt status.
180 *
181 * @param base XECC base address.
182 * @param mask status to enable from xecc_interrupt_status_enable_t.
183 */
XECC_EnableInterruptStatus(XECC_Type * base,uint32_t mask)184 static inline void XECC_EnableInterruptStatus(XECC_Type *base, uint32_t mask)
185 {
186 base->ERR_STAT_EN |= mask;
187 }
188
189 /*!
190 * @brief XECC module disable interrupt status.
191 *
192 * @param base XECC base address.
193 * @param mask status to disable from xecc_interrupt_status_enable_t.
194 */
XECC_DisableInterruptStatus(XECC_Type * base,uint32_t mask)195 static inline void XECC_DisableInterruptStatus(XECC_Type *base, uint32_t mask)
196 {
197 base->ERR_STAT_EN &= ~mask;
198 }
199
200 /* @} */
201
202 /*!
203 * @name Interrupts
204 * @{
205 */
206
207 /*!
208 * @brief XECC module enable interrupt.
209 *
210 * @param base XECC base address.
211 * @param mask The interrupts to enable from xecc_interrupt_enable_t.
212 */
XECC_EnableInterrupts(XECC_Type * base,uint32_t mask)213 static inline void XECC_EnableInterrupts(XECC_Type *base, uint32_t mask)
214 {
215 base->ERR_SIG_EN |= mask;
216 }
217
218 /*!
219 * @brief XECC module disable interrupt.
220 *
221 * @param base XECC base address.
222 * @param mask The interrupts to disable from xecc_interrupt_enable_t.
223 */
XECC_DisableInterrupts(XECC_Type * base,uint32_t mask)224 static inline void XECC_DisableInterrupts(XECC_Type *base, uint32_t mask)
225 {
226 base->ERR_SIG_EN &= ~mask;
227 }
228 /* @} */
229
230 /*!
231 * @name functional
232 * @{
233 */
234 /*!
235 * @brief XECC module write ECC function enable.
236 *
237 * @param base XECC base address.
238 * @param enable enable or disable.
239 */
XECC_WriteECCEnable(XECC_Type * base,bool enable)240 static inline void XECC_WriteECCEnable(XECC_Type *base, bool enable)
241 {
242 if (enable)
243 {
244 base->ECC_CTRL |= XECC_ECC_CTRL_WECC_EN(1);
245 }
246 else
247 {
248 base->ECC_CTRL |= XECC_ECC_CTRL_WECC_EN(0);
249 }
250 }
251
252 /*!
253 * @brief XECC module read ECC function enable.
254 *
255 * @param base XECC base address.
256 * @param enable enable or disable.
257 */
XECC_ReadECCEnable(XECC_Type * base,bool enable)258 static inline void XECC_ReadECCEnable(XECC_Type *base, bool enable)
259 {
260 if (enable)
261 {
262 base->ECC_CTRL |= XECC_ECC_CTRL_RECC_EN(1);
263 }
264 else
265 {
266 base->ECC_CTRL |= XECC_ECC_CTRL_RECC_EN(0);
267 }
268 }
269
270 /*!
271 * @brief XECC module swap data enable.
272 *
273 * @param base XECC base address.
274 * @param enable enable or disable.
275 */
XECC_SwapECCEnable(XECC_Type * base,bool enable)276 static inline void XECC_SwapECCEnable(XECC_Type *base, bool enable)
277 {
278 if (enable)
279 {
280 base->ECC_CTRL |= XECC_ECC_CTRL_SWAP_EN(1);
281 }
282 else
283 {
284 base->ECC_CTRL |= XECC_ECC_CTRL_SWAP_EN(0);
285 }
286 }
287
288 /*!
289 * @brief XECC module error injection.
290 *
291 * @param base XECC base address.
292 * @param errordata error data.
293 * @param erroreccdata ecc code.
294 * @retval kStatus_Success.
295 */
296 status_t XECC_ErrorInjection(XECC_Type *base, uint32_t errordata, uint8_t erroreccdata);
297
298 /*!
299 * @brief XECC module get single error information.
300 *
301 * @param base XECC base address.
302 * @param info single error information.
303 */
304 void XECC_GetSingleErrorInfo(XECC_Type *base, xecc_single_error_info_t *info);
305
306 /*!
307 * @brief XECC module get multiple error information.
308 *
309 * @param base XECC base address.
310 * @param info multiple error information.
311 */
312 void XECC_GetMultiErrorInfo(XECC_Type *base, xecc_multi_error_info_t *info);
313
314 /*! @}*/
315
316 #if defined(__cplusplus)
317 }
318 #endif
319
320 /*! @}*/
321
322 #endif
323