1 /**
2   ******************************************************************************
3   * @file    stm32g4xx_hal_rng.h
4   * @author  MCD Application Team
5   * @brief   Header file of RNG HAL module.
6   ******************************************************************************
7   * @attention
8   *
9   * Copyright (c) 2019 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 STM32G4xx_HAL_RNG_H
21 #define STM32G4xx_HAL_RNG_H
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 /* Includes ------------------------------------------------------------------*/
28 #include "stm32g4xx_hal_def.h"
29 
30 /** @addtogroup STM32G4xx_HAL_Driver
31   * @{
32   */
33 
34 #if defined (RNG)
35 
36 /** @defgroup RNG RNG
37   * @brief RNG HAL module driver
38   * @{
39   */
40 
41 /* Exported types ------------------------------------------------------------*/
42 
43 /** @defgroup RNG_Exported_Types RNG Exported Types
44   * @{
45   */
46 
47 /** @defgroup RNG_Exported_Types_Group1 RNG Init Structure definition
48   * @{
49   */
50 typedef struct
51 {
52   uint32_t                    ClockErrorDetection; /*!< CED Clock error detection */
53 } RNG_InitTypeDef;
54 
55 /**
56   * @}
57   */
58 
59 /** @defgroup RNG_Exported_Types_Group2 RNG State Structure definition
60   * @{
61   */
62 typedef enum
63 {
64   HAL_RNG_STATE_RESET     = 0x00U,  /*!< RNG not yet initialized or disabled */
65   HAL_RNG_STATE_READY     = 0x01U,  /*!< RNG initialized and ready for use   */
66   HAL_RNG_STATE_BUSY      = 0x02U,  /*!< RNG internal process is ongoing     */
67   HAL_RNG_STATE_TIMEOUT   = 0x03U,  /*!< RNG timeout state                   */
68   HAL_RNG_STATE_ERROR     = 0x04U   /*!< RNG error state                     */
69 
70 } HAL_RNG_StateTypeDef;
71 
72 /**
73   * @}
74   */
75 
76 /** @defgroup RNG_Exported_Types_Group3 RNG Handle Structure definition
77   * @{
78   */
79 #if (USE_HAL_RNG_REGISTER_CALLBACKS == 1)
80 typedef struct  __RNG_HandleTypeDef
81 #else
82 typedef struct
83 #endif /* USE_HAL_RNG_REGISTER_CALLBACKS */
84 {
85   RNG_TypeDef                 *Instance;    /*!< Register base address   */
86 
87   RNG_InitTypeDef             Init;         /*!< RNG configuration parameters */
88 
89   HAL_LockTypeDef             Lock;         /*!< RNG locking object      */
90 
91   __IO HAL_RNG_StateTypeDef   State;        /*!< RNG communication state */
92 
93   __IO  uint32_t              ErrorCode;    /*!< RNG Error code          */
94 
95   uint32_t                    RandomNumber; /*!< Last Generated RNG Data */
96 
97 #if (USE_HAL_RNG_REGISTER_CALLBACKS == 1)
98   void (* ReadyDataCallback)(struct __RNG_HandleTypeDef *hrng, uint32_t random32bit);  /*!< RNG Data Ready Callback    */
99   void (* ErrorCallback)(struct __RNG_HandleTypeDef *hrng);                            /*!< RNG Error Callback         */
100 
101   void (* MspInitCallback)(struct __RNG_HandleTypeDef *hrng);                          /*!< RNG Msp Init callback      */
102   void (* MspDeInitCallback)(struct __RNG_HandleTypeDef *hrng);                        /*!< RNG Msp DeInit callback    */
103 #endif  /* USE_HAL_RNG_REGISTER_CALLBACKS */
104 
105 } RNG_HandleTypeDef;
106 
107 #if (USE_HAL_RNG_REGISTER_CALLBACKS == 1)
108 /**
109   * @brief  HAL RNG Callback ID enumeration definition
110   */
111 typedef enum
112 {
113   HAL_RNG_ERROR_CB_ID                   = 0x00U,     /*!< RNG Error Callback ID          */
114 
115   HAL_RNG_MSPINIT_CB_ID                 = 0x01U,     /*!< RNG MspInit callback ID        */
116   HAL_RNG_MSPDEINIT_CB_ID               = 0x02U      /*!< RNG MspDeInit callback ID      */
117 
118 } HAL_RNG_CallbackIDTypeDef;
119 
120 /**
121   * @brief  HAL RNG Callback pointer definition
122   */
123 typedef  void (*pRNG_CallbackTypeDef)(RNG_HandleTypeDef *hrng);                                  /*!< pointer to a common RNG callback function */
124 typedef  void (*pRNG_ReadyDataCallbackTypeDef)(RNG_HandleTypeDef *hrng, uint32_t random32bit);   /*!< pointer to an RNG Data Ready specific callback function */
125 
126 #endif /* USE_HAL_RNG_REGISTER_CALLBACKS */
127 
128 /**
129   * @}
130   */
131 
132 /**
133   * @}
134   */
135 
136 /* Exported constants --------------------------------------------------------*/
137 /** @defgroup RNG_Exported_Constants RNG Exported Constants
138   * @{
139   */
140 
141 /** @defgroup RNG_Exported_Constants_Group1 RNG Interrupt definition
142   * @{
143   */
144 #define RNG_IT_DRDY  RNG_SR_DRDY  /*!< Data Ready interrupt  */
145 #define RNG_IT_CEI   RNG_SR_CEIS  /*!< Clock error interrupt */
146 #define RNG_IT_SEI   RNG_SR_SEIS  /*!< Seed error interrupt  */
147 /**
148   * @}
149   */
150 
151 /** @defgroup RNG_Exported_Constants_Group2 RNG Flag definition
152   * @{
153   */
154 #define RNG_FLAG_DRDY   RNG_SR_DRDY  /*!< Data ready                 */
155 #define RNG_FLAG_CECS   RNG_SR_CECS  /*!< Clock error current status */
156 #define RNG_FLAG_SECS   RNG_SR_SECS  /*!< Seed error current status  */
157 /**
158   * @}
159   */
160 
161 /** @defgroup RNG_Exported_Constants_Group3 RNG Clock Error Detection
162   * @{
163   */
164 #define RNG_CED_ENABLE          0x00000000U /*!< Clock error detection Enabled  */
165 #define RNG_CED_DISABLE         RNG_CR_CED  /*!< Clock error detection Disabled */
166 /**
167   * @}
168   */
169 
170 /** @defgroup RNG_Error_Definition   RNG Error Definition
171   * @{
172   */
173 #define  HAL_RNG_ERROR_NONE             0x00000000U    /*!< No error          */
174 #if (USE_HAL_RNG_REGISTER_CALLBACKS == 1)
175 #define  HAL_RNG_ERROR_INVALID_CALLBACK 0x00000001U    /*!< Invalid Callback error  */
176 #endif /* USE_HAL_RNG_REGISTER_CALLBACKS */
177 #define  HAL_RNG_ERROR_TIMEOUT          0x00000002U    /*!< Timeout error     */
178 #define  HAL_RNG_ERROR_BUSY             0x00000004U    /*!< Busy error        */
179 #define  HAL_RNG_ERROR_SEED             0x00000008U    /*!< Seed error        */
180 #define  HAL_RNG_ERROR_CLOCK            0x00000010U    /*!< Clock error       */
181 /**
182   * @}
183   */
184 
185 /**
186   * @}
187   */
188 
189 /* Exported macros -----------------------------------------------------------*/
190 /** @defgroup RNG_Exported_Macros RNG Exported Macros
191   * @{
192   */
193 
194 /** @brief Reset RNG handle state
195   * @param  __HANDLE__ RNG Handle
196   * @retval None
197   */
198 #if (USE_HAL_RNG_REGISTER_CALLBACKS == 1)
199 #define __HAL_RNG_RESET_HANDLE_STATE(__HANDLE__)  do{                                                   \
200                                                        (__HANDLE__)->State = HAL_RNG_STATE_RESET;       \
201                                                        (__HANDLE__)->MspInitCallback = NULL;            \
202                                                        (__HANDLE__)->MspDeInitCallback = NULL;          \
203                                                     } while(0U)
204 #else
205 #define __HAL_RNG_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_RNG_STATE_RESET)
206 #endif /* USE_HAL_RNG_REGISTER_CALLBACKS */
207 
208 /**
209   * @brief  Enables the RNG peripheral.
210   * @param  __HANDLE__ RNG Handle
211   * @retval None
212   */
213 #define __HAL_RNG_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR |=  RNG_CR_RNGEN)
214 
215 /**
216   * @brief  Disables the RNG peripheral.
217   * @param  __HANDLE__ RNG Handle
218   * @retval None
219   */
220 #define __HAL_RNG_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~RNG_CR_RNGEN)
221 
222 /**
223   * @brief  Check the selected RNG flag status.
224   * @param  __HANDLE__ RNG Handle
225   * @param  __FLAG__ RNG flag
226   *          This parameter can be one of the following values:
227   *            @arg RNG_FLAG_DRDY:  Data ready
228   *            @arg RNG_FLAG_CECS:  Clock error current status
229   *            @arg RNG_FLAG_SECS:  Seed error current status
230   * @retval The new state of __FLAG__ (SET or RESET).
231   */
232 #define __HAL_RNG_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR & (__FLAG__)) == (__FLAG__))
233 
234 /**
235   * @brief  Clears the selected RNG flag status.
236   * @param  __HANDLE__ RNG handle
237   * @param  __FLAG__ RNG flag to clear
238   * @note   WARNING: This is a dummy macro for HAL code alignment,
239   *         flags RNG_FLAG_DRDY, RNG_FLAG_CECS and RNG_FLAG_SECS are read-only.
240   * @retval None
241   */
242 #define __HAL_RNG_CLEAR_FLAG(__HANDLE__, __FLAG__)                      /* dummy  macro */
243 
244 /**
245   * @brief  Enables the RNG interrupts.
246   * @param  __HANDLE__ RNG Handle
247   * @retval None
248   */
249 #define __HAL_RNG_ENABLE_IT(__HANDLE__) ((__HANDLE__)->Instance->CR |=  RNG_CR_IE)
250 
251 /**
252   * @brief  Disables the RNG interrupts.
253   * @param  __HANDLE__ RNG Handle
254   * @retval None
255   */
256 #define __HAL_RNG_DISABLE_IT(__HANDLE__) ((__HANDLE__)->Instance->CR &= ~RNG_CR_IE)
257 
258 /**
259   * @brief  Checks whether the specified RNG interrupt has occurred or not.
260   * @param  __HANDLE__ RNG Handle
261   * @param  __INTERRUPT__ specifies the RNG interrupt status flag to check.
262   *         This parameter can be one of the following values:
263   *            @arg RNG_IT_DRDY: Data ready interrupt
264   *            @arg RNG_IT_CEI: Clock error interrupt
265   *            @arg RNG_IT_SEI: Seed error interrupt
266   * @retval The new state of __INTERRUPT__ (SET or RESET).
267   */
268 #define __HAL_RNG_GET_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->SR & (__INTERRUPT__)) == (__INTERRUPT__))
269 
270 /**
271   * @brief  Clear the RNG interrupt status flags.
272   * @param  __HANDLE__ RNG Handle
273   * @param  __INTERRUPT__ specifies the RNG interrupt status flag to clear.
274   *          This parameter can be one of the following values:
275   *            @arg RNG_IT_CEI: Clock error interrupt
276   *            @arg RNG_IT_SEI: Seed error interrupt
277   * @note   RNG_IT_DRDY flag is read-only, reading RNG_DR register automatically clears RNG_IT_DRDY.
278   * @retval None
279   */
280 #define __HAL_RNG_CLEAR_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->SR) = ~(__INTERRUPT__))
281 
282 /**
283   * @}
284   */
285 
286 /* Exported functions --------------------------------------------------------*/
287 /** @defgroup RNG_Exported_Functions RNG Exported Functions
288   * @{
289   */
290 
291 /** @defgroup RNG_Exported_Functions_Group1 Initialization and configuration functions
292   * @{
293   */
294 HAL_StatusTypeDef HAL_RNG_Init(RNG_HandleTypeDef *hrng);
295 HAL_StatusTypeDef HAL_RNG_DeInit(RNG_HandleTypeDef *hrng);
296 void HAL_RNG_MspInit(RNG_HandleTypeDef *hrng);
297 void HAL_RNG_MspDeInit(RNG_HandleTypeDef *hrng);
298 
299 /* Callbacks Register/UnRegister functions  ***********************************/
300 #if (USE_HAL_RNG_REGISTER_CALLBACKS == 1)
301 HAL_StatusTypeDef HAL_RNG_RegisterCallback(RNG_HandleTypeDef *hrng, HAL_RNG_CallbackIDTypeDef CallbackID,
302                                            pRNG_CallbackTypeDef pCallback);
303 HAL_StatusTypeDef HAL_RNG_UnRegisterCallback(RNG_HandleTypeDef *hrng, HAL_RNG_CallbackIDTypeDef CallbackID);
304 
305 HAL_StatusTypeDef HAL_RNG_RegisterReadyDataCallback(RNG_HandleTypeDef *hrng, pRNG_ReadyDataCallbackTypeDef pCallback);
306 HAL_StatusTypeDef HAL_RNG_UnRegisterReadyDataCallback(RNG_HandleTypeDef *hrng);
307 #endif /* USE_HAL_RNG_REGISTER_CALLBACKS */
308 
309 /**
310   * @}
311   */
312 
313 /** @defgroup RNG_Exported_Functions_Group2 Peripheral Control functions
314   * @{
315   */
316 HAL_StatusTypeDef HAL_RNG_GenerateRandomNumber(RNG_HandleTypeDef *hrng, uint32_t *random32bit);
317 HAL_StatusTypeDef HAL_RNG_GenerateRandomNumber_IT(RNG_HandleTypeDef *hrng);
318 uint32_t HAL_RNG_ReadLastRandomNumber(RNG_HandleTypeDef *hrng);
319 
320 void HAL_RNG_IRQHandler(RNG_HandleTypeDef *hrng);
321 void HAL_RNG_ErrorCallback(RNG_HandleTypeDef *hrng);
322 void HAL_RNG_ReadyDataCallback(RNG_HandleTypeDef *hrng, uint32_t random32bit);
323 
324 /**
325   * @}
326   */
327 
328 /** @defgroup RNG_Exported_Functions_Group3 Peripheral State functions
329   * @{
330   */
331 HAL_RNG_StateTypeDef HAL_RNG_GetState(RNG_HandleTypeDef *hrng);
332 uint32_t             HAL_RNG_GetError(RNG_HandleTypeDef *hrng);
333 /**
334   * @}
335   */
336 
337 /**
338   * @}
339   */
340 
341 /* Private macros ------------------------------------------------------------*/
342 /** @defgroup RNG_Private_Macros RNG Private Macros
343   * @{
344   */
345 #define IS_RNG_IT(IT) (((IT) == RNG_IT_CEI) || \
346                        ((IT) == RNG_IT_SEI))
347 
348 #define IS_RNG_FLAG(FLAG) (((FLAG) == RNG_FLAG_DRDY) || \
349                            ((FLAG) == RNG_FLAG_CECS) || \
350                            ((FLAG) == RNG_FLAG_SECS))
351 
352 /**
353   * @brief Verify the RNG Clock Error Detection mode.
354   * @param __MODE__ RNG Clock Error Detection mode
355   * @retval SET (__MODE__ is valid) or RESET (__MODE__ is invalid)
356   */
357 #define IS_RNG_CED(__MODE__)   (((__MODE__) == RNG_CED_ENABLE) || \
358                                 ((__MODE__) == RNG_CED_DISABLE))
359 /**
360   * @}
361   */
362 
363 /**
364   * @}
365   */
366 
367 #endif /* RNG */
368 
369 /**
370   * @}
371   */
372 
373 #ifdef __cplusplus
374 }
375 #endif
376 
377 
378 #endif /* STM32G4xx_HAL_RNG_H */
379 
380