ksdk: Add KSDK RNGA driver.

Provide a random driver wrapped around the KSDK RNGA driver.

Origin: Original

Change-Id: I43feeb37d8d5173c7b95af8e80434fb7dc77a83e
Signed-off-by: Marcus Shawcroft <marcus.shawcroft@arm.com>
Signed-off-by: Maureen Helm <maureen.helm@nxp.com>
This commit is contained in:
Marcus Shawcroft 2016-06-22 17:53:28 +01:00 committed by Maureen Helm
commit 1bea527da6
6 changed files with 87 additions and 0 deletions

View file

@ -48,6 +48,12 @@ config HAS_MCG
help
Set if the multipurpose clock generator (MCG) module is present in the SoC.
config HAS_RNGA
bool
default n
help
Set if the random number generator accelerator (RNGA) module is present in the SoC.
if HAS_OSC
choice

View file

@ -24,6 +24,7 @@ config SOC_MK64F12
select HAS_KSDK
select HAS_OSC
select HAS_MCG
select HAS_RNGA
select CPU_HAS_FPU
endchoice

View file

@ -55,4 +55,14 @@ config TIMER_RANDOM_GENERATOR
This options enables number generator based on system timer
clock. This number generator is not random and used for
testing only.
config KSDK_RNGA
bool
prompt "KSDK RNGA driver"
depends on RANDOM_GENERATOR && HAS_RNGA
default n
help
This option enables the random number generator accelerator (RNGA) driver based on the
KSDK RNGA driver.
endmenu

View file

@ -1,2 +1,3 @@
obj-$(CONFIG_KSDK_RNGA) += rand32_ksdk_rnga.o
obj-$(CONFIG_TIMER_RANDOM_GENERATOR) = rand32_timer.o
obj-$(CONFIG_X86_TSC_RANDOM_GENERATOR) += rand32_timestamp.o

View file

@ -0,0 +1,68 @@
/*
* Copyright (c) 2016 ARM Limited.
*
* SPDX-License-Identifier: Apache-2.0
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <drivers/rand32.h>
#include <drivers/system_timer.h>
#include <misc/sys_log.h>
#include "fsl_rnga.h"
void sys_rand32_init(void)
{
uint32_t seed = sys_cycle_get_32();
RNGA_Init(RNG);
/* The range of seed values acquired by this method is likely
* to be relatively small. The RNGA hardware uses two free
* running oscillators to add entropy to the seed value, we
* take care below to ensure the read rate is lower than the
* rate at which the hardware can add entropy.
*/
RNGA_Seed(RNG, seed);
RNGA_SetMode(RNG, kRNGA_ModeSleep);
}
uint32_t sys_rand32_get(void)
{
uint32_t random;
uint32_t output = 0;
int i;
RNGA_SetMode(RNG, kRNGA_ModeNormal);
/* The Reference manual states that back to back reads from
* the RNGA deliver one or two bits of entropy per 32-bit
* word, therefore we deliberately only use 1 bit per 32 bit
* word read.
*/
for (i = 0; i < 32; i++) {
status_t status;
status = RNGA_GetRandomData(RNG, &random, sizeof(random));
__ASSERT(!status, "RNGA_GetRandomData failed");
if (status) {
SYS_LOG_ERR("RNGA_GetRandomData failed with %d",
status);
}
output <<= 1;
output |= random & 1;
}
RNGA_SetMode(RNG, kRNGA_ModeSleep);
return output;
}

View file

@ -15,3 +15,4 @@
# limitations under the License.
obj-$(CONFIG_I2C_KSDK) += fsl_i2c.o
obj-$(CONFIG_KSDK_RNGA) += fsl_rnga.o