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 help
Set if the multipurpose clock generator (MCG) module is present in the SoC. 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 if HAS_OSC
choice choice

View file

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

View file

@ -55,4 +55,14 @@ config TIMER_RANDOM_GENERATOR
This options enables number generator based on system timer This options enables number generator based on system timer
clock. This number generator is not random and used for clock. This number generator is not random and used for
testing only. 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 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_TIMER_RANDOM_GENERATOR) = rand32_timer.o
obj-$(CONFIG_X86_TSC_RANDOM_GENERATOR) += rand32_timestamp.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. # limitations under the License.
obj-$(CONFIG_I2C_KSDK) += fsl_i2c.o obj-$(CONFIG_I2C_KSDK) += fsl_i2c.o
obj-$(CONFIG_KSDK_RNGA) += fsl_rnga.o