1 /**
2   ******************************************************************************
3   * @file    stm32h7rsxx_hal_ramecc.h
4   * @author  MCD Application Team
5   * @brief   Header file of RAMECC HAL module.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2022 STMicroelectronics.
10   * All rights reserved.
11   *
12   * This software is licensed under terms that can be found in the LICENSE file
13   * in the root directory of this software component.
14   * If no LICENSE file comes with this software, it is provided AS-IS.
15   *
16   ******************************************************************************
17   */
18 
19 /* Define to prevent recursive inclusion -------------------------------------*/
20 #ifndef STM32H7RSxx_HAL_RAMECC_H
21 #define STM32H7RSxx_HAL_RAMECC_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32h7rsxx_hal_def.h"
29 
30 /** @addtogroup STM32H7RSxx_HAL_Driver
31   * @{
32   */
33 
34 /** @addtogroup RAMECC
35   * @{
36   */
37 
38 /* Exported types ------------------------------------------------------------*/
39 
40 /** @defgroup RAMECC_Exported_Types RAMECC Exported Types
41   * @brief    RAMECC Exported Types
42   * @{
43   */
44 
45 /**
46   * @brief  HAL RAMECC State structures definition
47   */
48 typedef enum
49 {
50   HAL_RAMECC_STATE_RESET             = 0x00U,  /*!< RAMECC not yet initialized or disabled */
51   HAL_RAMECC_STATE_READY             = 0x01U,  /*!< RAMECC initialized and ready for use   */
52   HAL_RAMECC_STATE_BUSY              = 0x02U,  /*!< RAMECC process is ongoing              */
53   HAL_RAMECC_STATE_ERROR             = 0x03U,  /*!< RAMECC error state                     */
54 } HAL_RAMECC_StateTypeDef;
55 
56 #if (USE_HAL_RAMECC_REGISTER_CALLBACKS == 1)
57 /**
58   * @brief  HAL RAMECC Callbacks IDs Enumeration Definition
59   */
60 typedef enum
61 {
62   HAL_RAMECC_MSPINIT_CB_ID           = 0x00U,  /*!< RAMECC MSP Init Callback ID            */
63   HAL_RAMECC_MSPDEINIT_CB_ID         = 0x01U,  /*!< RAMECC MSP DeInit Callback ID          */
64   HAL_RAMECC_SE_DETECT_CB_ID         = 0x02U,  /*!< RAMECC Single Error Detect Callback ID */
65   HAL_RAMECC_DE_DETECT_CB_ID         = 0x03U,  /*!< RAMECC Double Error Detect Callback ID */
66   HAL_RAMECC_ALL_CB_ID               = 0x04U,  /*!< RAMECC All callback ID                 */
67 } HAL_RAMECC_CallbackIDTypeDef;
68 #endif /* USE_HAL_RAMECC_REGISTER_CALLBACKS */
69 
70 /**
71   * @brief  RAMECC handle Structure definition
72   */
73 
74 #if (USE_HAL_RAMECC_REGISTER_CALLBACKS == 1)
75 typedef struct __RAMECC_HandleTypeDef
76 #else
77 typedef struct
78 #endif /* (USE_HAL_RAMECC_REGISTER_CALLBACKS) */
79 {
80   RAMECC_MonitorTypeDef           *Instance;                                                            /*!< Register base address        */
81   __IO HAL_RAMECC_StateTypeDef    State;                                                                /*!< RAMECC state                 */
82   __IO uint32_t                   ErrorCode;                                                            /*!< RAMECC Error Code            */
83 #if (USE_HAL_RAMECC_REGISTER_CALLBACKS == 1)
84   void (* MspInitCallback)(struct __RAMECC_HandleTypeDef *hramecc);                                     /*!< RAMECC MSP Init Callback            */
85   void (* MspDeInitCallback)(struct __RAMECC_HandleTypeDef *hramecc);                                   /*!< RAMECC MSP DeInit Callback          */
86   void (* DetectSingleErrorCallback)(struct __RAMECC_HandleTypeDef *hramecc);                           /*!< RAMECC Single Error Detect Callback */
87   void (* DetectDoubleErrorCallback)(struct __RAMECC_HandleTypeDef *hramecc);                           /*!< RAMECC Double Error Detect Callback */
88 #endif  /* USE_HAL_RAMECC_REGISTER_CALLBACKS */
89 } RAMECC_HandleTypeDef;
90 
91 /**
92   * @}
93   */
94 
95 
96 /* Exported constants --------------------------------------------------------*/
97 
98 /** @defgroup RAMECC_Error_Codes RAMECC Error Codes
99   * @{
100   */
101 #define HAL_RAMECC_ERROR_NONE              0x00000000U  /*!< RAMECC No Error         */
102 #define HAL_RAMECC_ERROR_TIMEOUT           0x00000001U  /*!< RAMECC Timeout Error    */
103 #define HAL_RAMECC_ERROR_BUSY              0x00000002U  /*!< RAMECC Busy Error       */
104 #if (USE_HAL_RAMECC_REGISTER_CALLBACKS == 1)
105 #define HAL_RAMECC_ERROR_INVALID_CALLBACK  0x00000003U  /*!< Invalid Callback error  */
106 #endif  /* USE_HAL_RAMECC_REGISTER_CALLBACKS */
107 
108 /**
109   * @}
110   */
111 
112 /** @defgroup RAMECC_Interrupt RAMECC interrupts
113   * @{
114   */
115 #define RAMECC_IT_GLOBAL_ID                0x10000000UL
116 #define RAMECC_IT_MONITOR_ID               0x20000000UL
117 
118 #define RAMECC_IT_GLOBAL_ALL_ENABLE        (RAMECC_IT_GLOBAL_ID | RAMECC_IER_GIE)
119 #define RAMECC_IT_GLOBAL_SINGLEERR_R       (RAMECC_IT_GLOBAL_ID | RAMECC_IER_GECCSEIE)
120 #define RAMECC_IT_GLOBAL_DOUBLEERR_R       (RAMECC_IT_GLOBAL_ID | RAMECC_IER_GECCDEIE)
121 #define RAMECC_IT_GLOBAL_DOUBLEERR_W       (RAMECC_IT_GLOBAL_ID | RAMECC_IER_GECCDEBWIE)
122 
123 #define RAMECC_IT_MONITOR_SINGLEERR_R      (RAMECC_IT_MONITOR_ID | RAMECC_CR_ECCSEIE)
124 #define RAMECC_IT_MONITOR_DOUBLEERR_R      (RAMECC_IT_MONITOR_ID | RAMECC_CR_ECCDEIE)
125 #define RAMECC_IT_MONITOR_DOUBLEERR_W      (RAMECC_IT_MONITOR_ID | RAMECC_CR_ECCDEBWIE)
126 #define RAMECC_IT_MONITOR_ALL              (RAMECC_IT_MONITOR_ID | RAMECC_CR_ECCDEBWIE | RAMECC_CR_ECCDEIE | RAMECC_CR_ECCSEIE)
127 /**
128   * @}
129   */
130 
131 /** @defgroup RAMECC_FLAG RAMECC Monitor flags
132   * @{
133   */
134 #define RAMECC_FLAG_SINGLEERR_R            RAMECC_SR_SEDCF
135 #define RAMECC_FLAG_DOUBLEERR_R            RAMECC_SR_DEDF
136 #define RAMECC_FLAG_DOUBLEERR_W            RAMECC_SR_DEBWDF
137 #define RAMECC_FLAGS_ALL                   (RAMECC_SR_SEDCF | RAMECC_SR_DEDF | RAMECC_SR_DEBWDF)
138 
139 /**
140   * @}
141   */
142 
143 /* Exported macro ------------------------------------------------------------*/
144 /** @defgroup RAMECC_Exported_Macros RAMECC Exported Macros
145   * @{
146   */
147 
148 #define __HAL_RAMECC_ENABLE_GLOBAL_IT(__HANDLE__, __INTERRUPT__) ((((RAMECC_TypeDef *)((uint32_t)(__HANDLE__)->Instance & 0xFFFFFF00U))->IER) |= ((__INTERRUPT__) & ~RAMECC_IT_GLOBAL_ID))
149 #define __HAL_RAMECC_ENABLE_MONITOR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR |= ((__INTERRUPT__) & ~RAMECC_IT_MONITOR_ID))
150 
151 /**
152   * @brief  Enable the specified RAMECC interrupts.
153   * @param  __HANDLE__   : RAMECC handle.
154   * @param  __INTERRUPT__: specifies the RAMECC interrupt sources to be enabled.
155   *        This parameter can be one of the following values:
156   *           @arg RAMECC_IT_GLOBAL_ALL_ENABLE   : All Global ECC  interrupts enable.
157   *           @arg RAMECC_IT_GLOBAL_SINGLEERR_R  : Global ECC single error interrupt enable.
158   *           @arg RAMECC_IT_GLOBAL_DOUBLEERR_R  : Global ECC double error interrupt enable.
159   *           @arg RAMECC_IT_GLOBAL_DOUBLEERR_W  : Global ECC double error on byte write (BW) interrupt enable.
160   *           @arg RAMECC_IT_MONITOR_SINGLEERR_R : Monitor ECC single error interrupt enable.
161   *           @arg RAMECC_IT_MONITOR_DOUBLEERR_R : Monitor ECC double error interrupt enable.
162   *           @arg RAMECC_IT_MONITOR_DOUBLEERR_W : Monitor ECC double error on byte write (BW) interrupt enable.
163   *           @arg RAMECC_IT_MONITOR_ALL         : All Monitor ECC interrupts enable.
164   * @retval None
165   */
166 #define __HAL_RAMECC_ENABLE_IT(__HANDLE__, __INTERRUPT__) ( \
167 (IS_RAMECC_GLOBAL_INTERRUPT(__INTERRUPT__)) ? (__HAL_RAMECC_ENABLE_GLOBAL_IT((__HANDLE__), (__INTERRUPT__))) :\
168 (__HAL_RAMECC_ENABLE_MONITOR_IT((__HANDLE__), (__INTERRUPT__))))
169 
170 
171 #define __HAL_RAMECC_DISABLE_GLOBAL_IT(__HANDLE__, __INTERRUPT__) ((((RAMECC_TypeDef *)((uint32_t)(__HANDLE__)->Instance & 0xFFFFFF00U))->IER) &= ~((__INTERRUPT__) & ~RAMECC_IT_GLOBAL_ID))
172 #define __HAL_RAMECC_DISABLE_MONITOR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR &= ~((__INTERRUPT__) & ~RAMECC_IT_MONITOR_ID))
173 
174 /**
175   * @brief  Disable the specified RAMECC interrupts.
176   * @param  __HANDLE__   : RAMECC handle.
177   * @param  __INTERRUPT__: specifies the RAMECC interrupt sources to be disabled.
178   *        This parameter can be one of the following values:
179   *           @arg RAMECC_IT_GLOBAL_ALL_ENABLE   : All Global ECC  interrupts disable.
180   *           @arg RAMECC_IT_GLOBAL_SINGLEERR_R  : Global ECC single error interrupt disable.
181   *           @arg RAMECC_IT_GLOBAL_DOUBLEERR_R  : Global ECC double error interrupt disable.
182   *           @arg RAMECC_IT_GLOBAL_DOUBLEERR_W  : Global ECC double error on byte write (BW) interrupt disable.
183   *           @arg RAMECC_IT_MONITOR_SINGLEERR_R : Monitor ECC single error interrupt disable.
184   *           @arg RAMECC_IT_MONITOR_DOUBLEERR_R : Monitor ECC double error interrupt disable.
185   *           @arg RAMECC_IT_MONITOR_DOUBLEERR_W : Monitor ECC double error on byte write (BW) interrupt disable.
186   *           @arg RAMECC_IT_MONITOR_ALL         : All Monitor ECC interrupts disable.
187   * @retval None
188   */
189 #define __HAL_RAMECC_DISABLE_IT(__HANDLE__, __INTERRUPT__) ( \
190 (IS_RAMECC_GLOBAL_INTERRUPT(__INTERRUPT__)) ? (__HAL_RAMECC_DISABLE_GLOBAL_IT((__HANDLE__), (__INTERRUPT__))) :\
191 (__HAL_RAMECC_DISABLE_MONITOR_IT((__HANDLE__), (__INTERRUPT__))))
192 
193 
194 #define __HAL_RAMECC_GET_GLOBAL_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((((RAMECC_TypeDef *)((uint32_t)(__HANDLE__)->Instance & 0xFFFFFF00U))->IER) & ((__INTERRUPT__) & ~RAMECC_IT_GLOBAL_ID)) ? SET : RESET)
195 #define __HAL_RAMECC_GET_MONITOR_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR) & ((__INTERRUPT__) & ~RAMECC_IT_MONITOR_ID)) ? SET : RESET)
196 
197 /**
198   * @brief  Check whether the specified RAMECC interrupt source is enabled or not.
199   * @param  __HANDLE__    : Specifies the RAMECC Handle.
200   * @param  __INTERRUPT__ : Specifies the RAMECC interrupt source to check.
201   *          This parameter can be one of the following values:
202   *           @arg RAMECC_IT_GLOBAL_ALL_ENABLE   : All Global ECC interrupts enable.
203   *           @arg RAMECC_IT_GLOBAL_SINGLEERR_R  : Global ECC single error interrupt enable.
204   *           @arg RAMECC_IT_GLOBAL_DOUBLEERR_R  : Global ECC double error interrupt enable.
205   *           @arg RAMECC_IT_GLOBAL_DOUBLEERR_W  : Global ECC double error on byte write (BW) interrupt enable.
206   *           @arg RAMECC_IT_MONITOR_SINGLEERR_R : Monitor ECC single error interrupt enable.
207   *           @arg RAMECC_IT_MONITOR_DOUBLEERR_R : Monitor ECC double error interrupt enable.
208   *           @arg RAMECC_IT_MONITOR_DOUBLEERR_W : Monitor ECC double error on byte write (BW) interrupt enable.
209   *           @arg RAMECC_IT_MONITOR_ALL         : All Monitor ECC interrupts enable.
210   * @retval The new state of __INTERRUPT__ (SET or RESET).
211   */
212 #define __HAL_RAMECC_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (  \
213 (IS_RAMECC_GLOBAL_INTERRUPT(__INTERRUPT__)) ? (__HAL_RAMECC_GET_GLOBAL_IT_SOURCE((__HANDLE__), (__INTERRUPT__))) :\
214 (__HAL_RAMECC_GET_MONITOR_IT_SOURCE((__HANDLE__), (__INTERRUPT__))))
215 
216 
217 /**
218   * @brief  Get the RAMECC pending flags.
219   * @param  __HANDLE__   : RAMECC handle.
220   * @param  __FLAG__     : specifies the flag to get.
221   *          This parameter can be any combination of the following values:
222   *            @arg RAMECC_FLAG_SINGLEERR_R : RAMECC instance ECC single error detected and corrected flag.
223   *            @arg RAMECC_FLAG_DOUBLEERR_R : RAMECC instance ECC double error detected flag.
224   *            @arg RAMECC_FLAG_DOUBLEERR_W : RAMECC instance ECC double error on byte write (BW) detected flag.
225   *            @arg RAMECC_FLAGS_ALL        : RAMECC instance all flag.
226   * @retval The state of __FLAG__ (SET or RESET).
227   */
228 #define __HAL_RAMECC_GET_FLAG(__HANDLE__, __FLAG__) ((((__HANDLE__)->Instance->SR & (__FLAG__)) != 0U) ? 1UL : 0UL)
229 
230 /**
231   * @brief  Clear the RAMECC pending flags.
232   * @param  __HANDLE__   : RAMECC handle.
233   * @param  __FLAG__     : specifies the flag to clear.
234   *          This parameter can be any combination of the following values:
235   *            @arg RAMECC_FLAG_SINGLEERR_R : RAMECC instance ECC single error detected and corrected flag.
236   *            @arg RAMECC_FLAG_DOUBLEERR_R : RAMECC instance ECC double error detected flag.
237   *            @arg RAMECC_FLAG_DOUBLEERR_W : RAMECC instance ECC double error on byte write (BW) detected flag.
238   *            @arg RAMECC_FLAGS_ALL        : RAMECC instance all flag.
239   * @retval None.
240   */
241 #define __HAL_RAMECC_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->SR &= ~(__FLAG__))
242 
243 /**
244   * @brief  Reset the RAMECC handle state.
245   * @param  __HANDLE__    : Specifies the RAMECC Handle.
246   * @retval None.
247   */
248 #define __HAL_RAMECC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_RAMECC_STATE_RESET)
249 /**
250   * @}
251   */
252 
253 /* Exported functions --------------------------------------------------------*/
254 
255 /** @defgroup RAMECC_Exported_Functions RAMECC Exported Functions
256   * @brief    RAMECC Exported functions
257   * @{
258   */
259 
260 /** @defgroup RAMECC_Exported_Functions_Group1 Initialization and de-initialization functions
261   * @brief    Initialization and de-initialization functions
262   * @{
263   */
264 HAL_StatusTypeDef HAL_RAMECC_Init(RAMECC_HandleTypeDef *hramecc);
265 HAL_StatusTypeDef HAL_RAMECC_DeInit(RAMECC_HandleTypeDef *hramecc);
266 void              HAL_RAMECC_MspInit(RAMECC_HandleTypeDef *hramecc);
267 void              HAL_RAMECC_MspDeInit(RAMECC_HandleTypeDef *hramecc);
268 /**
269   * @}
270   */
271 
272 /** @defgroup RAMECC_Exported_Functions_Group2 Monitoring operation functions
273   * @brief    Monitoring operation functions
274   * @{
275   */
276 HAL_StatusTypeDef HAL_RAMECC_StartMonitor(RAMECC_HandleTypeDef *hramecc);
277 HAL_StatusTypeDef HAL_RAMECC_StopMonitor(RAMECC_HandleTypeDef *hramecc);
278 HAL_StatusTypeDef HAL_RAMECC_EnableNotification(RAMECC_HandleTypeDef *hramecc, uint32_t Notifications);
279 HAL_StatusTypeDef HAL_RAMECC_DisableNotification(RAMECC_HandleTypeDef *hramecc, uint32_t Notifications);
280 /**
281   * @}
282   */
283 
284 /** @defgroup RAMCECC_Exported_Functions_Group3 Handle Interrupt and Callbacks functions
285   * @brief    Handle Interrupt and Callbacks functions
286   * @{
287   */
288 void              HAL_RAMECC_IRQHandler(RAMECC_HandleTypeDef *hramecc);
289 void              HAL_RAMECC_DetectSingleErrorCallback(RAMECC_HandleTypeDef *hramecc);
290 void              HAL_RAMECC_DetectDoubleErrorCallback(RAMECC_HandleTypeDef *hramecc);
291 #if (USE_HAL_RAMECC_REGISTER_CALLBACKS == 1)
292 HAL_StatusTypeDef HAL_RAMECC_RegisterCallback(RAMECC_HandleTypeDef *hramecc,
293                                               HAL_RAMECC_CallbackIDTypeDef CallbackID,
294                                               void (* pCallback)(RAMECC_HandleTypeDef *_hramecc));
295 
296 HAL_StatusTypeDef HAL_RAMECC_UnRegisterCallback(RAMECC_HandleTypeDef *hramecc,
297                                                 HAL_RAMECC_CallbackIDTypeDef CallbackID);
298 #endif /* USE_HAL_RAMECC_REGISTER_CALLBACKS */
299 
300 
301 /**
302   * @}
303   */
304 
305 /** @defgroup RAMECC_Exported_Functions_Group4 Error information functions
306   * @brief    Error information functions
307   * @{
308   */
309 uint32_t HAL_RAMECC_GetFailingAddress(const RAMECC_HandleTypeDef *hramecc);
310 uint32_t HAL_RAMECC_GetFailingDataLow(const RAMECC_HandleTypeDef *hramecc);
311 uint32_t HAL_RAMECC_GetFailingDataHigh(const RAMECC_HandleTypeDef *hramecc);
312 uint32_t HAL_RAMECC_GetHammingErrorCode(const RAMECC_HandleTypeDef *hramecc);
313 uint32_t HAL_RAMECC_IsECCSingleErrorDetected(const RAMECC_HandleTypeDef *hramecc);
314 uint32_t HAL_RAMECC_IsECCDoubleErrorDetected(const RAMECC_HandleTypeDef *hramecc);
315 /**
316   * @}
317   */
318 
319 /** @defgroup RAMECC_Exported_Functions_Group5 State and Error functions
320   * @brief    State and Error functions
321   * @{
322   */
323 HAL_RAMECC_StateTypeDef HAL_RAMECC_GetState(const RAMECC_HandleTypeDef *hramecc);
324 uint32_t                HAL_RAMECC_GetError(const RAMECC_HandleTypeDef *hramecc);
325 /**
326   * @}
327   */
328 
329 /**
330   * @}
331   */
332 /* Private Constants -------------------------------------------------------------*/
333 /** @defgroup RAMECC_Private_Constants RAMECC Private Constants
334   * @brief    RAMECC private defines and constants
335   * @{
336   */
337 /**
338   * @}
339   */
340 
341 /* Private macros ------------------------------------------------------------*/
342 /** @defgroup RAMECC_Private_Macros RAMECC Private Macros
343   * @brief    RAMECC private macros
344   * @{
345   */
346 
347 #define IS_RAMECC_GLOBAL_INTERRUPT(INTERRUPT) (((INTERRUPT) == RAMECC_IT_GLOBAL_ALL_ENABLE)  || \
348                                                ((INTERRUPT) == RAMECC_IT_GLOBAL_SINGLEERR_R) || \
349                                                ((INTERRUPT) == RAMECC_IT_GLOBAL_DOUBLEERR_R) || \
350                                                ((INTERRUPT) == RAMECC_IT_GLOBAL_DOUBLEERR_W))
351 
352 
353 #define IS_RAMECC_MONITOR_INTERRUPT(INTERRUPT) (((INTERRUPT) == RAMECC_IT_MONITOR_SINGLEERR_R) || \
354                                                 ((INTERRUPT) == RAMECC_IT_MONITOR_DOUBLEERR_R) || \
355                                                 ((INTERRUPT) == RAMECC_IT_MONITOR_DOUBLEERR_W) || \
356                                                 ((INTERRUPT) == RAMECC_IT_MONITOR_ALL))
357 
358 #define IS_RAMECC_INTERRUPT(INTERRUPT) ((IS_RAMECC_GLOBAL_INTERRUPT(INTERRUPT)) || \
359                                         (IS_RAMECC_MONITOR_INTERRUPT(INTERRUPT)))
360 
361 /**
362   * @}
363   */
364 
365 /** @defgroup RAMECC_FLAG RAMECC Monitor flags
366   * @{
367   */
368 
369 /* Private functions ---------------------------------------------------------*/
370 /** @defgroup RAMECC_Private_Functions RAMECC Private Functions
371   * @brief    RAMECC private  functions
372   * @{
373   */
374 /**
375   * @}
376   */
377 
378 /**
379   * @}
380   */
381 
382 /**
383   * @}
384   */
385 
386 /**
387   * @}
388   */
389 #ifdef __cplusplus
390 }
391 #endif
392 
393 #endif /* STM32H7RSxx_HAL_RAMECC_H */
394