]> git.tnoah.ca Git - lora-radio.git/commitdiff
Added nRF hardware RNG
authorMark Qvist <mark@unsigned.io>
Sun, 13 Apr 2025 12:45:31 +0000 (14:45 +0200)
committerMark Qvist <mark@unsigned.io>
Sun, 13 Apr 2025 12:45:31 +0000 (14:45 +0200)
RNode_Firmware.ino
Utilities.h

index a116b3d83ad1d9d7948a29ee8441cde246599a39..9c5d5ce1a6202b103cb292b5f5170ccd7e15a70d 100644 (file)
@@ -94,14 +94,24 @@ void setup() {
   #endif
 
   // Seed the PRNG for CSMA R-value selection
-  # if MCU_VARIANT == MCU_ESP32
+  #if MCU_VARIANT == MCU_ESP32
     // On ESP32, get the seed value from the
     // hardware RNG
-    int seed_val = (int)esp_random();
+    unsigned long seed_val = (unsigned long)esp_random();
+  #elif MCU_VARIANT == MCU_NRF52
+    // On nRF, get the seed value from the
+    // hardware RNG
+    unsigned long seed_val = get_rng_seed();
   #else
     // Otherwise, get a pseudo-random seed
     // value from an unconnected analog pin
-    int seed_val = analogRead(0);
+    //
+    // CAUTION! If you are implementing the
+    // firmware on a platform that does not
+    // have a hardware RNG, you MUST take
+    // care to get a seed value with enough
+    // entropy at each device reset!
+    unsigned long seed_val = analogRead(0);
   #endif
   randomSeed(seed_val);
 
index 3d46027b39d6dfd3d01853aca60c3ff5c4ec66c4..cfd523c77bc03d1600430783088547f8f0ffcba8 100644 (file)
@@ -18,6 +18,7 @@
 #if HAS_EEPROM
     #include <EEPROM.h>
 #elif PLATFORM == PLATFORM_NRF52
+               #include <hal/nrf_rng.h>
     #include <Adafruit_LittleFS.h>
     #include <InternalFileSystem.h>
     using namespace Adafruit_LittleFS_Namespace;
@@ -103,6 +104,28 @@ uint8_t boot_vector = 0x00;
        // TODO: Get NRF52 boot flags
 #endif
 
+#if MCU_VARIANT == MCU_NRF52
+       unsigned long get_rng_seed() {
+               nrf_rng_error_correction_enable(NRF_RNG);
+               nrf_rng_shorts_disable(NRF_RNG, NRF_RNG_SHORT_VALRDY_STOP_MASK);
+               nrf_rng_task_trigger(NRF_RNG, NRF_RNG_TASK_START);
+               while (!nrf_rng_event_check(NRF_RNG, NRF_RNG_EVENT_VALRDY));
+               uint8_t rb_a = nrf_rng_random_value_get(NRF_RNG);
+               nrf_rng_event_clear(NRF_RNG, NRF_RNG_EVENT_VALRDY);
+               while (!nrf_rng_event_check(NRF_RNG, NRF_RNG_EVENT_VALRDY));
+               uint8_t rb_b = nrf_rng_random_value_get(NRF_RNG);
+               nrf_rng_event_clear(NRF_RNG, NRF_RNG_EVENT_VALRDY);
+               while (!nrf_rng_event_check(NRF_RNG, NRF_RNG_EVENT_VALRDY));
+               uint8_t rb_c = nrf_rng_random_value_get(NRF_RNG);
+               nrf_rng_event_clear(NRF_RNG, NRF_RNG_EVENT_VALRDY);
+               while (!nrf_rng_event_check(NRF_RNG, NRF_RNG_EVENT_VALRDY));
+               uint8_t rb_d = nrf_rng_random_value_get(NRF_RNG);
+               nrf_rng_event_clear(NRF_RNG, NRF_RNG_EVENT_VALRDY);
+               nrf_rng_task_trigger(NRF_RNG, NRF_RNG_TASK_STOP);
+               return rb_a << 24 | rb_b << 16 | rb_c << 8 | rb_d;
+       }
+#endif
+
 #if HAS_NP == true
        #include <Adafruit_NeoPixel.h>
        #define NUMPIXELS 1
@@ -349,7 +372,7 @@ void hard_reset(void) {
        #elif MCU_VARIANT == MCU_ESP32
                ESP.restart();
        #elif MCU_VARIANT == MCU_NRF52
-        NVIC_SystemReset();
+    NVIC_SystemReset();
        #endif
 }