mbed library sources. Supersedes mbed-src.

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

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?

UserRevisionLine numberNew 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