forked from Imagelibrary/rtems
committed by
Sebastian Huber
parent
1358d4c824
commit
a9de9a7b95
@@ -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
|
||||
|
||||
61
c/src/lib/libbsp/arm/atsam/startup/getentropy-trng.c
Normal file
61
c/src/lib/libbsp/arm/atsam/startup/getentropy-trng.c
Normal file
@@ -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
|
||||
);
|
||||
Reference in New Issue
Block a user