diff options
author | Christian Mauderer <Christian.Mauderer@embedded-brains.de> | 2017-11-13 09:21:31 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-11-17 07:26:57 +0100 |
commit | a9de9a7b95b2e775d7a693782f041abb2b9caa75 (patch) | |
tree | 1280fcbbbd2bb2b0e4c5f8b0efab7e7e00a1d31e | |
parent | getentropy: Add test. (diff) | |
download | rtems-a9de9a7b95b2e775d7a693782f041abb2b9caa75.tar.bz2 |
bsp/atsam: Add getentropy().
Update #3239.
-rw-r--r-- | c/src/lib/libbsp/arm/atsam/Makefile.am | 2 | ||||
-rw-r--r-- | c/src/lib/libbsp/arm/atsam/startup/getentropy-trng.c | 61 |
2 files changed, 62 insertions, 1 deletions
diff --git a/c/src/lib/libbsp/arm/atsam/Makefile.am b/c/src/lib/libbsp/arm/atsam/Makefile.am index d29ba0895a..d44a72269e 100644 --- a/c/src/lib/libbsp/arm/atsam/Makefile.am +++ b/c/src/lib/libbsp/arm/atsam/Makefile.am @@ -332,7 +332,6 @@ libbsp_a_LIBADD = # Shared libbsp_a_SOURCES += ../../shared/bootcard.c -libbsp_a_SOURCES += ../../shared/getentropy-cpucounter.c libbsp_a_SOURCES += ../../shared/bspclean.c libbsp_a_SOURCES += ../../shared/bspgetworkarea.c libbsp_a_SOURCES += ../../shared/bsppredriverhook.c @@ -397,6 +396,7 @@ libbsp_a_SOURCES += ../shared/armv7m/startup/bspreset.c libbsp_a_SOURCES += ../shared/armv7m/startup/armv7m-cpucounter.c libbsp_a_SOURCES += startup/bspstart.c libbsp_a_SOURCES += startup/bspstarthooks.c +libbsp_a_SOURCES += startup/getentropy-trng.c libbsp_a_SOURCES += startup/pin-config.c libbsp_a_SOURCES += startup/power.c libbsp_a_SOURCES += startup/power-rtc.c diff --git a/c/src/lib/libbsp/arm/atsam/startup/getentropy-trng.c b/c/src/lib/libbsp/arm/atsam/startup/getentropy-trng.c new file mode 100644 index 0000000000..11e24dcda1 --- /dev/null +++ b/c/src/lib/libbsp/arm/atsam/startup/getentropy-trng.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2017 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * <rtems@embedded-brains.de> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#include <libchip/chip.h> +#include <unistd.h> +#include <string.h> +#include <rtems/sysinit.h> + +static void atsam_trng_enable(void) +{ + PMC_EnablePeripheral(ID_TRNG); + TRNG_Enable(); +} + +int getentropy(void *ptr, size_t n) +{ + while (n > 0) { + uint32_t random; + size_t copy; + + while ((TRNG_GetStatus() & TRNG_ISR_DATRDY) == 0) { + /* wait */ + } + random = TRNG_GetRandData(); + + /* + * Read TRNG status one more time to avoid race condition. + * Otherwise we can read (and clear) an old ready status but get + * a new value. The ready status for this value wouldn't be + * reset. + */ + TRNG_GetStatus(); + + copy = sizeof(random); + if (n < copy ) { + copy = n; + } + memcpy(ptr, &random, copy); + n -= copy; + ptr += copy; + } + + return 0; +} + +RTEMS_SYSINIT_ITEM( + atsam_trng_enable, + RTEMS_SYSINIT_DEVICE_DRIVERS, + RTEMS_SYSINIT_ORDER_LAST +); |