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:
parent
ca35c177fd
commit
1bea527da6
6 changed files with 87 additions and 0 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
68
drivers/random/rand32_ksdk_rnga.c
Normal file
68
drivers/random/rand32_ksdk_rnga.c
Normal 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;
|
||||||
|
}
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue