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
|
||||
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
|
||||
|
|
|
@ -24,6 +24,7 @@ config SOC_MK64F12
|
|||
select HAS_KSDK
|
||||
select HAS_OSC
|
||||
select HAS_MCG
|
||||
select HAS_RNGA
|
||||
select CPU_HAS_FPU
|
||||
|
||||
endchoice
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
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.
|
||||
|
||||
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