mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Thu Sep 06 13:40:20 2018 +0100
Revision:
187:0387e8f68319
Parent:
186:707f6e361f3e
Child:
189:f392fc9709a3
mbed-dev library. Release version 163

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Anna Bridge 186:707f6e361f3e 1 /*
Anna Bridge 186:707f6e361f3e 2 * Copyright (c) 2017 Nordic Semiconductor ASA
Anna Bridge 186:707f6e361f3e 3 * All rights reserved.
Anna Bridge 186:707f6e361f3e 4 *
Anna Bridge 186:707f6e361f3e 5 * Redistribution and use in source and binary forms, with or without modification,
Anna Bridge 186:707f6e361f3e 6 * are permitted provided that the following conditions are met:
Anna Bridge 186:707f6e361f3e 7 *
Anna Bridge 186:707f6e361f3e 8 * 1. Redistributions of source code must retain the above copyright notice, this list
Anna Bridge 186:707f6e361f3e 9 * of conditions and the following disclaimer.
Anna Bridge 186:707f6e361f3e 10 *
Anna Bridge 186:707f6e361f3e 11 * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA
Anna Bridge 186:707f6e361f3e 12 * integrated circuit in a product or a software update for such product, must reproduce
Anna Bridge 186:707f6e361f3e 13 * the above copyright notice, this list of conditions and the following disclaimer in
Anna Bridge 186:707f6e361f3e 14 * the documentation and/or other materials provided with the distribution.
Anna Bridge 186:707f6e361f3e 15 *
Anna Bridge 186:707f6e361f3e 16 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be
Anna Bridge 186:707f6e361f3e 17 * used to endorse or promote products derived from this software without specific prior
Anna Bridge 186:707f6e361f3e 18 * written permission.
Anna Bridge 186:707f6e361f3e 19 *
Anna Bridge 186:707f6e361f3e 20 * 4. This software, with or without modification, must only be used with a
Anna Bridge 186:707f6e361f3e 21 * Nordic Semiconductor ASA integrated circuit.
Anna Bridge 186:707f6e361f3e 22 *
Anna Bridge 186:707f6e361f3e 23 * 5. Any software provided in binary or object form under this license must not be reverse
Anna Bridge 186:707f6e361f3e 24 * engineered, decompiled, modified and/or disassembled.
Anna Bridge 186:707f6e361f3e 25 *
Anna Bridge 186:707f6e361f3e 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
Anna Bridge 186:707f6e361f3e 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Anna Bridge 186:707f6e361f3e 28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Anna Bridge 186:707f6e361f3e 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
Anna Bridge 186:707f6e361f3e 30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
Anna Bridge 186:707f6e361f3e 31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Anna Bridge 186:707f6e361f3e 32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
Anna Bridge 186:707f6e361f3e 33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Anna Bridge 186:707f6e361f3e 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Anna Bridge 186:707f6e361f3e 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Anna Bridge 186:707f6e361f3e 36 *
Anna Bridge 186:707f6e361f3e 37 */
Anna Bridge 186:707f6e361f3e 38
Anna Bridge 186:707f6e361f3e 39 #if (defined(DEVICE_TRNG) && defined(DEVICE_LPTICKER))
Anna Bridge 186:707f6e361f3e 40
Anna Bridge 186:707f6e361f3e 41 #include "hal/trng_api.h"
Anna Bridge 186:707f6e361f3e 42 #include "hal/lp_ticker_api.h"
Anna Bridge 186:707f6e361f3e 43
Anna Bridge 186:707f6e361f3e 44 #include "nrf_drv_rng.h"
Anna Bridge 186:707f6e361f3e 45
Anna Bridge 186:707f6e361f3e 46 #define DEFAULT_TIMEOUT_US (1000*1000)
Anna Bridge 186:707f6e361f3e 47
Anna Bridge 186:707f6e361f3e 48 /* Macro for testing if the SoftDevice is active, regardless of whether the
Anna Bridge 186:707f6e361f3e 49 * application is build with the SoftDevice or not.
Anna Bridge 186:707f6e361f3e 50 */
Anna Bridge 186:707f6e361f3e 51 #if defined(SOFTDEVICE_PRESENT)
Anna Bridge 186:707f6e361f3e 52 #include "nrf_sdm.h"
Anna Bridge 186:707f6e361f3e 53 static uint8_t wrapper(void) {
Anna Bridge 186:707f6e361f3e 54 uint8_t softdevice_is_enabled;
Anna Bridge 186:707f6e361f3e 55 ret_code_t result = sd_softdevice_is_enabled(&softdevice_is_enabled);
Anna Bridge 186:707f6e361f3e 56 return ((result == NRF_SUCCESS) && (softdevice_is_enabled == 1));
Anna Bridge 186:707f6e361f3e 57 }
Anna Bridge 186:707f6e361f3e 58 #define NRF_HAL_SD_IS_ENABLED() wrapper()
Anna Bridge 186:707f6e361f3e 59 #else
Anna Bridge 186:707f6e361f3e 60 #define NRF_HAL_SD_IS_ENABLED() 0
Anna Bridge 186:707f6e361f3e 61 #endif
Anna Bridge 186:707f6e361f3e 62
Anna Bridge 186:707f6e361f3e 63 /** Initialize the TRNG peripheral
Anna Bridge 186:707f6e361f3e 64 *
Anna Bridge 186:707f6e361f3e 65 * @param obj The TRNG object
Anna Bridge 186:707f6e361f3e 66 */
Anna Bridge 186:707f6e361f3e 67 void trng_init(trng_t *obj)
Anna Bridge 186:707f6e361f3e 68 {
Anna Bridge 186:707f6e361f3e 69 (void) obj;
Anna Bridge 186:707f6e361f3e 70
Anna Bridge 186:707f6e361f3e 71 /* Initialize low power ticker. Used for timeouts. */
Anna Bridge 186:707f6e361f3e 72 static bool first_init = true;
Anna Bridge 186:707f6e361f3e 73
Anna Bridge 186:707f6e361f3e 74 if (first_init) {
Anna Bridge 186:707f6e361f3e 75 first_init = false;
Anna Bridge 186:707f6e361f3e 76 }
Anna Bridge 186:707f6e361f3e 77 }
Anna Bridge 186:707f6e361f3e 78
Anna Bridge 186:707f6e361f3e 79 /** Deinitialize the TRNG peripheral
Anna Bridge 186:707f6e361f3e 80 *
Anna Bridge 186:707f6e361f3e 81 * @param obj The TRNG object
Anna Bridge 186:707f6e361f3e 82 */
Anna Bridge 186:707f6e361f3e 83 void trng_free(trng_t *obj)
Anna Bridge 186:707f6e361f3e 84 {
Anna Bridge 186:707f6e361f3e 85 (void) obj;
Anna Bridge 186:707f6e361f3e 86 }
Anna Bridge 186:707f6e361f3e 87
Anna Bridge 186:707f6e361f3e 88 /** Get random data from TRNG peripheral
Anna Bridge 186:707f6e361f3e 89 *
Anna Bridge 186:707f6e361f3e 90 * @param obj The TRNG object
Anna Bridge 186:707f6e361f3e 91 * @param output The pointer to an output array
Anna Bridge 186:707f6e361f3e 92 * @param length The size of output data, to avoid buffer overwrite
Anna Bridge 186:707f6e361f3e 93 * @param output_length The length of generated data
Anna Bridge 186:707f6e361f3e 94 * @return 0 success, -1 fail
Anna Bridge 186:707f6e361f3e 95 */
Anna Bridge 186:707f6e361f3e 96 int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length)
Anna Bridge 186:707f6e361f3e 97 {
Anna Bridge 186:707f6e361f3e 98 (void) obj;
Anna Bridge 186:707f6e361f3e 99
Anna Bridge 186:707f6e361f3e 100 /* Use SDK RNG driver if SoftDevice is enabled. */
Anna Bridge 186:707f6e361f3e 101 if (NRF_HAL_SD_IS_ENABLED()) {
Anna Bridge 186:707f6e361f3e 102
Anna Bridge 186:707f6e361f3e 103 /* Initialize driver once. */
Anna Bridge 186:707f6e361f3e 104 static bool nordic_driver_init = true;
Anna Bridge 186:707f6e361f3e 105
Anna Bridge 186:707f6e361f3e 106 if (nordic_driver_init) {
Anna Bridge 186:707f6e361f3e 107 nordic_driver_init = false;
Anna Bridge 186:707f6e361f3e 108 nrf_drv_rng_init(NULL);
Anna Bridge 186:707f6e361f3e 109 }
Anna Bridge 186:707f6e361f3e 110
Anna Bridge 186:707f6e361f3e 111 /* Query how many bytes are available. */
Anna Bridge 186:707f6e361f3e 112 uint8_t bytes_available;
Anna Bridge 186:707f6e361f3e 113 nrf_drv_rng_bytes_available(&bytes_available);
Anna Bridge 186:707f6e361f3e 114
Anna Bridge 186:707f6e361f3e 115 /* If no bytes are cached, block until at least 1 byte is available. */
Anna Bridge 186:707f6e361f3e 116 if (bytes_available == 0) {
Anna Bridge 186:707f6e361f3e 117 nrf_drv_rng_block_rand(output, 1);
Anna Bridge 186:707f6e361f3e 118 *output_length = 1;
Anna Bridge 186:707f6e361f3e 119 } else {
Anna Bridge 186:707f6e361f3e 120
Anna Bridge 186:707f6e361f3e 121 /* Get up to the requested number of bytes. */
Anna Bridge 186:707f6e361f3e 122 if (bytes_available > length) {
Anna Bridge 186:707f6e361f3e 123 bytes_available = length;
Anna Bridge 186:707f6e361f3e 124 }
Anna Bridge 186:707f6e361f3e 125
Anna Bridge 186:707f6e361f3e 126 ret_code_t result = nrf_drv_rng_rand(output, bytes_available);
Anna Bridge 186:707f6e361f3e 127
Anna Bridge 186:707f6e361f3e 128 /* Set output length with available bytes. */
Anna Bridge 186:707f6e361f3e 129 if (result == NRF_SUCCESS) {
Anna Bridge 186:707f6e361f3e 130 *output_length = bytes_available;
Anna Bridge 186:707f6e361f3e 131 } else {
Anna Bridge 186:707f6e361f3e 132 *output_length = 0;
Anna Bridge 186:707f6e361f3e 133 }
Anna Bridge 186:707f6e361f3e 134 }
Anna Bridge 186:707f6e361f3e 135 } else {
Anna Bridge 186:707f6e361f3e 136
Anna Bridge 186:707f6e361f3e 137 /* Initialize low-level registers once. */
Anna Bridge 186:707f6e361f3e 138 static bool nordic_register_init = true;
Anna Bridge 186:707f6e361f3e 139
Anna Bridge 186:707f6e361f3e 140 if (nordic_register_init) {
Anna Bridge 186:707f6e361f3e 141 nordic_register_init = false;
Anna Bridge 186:707f6e361f3e 142
Anna Bridge 186:707f6e361f3e 143 /* Enable RNG */
Anna Bridge 186:707f6e361f3e 144 nrf_rng_error_correction_enable();
Anna Bridge 186:707f6e361f3e 145 nrf_rng_task_trigger(NRF_RNG_TASK_START);
Anna Bridge 186:707f6e361f3e 146 }
Anna Bridge 186:707f6e361f3e 147
Anna Bridge 186:707f6e361f3e 148 /* Copy out one byte at a time. */
Anna Bridge 186:707f6e361f3e 149 size_t index = 0;
Anna Bridge 186:707f6e361f3e 150 for ( ; index < length; index++) {
Anna Bridge 186:707f6e361f3e 151
Anna Bridge 186:707f6e361f3e 152 /* Setup stop watch for timeout. */
Anna Bridge 186:707f6e361f3e 153 uint32_t start_us = lp_ticker_read();
Anna Bridge 186:707f6e361f3e 154 uint32_t now_us = start_us;
Anna Bridge 186:707f6e361f3e 155
Anna Bridge 186:707f6e361f3e 156 /* Block until timeout or random numer is ready. */
Anna Bridge 186:707f6e361f3e 157 while (((now_us - start_us) < DEFAULT_TIMEOUT_US) &&
Anna Bridge 186:707f6e361f3e 158 !nrf_rng_event_get(NRF_RNG_EVENT_VALRDY)) {
Anna Bridge 186:707f6e361f3e 159 now_us = lp_ticker_read();
Anna Bridge 186:707f6e361f3e 160 }
Anna Bridge 186:707f6e361f3e 161
Anna Bridge 186:707f6e361f3e 162 /* Abort if timeout was reached. */
Anna Bridge 186:707f6e361f3e 163 if ((now_us - start_us) >= DEFAULT_TIMEOUT_US) {
Anna Bridge 186:707f6e361f3e 164 break;
Anna Bridge 186:707f6e361f3e 165 } else {
Anna Bridge 186:707f6e361f3e 166
Anna Bridge 186:707f6e361f3e 167 /* Read random byte and clear event in preparation for the next byte. */
Anna Bridge 186:707f6e361f3e 168 nrf_rng_event_clear(NRF_RNG_EVENT_VALRDY);
Anna Bridge 186:707f6e361f3e 169 output[index] = nrf_rng_random_value_get();
Anna Bridge 186:707f6e361f3e 170 }
Anna Bridge 186:707f6e361f3e 171 }
Anna Bridge 186:707f6e361f3e 172
Anna Bridge 186:707f6e361f3e 173 /* Set output length with available bytes. */
Anna Bridge 186:707f6e361f3e 174 *output_length = index;
Anna Bridge 186:707f6e361f3e 175 }
Anna Bridge 186:707f6e361f3e 176
Anna Bridge 186:707f6e361f3e 177 /* Set return value based on how many bytes was read. */
Anna Bridge 186:707f6e361f3e 178 return (*output_length == 0) ? -1 : 0;
Anna Bridge 186:707f6e361f3e 179 }
Anna Bridge 186:707f6e361f3e 180
Anna Bridge 186:707f6e361f3e 181 #endif