Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/targets/f7/furi-hal/furi-hal-random.c')
-rw-r--r--firmware/targets/f7/furi-hal/furi-hal-random.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/firmware/targets/f7/furi-hal/furi-hal-random.c b/firmware/targets/f7/furi-hal/furi-hal-random.c
new file mode 100644
index 00000000..a7bc3a31
--- /dev/null
+++ b/firmware/targets/f7/furi-hal/furi-hal-random.c
@@ -0,0 +1,56 @@
+#include "furi-hal-random.h"
+#include <furi.h>
+#include <furi-hal.h>
+
+#include <stm32wbxx_ll_rng.h>
+#include <stm32wbxx_ll_hsem.h>
+
+#include <hw_conf.h>
+
+uint32_t furi_hal_random_get() {
+
+ while( LL_HSEM_1StepLock(HSEM, CFG_HW_RNG_SEMID));
+ LL_RNG_Enable(RNG);
+
+ while (!LL_RNG_IsActiveFlag_DRDY(RNG));
+
+ if ((LL_RNG_IsActiveFlag_CECS(RNG)) || (LL_RNG_IsActiveFlag_SECS(RNG))) {
+ furi_crash("TRNG error");
+ }
+
+ uint32_t random_val = LL_RNG_ReadRandData32(RNG);
+
+ LL_RNG_Disable(RNG);
+ LL_HSEM_ReleaseLock(HSEM, CFG_HW_RNG_SEMID, 0);
+
+ return random_val;
+}
+
+void furi_hal_random_fill_buf(uint8_t* buf, uint32_t len) {
+
+ while( LL_HSEM_1StepLock(HSEM, CFG_HW_RNG_SEMID));
+ LL_RNG_Enable(RNG);
+
+ for (uint32_t i = 0; i < len; i+= 4) {
+ while (!LL_RNG_IsActiveFlag_DRDY(RNG));
+
+ if ((LL_RNG_IsActiveFlag_CECS(RNG)) || (LL_RNG_IsActiveFlag_SECS(RNG))) {
+ furi_crash("TRNG error");
+ }
+
+ uint32_t random_val = LL_RNG_ReadRandData32(RNG);
+
+ uint8_t len_cur = ((i+4) < len) ? (4) : (len-i);
+ memcpy(&buf[i], &random_val, len_cur);
+ }
+
+ LL_RNG_Disable(RNG);
+ LL_HSEM_ReleaseLock(HSEM, CFG_HW_RNG_SEMID, 0);
+}
+
+void srand(unsigned seed) {
+}
+
+int rand() {
+ return (furi_hal_random_get() & RAND_MAX);
+}