diff options
Diffstat (limited to 'os')
-rw-r--r-- | os/hal/ports/NRF51/NRF51822/hal_rng_lld.c | 41 | ||||
-rw-r--r-- | os/hal/ports/NRF51/NRF51822/hal_rng_lld.h | 4 |
2 files changed, 32 insertions, 13 deletions
diff --git a/os/hal/ports/NRF51/NRF51822/hal_rng_lld.c b/os/hal/ports/NRF51/NRF51822/hal_rng_lld.c index 5e501ed..0a6ffbf 100644 --- a/os/hal/ports/NRF51/NRF51822/hal_rng_lld.c +++ b/os/hal/ports/NRF51/NRF51822/hal_rng_lld.c @@ -15,7 +15,7 @@ */ /** - * @file NRF51/RNGv1/rng_lld.c + * @file NRF51/NRF518221/rng_lld.c * @brief NRF51 RNG subsystem low level driver source. * * @addtogroup RNG @@ -70,6 +70,7 @@ RNGDriver RNGD1; void rng_lld_init(void) { rngObjectInit(&RNGD1); RNGD1.rng = NRF_RNG; + RNGD1.irq = RNG_IRQn; } /** @@ -80,19 +81,29 @@ void rng_lld_init(void) { * @notapi */ void rng_lld_start(RNGDriver *rngp) { + NRF_RNG_Type *rng = rngp->rng; + + /* If not specified, set default configuration */ if (rngp->config == NULL) rngp->config = &default_config; - rngp->rng->POWER = 1; + /* Power on peripheric */ + rng->POWER = 1; + /* Configure digital error correction */ if (rngp->config->digital_error_correction) - rngp->rng->CONFIG |= RNG_CONFIG_DERCEN_Msk; + rng->CONFIG |= RNG_CONFIG_DERCEN_Msk; else - rngp->rng->CONFIG &= ~RNG_CONFIG_DERCEN_Msk; + rng->CONFIG &= ~RNG_CONFIG_DERCEN_Msk; + + /* Clear pending events */ + rng->EVENTS_VALRDY = 0; - rngp->rng->EVENTS_VALRDY = 0; - rngp->rng->INTENSET = RNG_INTENSET_VALRDY_Msk; - rngp->rng->TASKS_START = 1; + /* Set interrupt mask */ + rng->INTENSET = RNG_INTENSET_VALRDY_Msk; + + /* Start */ + rng->TASKS_START = 1; } @@ -104,8 +115,11 @@ void rng_lld_start(RNGDriver *rngp) { * @notapi */ void rng_lld_stop(RNGDriver *rngp) { - rngp->rng->TASKS_STOP = 1; - rngp->rng->POWER = 0; + NRF_RNG_Type *rng = rngp->rng; + + /* Stop and power off peripheric */ + rng->TASKS_STOP = 1; + rng->POWER = 0; } @@ -120,6 +134,7 @@ void rng_lld_stop(RNGDriver *rngp) { */ msg_t rng_lld_write(RNGDriver *rngp, uint8_t *buf, size_t n, systime_t timeout) { + NRF_RNG_Type *rng = rngp->rng; size_t i; for (i = 0 ; i < n ; i++) { @@ -127,7 +142,7 @@ msg_t rng_lld_write(RNGDriver *rngp, uint8_t *buf, size_t n, * It take about 677µs to generate a new byte, not sure if * forcing a context switch will be a benefit */ - while (NRF_RNG->EVENTS_VALRDY == 0) { + while (rng->EVENTS_VALRDY == 0) { /* Sleep and wakeup on ARM event (interrupt) */ SCB->SCR |= SCB_SCR_SEVONPEND_Msk; __SEV(); @@ -136,13 +151,13 @@ msg_t rng_lld_write(RNGDriver *rngp, uint8_t *buf, size_t n, } /* Read byte */ - buf[i] = (char)NRF_RNG->VALUE; + buf[i] = (char)rng->VALUE; /* Mark as read */ - NRF_RNG->EVENTS_VALRDY = 0; + rng->EVENTS_VALRDY = 0; /* Clear interrupt so we can wake up again */ - nvicClearPending(RNG_IRQn); + nvicClearPending(rngp->irq); } return MSG_OK; } diff --git a/os/hal/ports/NRF51/NRF51822/hal_rng_lld.h b/os/hal/ports/NRF51/NRF51822/hal_rng_lld.h index 0ad0bc6..c272b6c 100644 --- a/os/hal/ports/NRF51/NRF51822/hal_rng_lld.h +++ b/os/hal/ports/NRF51/NRF51822/hal_rng_lld.h @@ -134,6 +134,10 @@ struct RNGDriver { * @brief Pointer to the RNGx registers block. */ NRF_RNG_Type *rng; + /** + * @brief IRQ number + */ + uint32_t irq; }; /*===========================================================================*/ |