1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- /*
- * Copyright 2017, 2019 NXP
- * All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
- #include "fsl_rng.h"
- /* Component ID definition, used by tools. */
- #ifndef FSL_COMPONENT_ID
- #define FSL_COMPONENT_ID "platform.drivers.rng_1"
- #endif
- /*******************************************************************************
- * Definitions
- *******************************************************************************/
- /*******************************************************************************
- * Prototypes
- *******************************************************************************/
- /*******************************************************************************
- * Code
- ******************************************************************************/
- void RNG_Init(RNG_Type *base)
- {
- /* Clear ring oscilator disable bit*/
- PMC->PDRUNCFGCLR0 = PMC_PDRUNCFG0_PDEN_RNG_MASK;
- #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
- CLOCK_EnableClock(kCLOCK_Rng);
- #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
- }
- void RNG_Deinit(RNG_Type *base)
- {
- /* Set ring oscilator disable bit*/
- PMC->PDRUNCFGSET0 = PMC_PDRUNCFG0_PDEN_RNG_MASK;
- #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
- CLOCK_DisableClock(kCLOCK_Rng);
- #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
- }
- status_t RNG_GetRandomData(RNG_Type *base, void *data, size_t dataSize)
- {
- status_t result = kStatus_Fail;
- uint32_t random32;
- uint32_t randomSize;
- uint8_t *pRandom;
- uint8_t *pData = (uint8_t *)data;
- uint32_t i;
- /* Check input parameters.*/
- if (!((base != NULL) && (data != NULL) && (dataSize != 0U)))
- {
- result = kStatus_InvalidArgument;
- }
- else
- {
- /* Check that ring oscilator is enabled */
- if (0U == (PMC->PDRUNCFG0 & PMC_PDRUNCFG0_PDEN_RNG_MASK))
- {
- do
- {
- /* Read Entropy.*/
- random32 = base->RANDOM_NUMBER;
- pRandom = (uint8_t *)&random32;
- if (dataSize < sizeof(random32))
- {
- randomSize = dataSize;
- }
- else
- {
- randomSize = sizeof(random32);
- }
- for (i = 0; i < randomSize; i++)
- {
- *pData++ = *pRandom++;
- }
- dataSize -= randomSize;
- } while (dataSize > 0U);
- result = kStatus_Success;
- }
- }
- return result;
- }
|