furi_hal_random.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "furi_hal_random.h"
  2. #include <furi.h>
  3. #include <furi_hal.h>
  4. #include <stm32wbxx_ll_rng.h>
  5. #include <stm32wbxx_ll_hsem.h>
  6. #include <hw_conf.h>
  7. #define TAG "FuriHalRandom"
  8. uint32_t furi_hal_random_get() {
  9. while(LL_HSEM_1StepLock(HSEM, CFG_HW_RNG_SEMID))
  10. ;
  11. LL_RNG_Enable(RNG);
  12. while(!LL_RNG_IsActiveFlag_DRDY(RNG))
  13. ;
  14. if((LL_RNG_IsActiveFlag_CECS(RNG)) || (LL_RNG_IsActiveFlag_SECS(RNG))) {
  15. furi_crash("TRNG error");
  16. }
  17. uint32_t random_val = LL_RNG_ReadRandData32(RNG);
  18. LL_RNG_Disable(RNG);
  19. LL_HSEM_ReleaseLock(HSEM, CFG_HW_RNG_SEMID, 0);
  20. return random_val;
  21. }
  22. void furi_hal_random_fill_buf(uint8_t* buf, uint32_t len) {
  23. while(LL_HSEM_1StepLock(HSEM, CFG_HW_RNG_SEMID))
  24. ;
  25. LL_RNG_Enable(RNG);
  26. for(uint32_t i = 0; i < len; i += 4) {
  27. while(!LL_RNG_IsActiveFlag_DRDY(RNG))
  28. ;
  29. if((LL_RNG_IsActiveFlag_CECS(RNG)) || (LL_RNG_IsActiveFlag_SECS(RNG))) {
  30. furi_crash("TRNG error");
  31. }
  32. uint32_t random_val = LL_RNG_ReadRandData32(RNG);
  33. uint8_t len_cur = ((i + 4) < len) ? (4) : (len - i);
  34. memcpy(&buf[i], &random_val, len_cur);
  35. }
  36. LL_RNG_Disable(RNG);
  37. LL_HSEM_ReleaseLock(HSEM, CFG_HW_RNG_SEMID, 0);
  38. }
  39. void srand(unsigned seed) {
  40. UNUSED(seed);
  41. }
  42. int rand() {
  43. return (furi_hal_random_get() & RAND_MAX);
  44. }
  45. long random() {
  46. return (furi_hal_random_get() & RAND_MAX);
  47. }