mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
targets/TARGET_Analog_Devices/TARGET_ADUCM302X/TARGET_ADUCM3029/api/trng_api.c@189:f392fc9709a3, 2019-02-20 (annotated)
- Committer:
- AnnaBridge
- Date:
- Wed Feb 20 22:31:08 2019 +0000
- Revision:
- 189:f392fc9709a3
- Parent:
- 180:96ed750bd169
mbed library release version 165
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AnnaBridge | 178:79309dc6340a | 1 | /******************************************************************************* |
AnnaBridge | 178:79309dc6340a | 2 | * Copyright (c) 2010-2017 Analog Devices, Inc. |
AnnaBridge | 178:79309dc6340a | 3 | * |
AnnaBridge | 178:79309dc6340a | 4 | * All rights reserved. |
AnnaBridge | 178:79309dc6340a | 5 | * |
AnnaBridge | 178:79309dc6340a | 6 | * Redistribution and use in source and binary forms, with or without modification, |
AnnaBridge | 178:79309dc6340a | 7 | * are permitted provided that the following conditions are met: |
AnnaBridge | 178:79309dc6340a | 8 | * - Redistributions of source code must retain the above copyright notice, |
AnnaBridge | 178:79309dc6340a | 9 | * this list of conditions and the following disclaimer. |
AnnaBridge | 178:79309dc6340a | 10 | * - Redistributions in binary form must reproduce the above copyright notice, |
AnnaBridge | 178:79309dc6340a | 11 | * this list of conditions and the following disclaimer in the documentation |
AnnaBridge | 178:79309dc6340a | 12 | * and/or other materials provided with the distribution. |
AnnaBridge | 178:79309dc6340a | 13 | * - Modified versions of the software must be conspicuously marked as such. |
AnnaBridge | 178:79309dc6340a | 14 | * - This software is licensed solely and exclusively for use with processors |
AnnaBridge | 178:79309dc6340a | 15 | * manufactured by or for Analog Devices, Inc. |
AnnaBridge | 178:79309dc6340a | 16 | * - This software may not be combined or merged with other code in any manner |
AnnaBridge | 178:79309dc6340a | 17 | * that would cause the software to become subject to terms and conditions |
AnnaBridge | 178:79309dc6340a | 18 | * which differ from those listed here. |
AnnaBridge | 178:79309dc6340a | 19 | * - Neither the name of Analog Devices, Inc. nor the names of its |
AnnaBridge | 178:79309dc6340a | 20 | * contributors may be used to endorse or promote products derived |
AnnaBridge | 178:79309dc6340a | 21 | * from this software without specific prior written permission. |
AnnaBridge | 178:79309dc6340a | 22 | * - The use of this software may or may not infringe the patent rights of one |
AnnaBridge | 178:79309dc6340a | 23 | * or more patent holders. This license does not release you from the |
AnnaBridge | 178:79309dc6340a | 24 | * requirement that you obtain separate licenses from these patent holders |
AnnaBridge | 178:79309dc6340a | 25 | * to use this software. |
AnnaBridge | 178:79309dc6340a | 26 | * |
AnnaBridge | 178:79309dc6340a | 27 | * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. AND CONTRIBUTORS "AS IS" |
AnnaBridge | 178:79309dc6340a | 28 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON- |
AnnaBridge | 178:79309dc6340a | 29 | * INFRINGEMENT, TITLE, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
AnnaBridge | 178:79309dc6340a | 30 | * DISCLAIMED. IN NO EVENT SHALL ANALOG DEVICES, INC. OR CONTRIBUTORS BE LIABLE |
AnnaBridge | 178:79309dc6340a | 31 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE OR |
AnnaBridge | 178:79309dc6340a | 32 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, DAMAGES ARISING OUT OF |
AnnaBridge | 178:79309dc6340a | 33 | * CLAIMS OF INTELLECTUAL PROPERTY RIGHTS INFRINGEMENT; PROCUREMENT OF |
AnnaBridge | 178:79309dc6340a | 34 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
AnnaBridge | 178:79309dc6340a | 35 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
AnnaBridge | 178:79309dc6340a | 36 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
AnnaBridge | 178:79309dc6340a | 37 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
AnnaBridge | 178:79309dc6340a | 38 | * POSSIBILITY OF SUCH DAMAGE. |
AnnaBridge | 178:79309dc6340a | 39 | ******************************************************************************/ |
AnnaBridge | 178:79309dc6340a | 40 | |
AnnaBridge | 189:f392fc9709a3 | 41 | #if DEVICE_TRNG |
AnnaBridge | 178:79309dc6340a | 42 | |
AnnaBridge | 178:79309dc6340a | 43 | #include <stdlib.h> |
AnnaBridge | 178:79309dc6340a | 44 | #include <drivers/rng/adi_rng.h> |
AnnaBridge | 178:79309dc6340a | 45 | #include <drivers/pwr/adi_pwr.h> |
AnnaBridge | 178:79309dc6340a | 46 | #include "adi_rng_def.h" |
AnnaBridge | 178:79309dc6340a | 47 | #include "cmsis.h" |
AnnaBridge | 178:79309dc6340a | 48 | #include "trng_api.h" |
AnnaBridge | 178:79309dc6340a | 49 | #include "objects.h" |
AnnaBridge | 178:79309dc6340a | 50 | |
AnnaBridge | 178:79309dc6340a | 51 | // Sampling counter values |
AnnaBridge | 178:79309dc6340a | 52 | // Prescaler: 0 - 10 |
AnnaBridge | 178:79309dc6340a | 53 | // LenReload: 0 - 4095 |
AnnaBridge | 178:79309dc6340a | 54 | #define TRNG_CNT_VAL 4095 |
AnnaBridge | 178:79309dc6340a | 55 | #define TRNG_PRESCALER 2 |
AnnaBridge | 178:79309dc6340a | 56 | |
Anna Bridge |
180:96ed750bd169 | 57 | /******************************************************************************* |
Anna Bridge |
180:96ed750bd169 | 58 | RNG Device memory is the instance of ADI_RNG_DEV_DATA_TYPE that contains |
Anna Bridge |
180:96ed750bd169 | 59 | pointers and requires 4 byte alignment. The use of uint8_t may cause memory |
Anna Bridge |
180:96ed750bd169 | 60 | access fault for some compilers which are not configured to handle unaligned |
Anna Bridge |
180:96ed750bd169 | 61 | accesses to SRAM. The size in uint8_t for RngDevMem is ADI_RNG_MEMORY_SIZE. |
Anna Bridge |
180:96ed750bd169 | 62 | The size in uint32_t for RngDevMem is recalculated to be |
Anna Bridge |
180:96ed750bd169 | 63 | (ADI_RNG_MEMORY_SIZE + 3)/4. |
Anna Bridge |
180:96ed750bd169 | 64 | *******************************************************************************/ |
Anna Bridge |
180:96ed750bd169 | 65 | static uint32_t RngDevMem[(ADI_RNG_MEMORY_SIZE + 3)/4]; |
AnnaBridge | 178:79309dc6340a | 66 | |
AnnaBridge | 178:79309dc6340a | 67 | void trng_init(trng_t *obj) |
AnnaBridge | 178:79309dc6340a | 68 | { |
AnnaBridge | 178:79309dc6340a | 69 | ADI_RNG_HANDLE RNGhDevice; |
AnnaBridge | 178:79309dc6340a | 70 | |
AnnaBridge | 178:79309dc6340a | 71 | // Open the device |
AnnaBridge | 178:79309dc6340a | 72 | adi_rng_Open(0,RngDevMem,sizeof(RngDevMem),&RNGhDevice); |
AnnaBridge | 178:79309dc6340a | 73 | |
AnnaBridge | 178:79309dc6340a | 74 | // Set sample length for the H/W RN accumulator |
AnnaBridge | 178:79309dc6340a | 75 | adi_rng_SetSampleLen(RNGhDevice, TRNG_PRESCALER, TRNG_CNT_VAL); |
AnnaBridge | 178:79309dc6340a | 76 | |
AnnaBridge | 178:79309dc6340a | 77 | // Disable buffering - single byte generation only |
AnnaBridge | 178:79309dc6340a | 78 | adi_rng_EnableBuffering(RNGhDevice, false); |
AnnaBridge | 178:79309dc6340a | 79 | |
AnnaBridge | 178:79309dc6340a | 80 | // Enable the TRNG |
AnnaBridge | 178:79309dc6340a | 81 | adi_rng_Enable(RNGhDevice, true); |
AnnaBridge | 178:79309dc6340a | 82 | |
AnnaBridge | 178:79309dc6340a | 83 | // Save device handle |
AnnaBridge | 178:79309dc6340a | 84 | obj->RNGhDevice = RNGhDevice; |
AnnaBridge | 178:79309dc6340a | 85 | } |
AnnaBridge | 178:79309dc6340a | 86 | |
AnnaBridge | 178:79309dc6340a | 87 | void trng_free(trng_t *obj) |
AnnaBridge | 178:79309dc6340a | 88 | { |
AnnaBridge | 178:79309dc6340a | 89 | ADI_RNG_HANDLE RNGhDevice = obj->RNGhDevice; |
AnnaBridge | 178:79309dc6340a | 90 | |
AnnaBridge | 178:79309dc6340a | 91 | adi_rng_Enable(RNGhDevice, false); |
AnnaBridge | 178:79309dc6340a | 92 | adi_rng_Close(RNGhDevice); |
AnnaBridge | 178:79309dc6340a | 93 | } |
AnnaBridge | 178:79309dc6340a | 94 | |
AnnaBridge | 178:79309dc6340a | 95 | int trng_get_bytes(trng_t *obj, uint8_t *output, size_t length, size_t *output_length) |
AnnaBridge | 178:79309dc6340a | 96 | { |
AnnaBridge | 178:79309dc6340a | 97 | ADI_RNG_HANDLE RNGhDevice = obj->RNGhDevice; |
AnnaBridge | 178:79309dc6340a | 98 | bool bRNGRdy, bStuck; |
AnnaBridge | 178:79309dc6340a | 99 | uint32_t i; |
AnnaBridge | 178:79309dc6340a | 100 | volatile uint32_t nRandomNum; |
AnnaBridge | 178:79309dc6340a | 101 | ADI_RNG_RESULT result; |
AnnaBridge | 178:79309dc6340a | 102 | ADI_RNG_DEV_TYPE *pDevice = (ADI_RNG_DEV_TYPE*)RNGhDevice; |
AnnaBridge | 178:79309dc6340a | 103 | |
AnnaBridge | 178:79309dc6340a | 104 | for (i = 0; i < length; i++) { |
AnnaBridge | 178:79309dc6340a | 105 | // Loop until the device has data to be read |
AnnaBridge | 178:79309dc6340a | 106 | do { |
AnnaBridge | 178:79309dc6340a | 107 | result = adi_rng_GetRdyStatus(RNGhDevice, &bRNGRdy); |
AnnaBridge | 178:79309dc6340a | 108 | if (result != ADI_RNG_SUCCESS) { |
AnnaBridge | 178:79309dc6340a | 109 | return -1; |
AnnaBridge | 178:79309dc6340a | 110 | } |
AnnaBridge | 178:79309dc6340a | 111 | } while (!bRNGRdy); |
AnnaBridge | 178:79309dc6340a | 112 | |
AnnaBridge | 178:79309dc6340a | 113 | // Check the STUCK bit to make sure the oscillator output isn't stuck |
AnnaBridge | 178:79309dc6340a | 114 | result = adi_rng_GetStuckStatus(RNGhDevice, &bStuck); |
AnnaBridge | 178:79309dc6340a | 115 | |
AnnaBridge | 178:79309dc6340a | 116 | // If the stuck bit is set, this means there may be a problem with RNG hardware, |
AnnaBridge | 178:79309dc6340a | 117 | // exit with an error |
AnnaBridge | 178:79309dc6340a | 118 | if ( (result != ADI_RNG_SUCCESS) || ((result == ADI_RNG_SUCCESS) && (bStuck)) ) { |
AnnaBridge | 178:79309dc6340a | 119 | // Clear the STUCK bit by writing a 1 to it |
AnnaBridge | 178:79309dc6340a | 120 | pDevice->pRNG->STAT |= BITM_RNG_STAT_STUCK; |
AnnaBridge | 178:79309dc6340a | 121 | return -1; |
AnnaBridge | 178:79309dc6340a | 122 | } |
AnnaBridge | 178:79309dc6340a | 123 | |
AnnaBridge | 178:79309dc6340a | 124 | // Read the RNG |
AnnaBridge | 178:79309dc6340a | 125 | result = adi_rng_GetRngData(RNGhDevice, (uint32_t*)(&nRandomNum)); |
AnnaBridge | 178:79309dc6340a | 126 | |
AnnaBridge | 178:79309dc6340a | 127 | if (result != ADI_RNG_SUCCESS) { |
AnnaBridge | 178:79309dc6340a | 128 | return -1; |
AnnaBridge | 178:79309dc6340a | 129 | } |
AnnaBridge | 178:79309dc6340a | 130 | |
AnnaBridge | 178:79309dc6340a | 131 | // Save the output |
AnnaBridge | 178:79309dc6340a | 132 | output[i] = (uint8_t)(nRandomNum & 0xFF); |
AnnaBridge | 178:79309dc6340a | 133 | } |
AnnaBridge | 178:79309dc6340a | 134 | |
AnnaBridge | 178:79309dc6340a | 135 | *output_length = length; |
AnnaBridge | 178:79309dc6340a | 136 | |
AnnaBridge | 178:79309dc6340a | 137 | // Clear nRandomNum on the stack before exiting |
AnnaBridge | 178:79309dc6340a | 138 | nRandomNum = 0; |
AnnaBridge | 178:79309dc6340a | 139 | |
AnnaBridge | 178:79309dc6340a | 140 | return 0; |
AnnaBridge | 178:79309dc6340a | 141 | } |
AnnaBridge | 178:79309dc6340a | 142 | |
AnnaBridge | 178:79309dc6340a | 143 | #endif |