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