From 54739069937954d759ebc02bed32d08457c90a15 Mon Sep 17 00:00:00 2001 From: Bogdan Davidoaia Date: Tue, 28 Feb 2017 13:24:43 +0200 Subject: [PATCH] random: add MCUX TRNG driver Provide a random driver wrapped around the MCUX TRNG driver. Change-Id: Icbd7ab587aa18ecbd7eae52290aaa5d8ee504cf2 Origin: Original Signed-off-by: Bogdan Davidoaia --- arch/arm/soc/nxp_kinetis/Kconfig | 6 +++ drivers/random/Kconfig.mcux | 9 +++++ drivers/random/Makefile | 1 + drivers/random/random_mcux_trng.c | 64 +++++++++++++++++++++++++++++++ ext/hal/nxp/mcux/drivers/Makefile | 1 + 5 files changed, 81 insertions(+) create mode 100644 drivers/random/random_mcux_trng.c diff --git a/arch/arm/soc/nxp_kinetis/Kconfig b/arch/arm/soc/nxp_kinetis/Kconfig index d08870f84d5..f7bf5a30cb3 100644 --- a/arch/arm/soc/nxp_kinetis/Kconfig +++ b/arch/arm/soc/nxp_kinetis/Kconfig @@ -45,6 +45,12 @@ config HAS_RNGA help Set if the random number generator accelerator (RNGA) module is present in the SoC. +config HAS_TRNG + bool + default n + help + Set if the true random number generator (TRNG) module is present in the SoC. + config HAS_LPUART bool default n diff --git a/drivers/random/Kconfig.mcux b/drivers/random/Kconfig.mcux index 307c5b17969..1c53968705a 100644 --- a/drivers/random/Kconfig.mcux +++ b/drivers/random/Kconfig.mcux @@ -12,3 +12,12 @@ menuconfig RANDOM_MCUX_RNGA help This option enables the random number generator accelerator (RNGA) driver based on the MCUX RNGA driver. + +menuconfig RANDOM_MCUX_TRNG + bool "MCUX TRNG driver" + depends on RANDOM_GENERATOR && HAS_TRNG + default n + select RANDOM_HAS_DRIVER + help + This option enables the true random number generator (TRNG) + driver based on the MCUX TRNG driver. diff --git a/drivers/random/Makefile b/drivers/random/Makefile index 9b42ce680f8..db1f6525990 100644 --- a/drivers/random/Makefile +++ b/drivers/random/Makefile @@ -1,3 +1,4 @@ obj-$(CONFIG_RANDOM_MCUX_RNGA) += random_mcux_rnga.o +obj-$(CONFIG_RANDOM_MCUX_TRNG) += random_mcux_trng.o obj-$(CONFIG_TIMER_RANDOM_GENERATOR) = rand32_timer.o obj-$(CONFIG_X86_TSC_RANDOM_GENERATOR) += rand32_timestamp.o diff --git a/drivers/random/random_mcux_trng.c b/drivers/random/random_mcux_trng.c new file mode 100644 index 00000000000..5679d170506 --- /dev/null +++ b/drivers/random/random_mcux_trng.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2017 Linaro Limited. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +#include "fsl_trng.h" + +static int random_mcux_trng_get_entropy(struct device *dev, uint8_t *buffer, + uint16_t length) +{ + status_t status; + + ARG_UNUSED(dev); + + status = TRNG_GetRandomData(TRNG0, buffer, length); + __ASSERT_NO_MSG(!status); + + return 0; +} + +static const struct random_driver_api random_mcux_trng_api_funcs = { + .get_entropy = random_mcux_trng_get_entropy +}; + +static int random_mcux_trng_init(struct device *); + +DEVICE_AND_API_INIT(random_mcux_trng, CONFIG_RANDOM_NAME, + random_mcux_trng_init, NULL, NULL, + PRE_KERNEL_2, CONFIG_KERNEL_INIT_PRIORITY_DEVICE, + &random_mcux_trng_api_funcs); + +static int random_mcux_trng_init(struct device *dev) +{ + trng_config_t conf; + status_t status; + + ARG_UNUSED(dev); + + status = TRNG_GetDefaultConfig(&conf); + __ASSERT_NO_MSG(!status); + + status = TRNG_Init(TRNG0, &conf); + __ASSERT_NO_MSG(!status); + + return 0; +} + +uint32_t sys_rand32_get(void) +{ + uint32_t output; + int rc; + + rc = random_mcux_trng_get_entropy(DEVICE_GET(random_mcux_trng), + (uint8_t *) &output, sizeof(output)); + __ASSERT_NO_MSG(!rc); + + return output; +} diff --git a/ext/hal/nxp/mcux/drivers/Makefile b/ext/hal/nxp/mcux/drivers/Makefile index 36a908cf274..4a6d46b626d 100644 --- a/ext/hal/nxp/mcux/drivers/Makefile +++ b/ext/hal/nxp/mcux/drivers/Makefile @@ -7,6 +7,7 @@ obj-$(CONFIG_ETH_MCUX) += fsl_enet.o obj-$(CONFIG_I2C_MCUX) += fsl_i2c.o obj-$(CONFIG_RANDOM_MCUX_RNGA) += fsl_rnga.o +obj-$(CONFIG_RANDOM_MCUX_TRNG) += fsl_trng.o obj-$(CONFIG_SOC_FLASH_MCUX) += fsl_flash.o obj-$(CONFIG_SPI_MCUX) += fsl_dspi.o obj-$(CONFIG_UART_MCUX) += fsl_uart.o