1 /* 2 * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this 9 * list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its 16 * contributors may be used to endorse or promote products derived from this 17 * software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef NRF_RNG_H__ 33 #define NRF_RNG_H__ 34 35 #include <nrfx.h> 36 37 #ifdef __cplusplus 38 extern "C" { 39 #endif 40 41 /** 42 * @defgroup nrf_rng_hal RNG HAL 43 * @{ 44 * @ingroup nrf_rng 45 * @brief Hardware access layer for managing the Random Number Generator (RNG) peripheral. 46 */ 47 48 #define NRF_RNG_TASK_SET (1UL) 49 #define NRF_RNG_EVENT_CLEAR (0UL) 50 /** 51 * @enum nrf_rng_task_t 52 * @brief RNG tasks. 53 */ 54 typedef enum /*lint -save -e30 -esym(628,__INTADDR__) */ 55 { 56 NRF_RNG_TASK_START = offsetof(NRF_RNG_Type, TASKS_START), /**< Start the random number generator. */ 57 NRF_RNG_TASK_STOP = offsetof(NRF_RNG_Type, TASKS_STOP) /**< Stop the random number generator. */ 58 } nrf_rng_task_t; /*lint -restore */ 59 60 /** 61 * @enum nrf_rng_event_t 62 * @brief RNG events. 63 */ 64 typedef enum /*lint -save -e30 -esym(628,__INTADDR__) */ 65 { 66 NRF_RNG_EVENT_VALRDY = offsetof(NRF_RNG_Type, EVENTS_VALRDY) /**< New random number generated event. */ 67 } nrf_rng_event_t; /*lint -restore */ 68 69 /** 70 * @enum nrf_rng_int_mask_t 71 * @brief RNG interrupts. 72 */ 73 typedef enum 74 { 75 NRF_RNG_INT_VALRDY_MASK = RNG_INTENSET_VALRDY_Msk /**< Mask for enabling or disabling an interrupt on VALRDY event. */ 76 } nrf_rng_int_mask_t; 77 78 /** 79 * @enum nrf_rng_short_mask_t 80 * @brief Types of RNG shortcuts. 81 */ 82 typedef enum 83 { 84 NRF_RNG_SHORT_VALRDY_STOP_MASK = RNG_SHORTS_VALRDY_STOP_Msk /**< Mask for setting shortcut between EVENT_VALRDY and TASK_STOP. */ 85 } nrf_rng_short_mask_t; 86 87 /** 88 * @brief Function for enabling interrupts. 89 * 90 * @param[in] rng_int_mask Mask of interrupts. 91 */ 92 __STATIC_INLINE void nrf_rng_int_enable(uint32_t rng_int_mask); 93 94 /** 95 * @brief Function for disabling interrupts. 96 * 97 * @param[in] rng_int_mask Mask of interrupts. 98 */ 99 __STATIC_INLINE void nrf_rng_int_disable(uint32_t rng_int_mask); 100 101 /** 102 * @brief Function for getting the state of a specific interrupt. 103 * 104 * @param[in] rng_int_mask Interrupt. 105 * 106 * @retval true If the interrupt is not enabled. 107 * @retval false If the interrupt is enabled. 108 */ 109 __STATIC_INLINE bool nrf_rng_int_get(nrf_rng_int_mask_t rng_int_mask); 110 111 /** 112 * @brief Function for getting the address of a specific task. 113 * 114 * This function can be used by the PPI module. 115 * 116 * @param[in] rng_task Task. 117 */ 118 __STATIC_INLINE uint32_t * nrf_rng_task_address_get(nrf_rng_task_t rng_task); 119 120 /** 121 * @brief Function for setting a specific task. 122 * 123 * @param[in] rng_task Task. 124 */ 125 __STATIC_INLINE void nrf_rng_task_trigger(nrf_rng_task_t rng_task); 126 127 /** 128 * @brief Function for getting address of a specific event. 129 * 130 * This function can be used by the PPI module. 131 * 132 * @param[in] rng_event Event. 133 */ 134 __STATIC_INLINE uint32_t * nrf_rng_event_address_get(nrf_rng_event_t rng_event); 135 136 /** 137 * @brief Function for clearing a specific event. 138 * 139 * @param[in] rng_event Event. 140 */ 141 __STATIC_INLINE void nrf_rng_event_clear(nrf_rng_event_t rng_event); 142 143 /** 144 * @brief Function for getting the state of a specific event. 145 * 146 * @param[in] rng_event Event. 147 * 148 * @retval true If the event is not set. 149 * @retval false If the event is set. 150 */ 151 __STATIC_INLINE bool nrf_rng_event_get(nrf_rng_event_t rng_event); 152 153 /** 154 * @brief Function for setting shortcuts. 155 * 156 * @param[in] rng_short_mask Mask of shortcuts. 157 * 158 */ 159 __STATIC_INLINE void nrf_rng_shorts_enable(uint32_t rng_short_mask); 160 161 /** 162 * @brief Function for clearing shortcuts. 163 * 164 * @param[in] rng_short_mask Mask of shortcuts. 165 * 166 */ 167 __STATIC_INLINE void nrf_rng_shorts_disable(uint32_t rng_short_mask); 168 169 /** 170 * @brief Function for getting the previously generated random value. 171 * 172 * @return Previously generated random value. 173 */ 174 __STATIC_INLINE uint8_t nrf_rng_random_value_get(void); 175 176 /** 177 * @brief Function for enabling digital error correction. 178 */ 179 __STATIC_INLINE void nrf_rng_error_correction_enable(void); 180 181 /** 182 * @brief Function for disabling digital error correction. 183 */ 184 __STATIC_INLINE void nrf_rng_error_correction_disable(void); 185 186 #ifndef SUPPRESS_INLINE_IMPLEMENTATION 187 188 __STATIC_INLINE void nrf_rng_int_enable(uint32_t rng_int_mask) 189 { 190 NRF_RNG->INTENSET = rng_int_mask; 191 } 192 193 __STATIC_INLINE void nrf_rng_int_disable(uint32_t rng_int_mask) 194 { 195 NRF_RNG->INTENCLR = rng_int_mask; 196 } 197 198 __STATIC_INLINE bool nrf_rng_int_get(nrf_rng_int_mask_t rng_int_mask) 199 { 200 return (bool)(NRF_RNG->INTENCLR & rng_int_mask); 201 } 202 203 __STATIC_INLINE uint32_t * nrf_rng_task_address_get(nrf_rng_task_t rng_task) 204 { 205 return (uint32_t *)((uint8_t *)NRF_RNG + rng_task); 206 } 207 208 __STATIC_INLINE void nrf_rng_task_trigger(nrf_rng_task_t rng_task) 209 { 210 *((volatile uint32_t *)((uint8_t *)NRF_RNG + rng_task)) = NRF_RNG_TASK_SET; 211 } 212 213 __STATIC_INLINE uint32_t * nrf_rng_event_address_get(nrf_rng_event_t rng_event) 214 { 215 return (uint32_t *)((uint8_t *)NRF_RNG + rng_event); 216 } 217 218 __STATIC_INLINE void nrf_rng_event_clear(nrf_rng_event_t rng_event) 219 { 220 *((volatile uint32_t *)((uint8_t *)NRF_RNG + rng_event)) = NRF_RNG_EVENT_CLEAR; 221 #if __CORTEX_M == 0x04 222 volatile uint32_t dummy = *((volatile uint32_t *)((uint8_t *)NRF_RNG + rng_event)); 223 (void)dummy; 224 #endif 225 } 226 227 __STATIC_INLINE bool nrf_rng_event_get(nrf_rng_event_t rng_event) 228 { 229 return (bool) * ((volatile uint32_t *)((uint8_t *)NRF_RNG + rng_event)); 230 } 231 232 __STATIC_INLINE void nrf_rng_shorts_enable(uint32_t rng_short_mask) 233 { 234 NRF_RNG->SHORTS |= rng_short_mask; 235 } 236 237 __STATIC_INLINE void nrf_rng_shorts_disable(uint32_t rng_short_mask) 238 { 239 NRF_RNG->SHORTS &= ~rng_short_mask; 240 } 241 242 __STATIC_INLINE uint8_t nrf_rng_random_value_get(void) 243 { 244 return (uint8_t)(NRF_RNG->VALUE & RNG_VALUE_VALUE_Msk); 245 } 246 247 __STATIC_INLINE void nrf_rng_error_correction_enable(void) 248 { 249 NRF_RNG->CONFIG |= RNG_CONFIG_DERCEN_Msk; 250 } 251 252 __STATIC_INLINE void nrf_rng_error_correction_disable(void) 253 { 254 NRF_RNG->CONFIG &= ~RNG_CONFIG_DERCEN_Msk; 255 } 256 257 #endif 258 259 /** @} */ 260 261 #ifdef __cplusplus 262 } 263 #endif 264 265 #endif /* NRF_RNG_H__ */ 266