From: Christian Mauderer <christian.maude...@embedded-brains.de> --- c/src/lib/libbsp/arm/atsam/Makefile.am | 4 +- .../libbsp/arm/atsam/entropy/getentropy_atsam.c | 61 ++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 c/src/lib/libbsp/arm/atsam/entropy/getentropy_atsam.c
diff --git a/c/src/lib/libbsp/arm/atsam/Makefile.am b/c/src/lib/libbsp/arm/atsam/Makefile.am index 44b31284a3..e19144990a 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-based.c libbsp_a_SOURCES += ../../shared/bspclean.c libbsp_a_SOURCES += ../../shared/bspgetworkarea.c libbsp_a_SOURCES += ../../shared/bsppredriverhook.c @@ -450,6 +449,9 @@ libbsp_a_SOURCES += spi/sc16is752.c libbsp_a_SOURCES += ../../shared/tod.c libbsp_a_SOURCES += rtc/rtc-config.c +# entropy generator +libbsp_a_SOURCES += entropy/getentropy_atsam.c + # Includes libbsp_a_CPPFLAGS += -I$(srcdir)/../shared/CMSIS/Include libbsp_a_CPPFLAGS += -I$(srcdir)/libraries/libboard diff --git a/c/src/lib/libbsp/arm/atsam/entropy/getentropy_atsam.c b/c/src/lib/libbsp/arm/atsam/entropy/getentropy_atsam.c new file mode 100644 index 0000000000..11e24dcda1 --- /dev/null +++ b/c/src/lib/libbsp/arm/atsam/entropy/getentropy_atsam.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2017 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * <rt...@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 +); -- 2.12.3 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel