nrfx_err_t nrfx_rng_init(nrfx_rng_config_t const * p_config, nrfx_rng_evt_handler_t handler) { NRFX_ASSERT(p_config); if (m_rng_state != NRFX_DRV_STATE_UNINITIALIZED) { return NRFX_ERROR_ALREADY_INITIALIZED; } if (handler == NULL) { return NRFX_ERROR_INVALID_PARAM; } m_rng_hndl = handler; if (p_config->error_correction) { nrf_rng_error_correction_enable(); } nrf_rng_shorts_disable(NRF_RNG_SHORT_VALRDY_STOP_MASK); NRFX_IRQ_PRIORITY_SET(RNG_IRQn, p_config->interrupt_priority); NRFX_IRQ_ENABLE(RNG_IRQn); m_rng_state = NRFX_DRV_STATE_INITIALIZED; return NRFX_SUCCESS; }
static int entropy_nrf5_init(struct device *device) { /* Check if this API is called on correct driver instance. */ __ASSERT_NO_MSG(&entropy_nrf5_data == DEV_DATA(device)); /* Locking semaphore initialized to 1 (unlocked) */ k_sem_init(&entropy_nrf5_data.sem_lock, 1, 1); /* Synching semaphore */ k_sem_init(&entropy_nrf5_data.sem_sync, 0, 1); rng_pool_init((struct rng_pool *)(entropy_nrf5_data.thr), CONFIG_ENTROPY_NRF5_THR_POOL_SIZE, CONFIG_ENTROPY_NRF5_THR_THRESHOLD); rng_pool_init((struct rng_pool *)(entropy_nrf5_data.isr), CONFIG_ENTROPY_NRF5_ISR_POOL_SIZE, CONFIG_ENTROPY_NRF5_ISR_THRESHOLD); /* Enable or disable bias correction */ if (IS_ENABLED(CONFIG_ENTROPY_NRF5_BIAS_CORRECTION)) { nrf_rng_error_correction_enable(); } else { nrf_rng_error_correction_disable(); } nrf_rng_event_clear(NRF_RNG_EVENT_VALRDY); nrf_rng_int_enable(NRF_RNG_INT_VALRDY_MASK); nrf_rng_task_trigger(NRF_RNG_TASK_START); IRQ_CONNECT(RNG_IRQn, CONFIG_ENTROPY_NRF5_PRI, isr, &entropy_nrf5_data, 0); irq_enable(RNG_IRQn); return 0; }
ret_code_t nrf_drv_rng_init(nrf_drv_rng_config_t const * p_config) { uint32_t result; if (m_rng_cb.state == NRF_DRV_STATE_UNINITIALIZED) { #ifndef SOFTDEVICE_PRESENT result = app_fifo_init(&m_rng_cb.rand_pool, m_rng_cb.buffer, RNG_CONFIG_POOL_SIZE); if (p_config == NULL) { p_config = &m_default_config; } if (result == NRF_SUCCESS) { if (p_config->error_correction) { nrf_rng_error_correction_enable(); } nrf_drv_common_irq_enable(RNG_IRQn, p_config->interrupt_priority); nrf_rng_shorts_disable(NRF_RNG_SHORT_VALRDY_STOP_MASK); rng_start(); m_rng_cb.state = NRF_DRV_STATE_INITIALIZED; } #else UNUSED_VARIABLE(p_config); uint8_t softdevice_is_enabled; result = sd_softdevice_is_enabled(&softdevice_is_enabled); if (softdevice_is_enabled) { m_rng_cb.state = NRF_DRV_STATE_INITIALIZED; } else { result = NRF_ERROR_SOFTDEVICE_NOT_ENABLED; } #endif // SOFTDEVICE_PRESENT } else { result = NRF_ERROR_INVALID_STATE; } return result; }
static int entropy_nrf5_init(struct device *device) { /* Enable the RNG interrupt to be generated on the VALRDY event, * but do not enable this interrupt in NVIC to be serviced. * When the interrupt enters the Pending state it will set internal * event (SEVONPEND is activated by kernel) and wake up the core * if it was suspended by WFE. And that's enough. */ nrf_rng_int_enable(NRF_RNG_INT_VALRDY_MASK); NVIC_ClearPendingIRQ(RNG_IRQn); /* Enable or disable bias correction */ if (IS_ENABLED(CONFIG_ENTROPY_NRF5_BIAS_CORRECTION)) { nrf_rng_error_correction_enable(); } else { nrf_rng_error_correction_disable(); } /* Initialize the user count with zero */ atomic_clear(&DEV_DATA(device)->user_count); return 0; }
void nrf5RandomInit(void) { uint32_t seed = 0; memset(sBuffer, 0, sizeof(sBuffer)); sReadPosition = 0; sWritePosition = 0; NVIC_SetPriority(RNG_IRQn, RNG_IRQ_PRIORITY); NVIC_ClearPendingIRQ(RNG_IRQn); NVIC_EnableIRQ(RNG_IRQn); nrf_rng_error_correction_enable(); nrf_rng_shorts_disable(NRF_RNG_SHORT_VALRDY_STOP_MASK); generatorStart(); // Wait for the first randomized 4 bytes, to randomize software generator seed. while (!bufferIsUint32Ready()) ; seed = bufferGetUint32(); srand(seed); }