1 /**
2   *********************************************************************************
3   *
4   * @file    ald_trng.h
5   * @brief   Header file of TRNG module driver.
6   *
7   * @version V1.0
8   * @date    26 Jun 2019
9   * @author  AE Team
10   * @note
11   *          Change Logs:
12   *          Date            Author          Notes
13   *          26 Jun 2019     AE Team         The first version
14   *
15   * Copyright (C) Shanghai Eastsoft Microelectronics Co. Ltd. All rights reserved.
16   *
17   * SPDX-License-Identifier: Apache-2.0
18   *
19   * Licensed under the Apache License, Version 2.0 (the License); you may
20   * not use this file except in compliance with the License.
21   * You may obtain a copy of the License at
22   *
23   * www.apache.org/licenses/LICENSE-2.0
24   *
25   * Unless required by applicable law or agreed to in writing, software
26   * distributed under the License is distributed on an AS IS BASIS, WITHOUT
27   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
28   * See the License for the specific language governing permissions and
29   * limitations under the License.
30   **********************************************************************************
31   */
32 
33 #ifndef __ALD_TRNG_H__
34 #define __ALD_TRNG_H__
35 
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39 
40 #include "utils.h"
41 
42 
43 /** @addtogroup ES32FXXX_ALD
44   * @{
45   */
46 
47 /** @addtogroup TRNG
48   * @{
49   */
50 
51 /** @defgroup TRNG_Public_Types TRNG Public Types
52   * @{
53   */
54 /**
55   * @brief Data width
56   */
57 typedef enum {
58 	TRNG_DSEL_1B  = 0x0U,	/**< 1-bit */
59 	TRNG_DSEL_8B  = 0x1U,	/**< 8-bits */
60 	TRNG_DSEL_16B = 0x2U,	/**< 16-bits */
61 	TRNG_DSEL_32B = 0x3U,	/**< 32-bits */
62 } trng_data_width_t;
63 
64 /**
65   * @brief seed type
66   */
67 typedef enum {
68 	TRNG_SEED_TYPE_0    = 0x0U,	/**< Using 0 as seed */
69 	TRNG_SEED_TYPE_1    = 0x1U,	/**< Using 1 as seed */
70 	TRNG_SEED_TYPE_LAST = 0x2U,	/**< Using last seed */
71 	TRNG_SEED_TYPE_SEED = 0x3U,	/**< Using value of register */
72 } trng_seed_type_t;
73 
74 /**
75   * @brief TRNG init structure definition
76   */
77 typedef struct {
78 	trng_data_width_t data_width;	/**< The width of data */
79 	trng_seed_type_t seed_type;	/**< The seed type */
80 	uint32_t seed;			/**< The value of seed */
81 	uint16_t t_start;		/**< T(start) = T(trng) * 2 ^ (t_start + 1), T(start) > 1ms */
82 	uint8_t adjc;			/**< Adjust parameter */
83 	type_func_t posten;		/**< Data back handle function  */
84 } trng_init_t;
85 
86 /**
87   * @brief TRNG state structures definition
88   */
89 typedef enum {
90 	TRNG_STATE_RESET = 0x0U,	/**< Peripheral is not initialized */
91 	TRNG_STATE_READY = 0x1U,	/**< Peripheral Initialized and ready for use */
92 	TRNG_STATE_BUSY  = 0x2U,	/**< An internal process is ongoing */
93 	TRNG_STATE_ERROR = 0x4U,	/**< Error */
94 } trng_state_t;
95 
96 /**
97   * @brief State type
98   */
99 typedef enum {
100 	TRNG_STATUS_START = (1U << 0),	/**< Start state */
101 	TRNG_STATUS_DAVLD = (1U << 1),	/**< Data valid state */
102 	TRNG_STATUS_SERR  = (1U << 2),	/**< Error state */
103 } trng_status_t;
104 
105 /**
106   * @brief Interrupt type
107   */
108 typedef enum {
109 	TRNG_IT_START = (1U << 0),	/**< Start */
110 	TRNG_IT_DAVLD = (1U << 1),	/**< Data valid */
111 	TRNG_IT_SERR  = (1U << 2),	/**< Error */
112 } trng_it_t;
113 
114 /**
115   * @brief Interrupt flag type
116   */
117 typedef enum {
118 	TRNG_IF_START = (1U << 0),	/**< Start */
119 	TRNG_IF_DAVLD = (1U << 1),	/**< Data valid */
120 	TRNG_IF_SERR  = (1U << 2),	/**< Error */
121 } trng_flag_t;
122 
123 /**
124   * @brief  TRNG Handle Structure definition
125   */
126 typedef struct trng_handle_s {
127 	TRNG_TypeDef *perh;	/**< Register base address */
128 	trng_init_t init;	/**< TRNG required parameters */
129 	uint32_t data;		/**< result data */
130 	lock_state_t lock; 	/**< Locking object */
131 	trng_state_t state;	/**< TRNG operation state */
132 
133 	void (*trng_cplt_cbk)(struct trng_handle_s *arg); /**< Trng completed callback */
134 	void (*err_cplt_cbk)(struct trng_handle_s *arg);  /**< Trng error callback */
135 	void (*init_cplt_cbk)(struct trng_handle_s *arg); /**< Trng init completed callback */
136 } trng_handle_t;
137 /**
138   * @}
139   */
140 
141 /** @defgroup TRNG_Public_Macros TRNG Public Macros
142   * @{
143   */
144 #define TRNG_ENABLE()		(SET_BIT(TRNG->CR, TRNG_CR_TRNGEN_MSK))
145 #define TRNG_DISABLE()		(CLEAR_BIT(TRNG->CR, TRNG_CR_TRNGEN_MSK))
146 #define TRNG_ADJM_ENABLE()	(SET_BIT(TRNG->CR, TRNG_CR_ADJM_MSK))
147 #define TRNG_ADJM_DISABLE()	(CLEAR_BIT(TRNG->CR, TRNG_CR_ADJM_MSK))
148 /**
149   * @}
150   */
151 
152 /**
153   * @defgroup TRNG_Private_Macros TRNG Private Macros
154   * @{
155   */
156 #define IS_TRNG_DATA_WIDTH(x)	(((x) == TRNG_DSEL_1B)  || \
157                                  ((x) == TRNG_DSEL_8B)  || \
158                                  ((x) == TRNG_DSEL_16B) || \
159                                  ((x) == TRNG_DSEL_32B))
160 #define IS_TRNG_SEED_TYPE(x)	(((x) == TRNG_SEED_TYPE_0)    || \
161                                  ((x) == TRNG_SEED_TYPE_1)    || \
162                                  ((x) == TRNG_SEED_TYPE_LAST) || \
163                                  ((x) == TRNG_SEED_TYPE_SEED))
164 #define IS_TRNG_STATUS(x)	(((x) == TRNG_STATUS_START)  || \
165                                  ((x) == TRNG_STATUS_DAVLD)  || \
166                                  ((x) == TRNG_STATUS_SERR))
167 #define IS_TRNG_IT(x)		(((x) == TRNG_IT_START)  || \
168                                  ((x) == TRNG_IT_DAVLD)  || \
169                                  ((x) == TRNG_IT_SERR))
170 #define IS_TRNG_FLAG(x)		(((x) == TRNG_IF_START)  || \
171                                  ((x) == TRNG_IF_DAVLD)  || \
172                                  ((x) == TRNG_IF_SERR))
173 #define IS_TRNG_ADJC(x)		((x) < 4)
174 #define IS_TRNG_T_START(x)	((x) < 8)
175 /**
176   * @}
177   */
178 
179 /** @addtogroup TRNG_Public_Functions
180   * @{
181   */
182 /** @addtogroup TRNG_Public_Functions_Group1
183   * @{
184   */
185 /* Initialization functions */
186 extern ald_status_t ald_trng_init(trng_handle_t *hperh);
187 /**
188   * @}
189   */
190 /** @addtogroup TRNG_Public_Functions_Group2
191   * @{
192   */
193 /* Control functions */
194 extern uint32_t ald_trng_get_result(trng_handle_t *hperh);
195 extern void ald_trng_interrupt_config(trng_handle_t *hperh, trng_it_t it, type_func_t state);
196 extern flag_status_t ald_trng_get_status(trng_handle_t *hperh, trng_status_t status);
197 extern it_status_t ald_trng_get_it_status(trng_handle_t *hperh, trng_it_t it);
198 extern flag_status_t ald_trng_get_flag_status(trng_handle_t *hperh, trng_flag_t flag);
199 extern void ald_trng_clear_flag_status(trng_handle_t *hperh, trng_flag_t flag);
200 extern void ald_trng_irq_handler(trng_handle_t *hperh);
201 /**
202   * @}
203   */
204 /**
205   * @}
206   */
207 /**
208   * @}
209   */
210 /**
211   * @}
212   */
213 #ifdef __cplusplus
214 }
215 #endif
216 
217 #endif /* __ALD_TRNG_H__ */
218