diff --git a/RNode_Firmware.ino b/RNode_Firmware.ino index a116b3d..9c5d5ce 100644 --- a/RNode_Firmware.ino +++ b/RNode_Firmware.ino @@ -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); diff --git a/Utilities.h b/Utilities.h index 3d46027..cfd523c 100644 --- a/Utilities.h +++ b/Utilities.h @@ -18,6 +18,7 @@ #if HAS_EEPROM #include #elif PLATFORM == PLATFORM_NRF52 + #include #include #include 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 #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 }