cleanup, added comments
This commit is contained in:
parent
d27b447106
commit
9a6ca01c85
|
@ -35,7 +35,6 @@
|
||||||
*/
|
*/
|
||||||
static const RNGConfig default_config = {
|
static const RNGConfig default_config = {
|
||||||
.digital_error_correction = 1,
|
.digital_error_correction = 1,
|
||||||
.power_on_write = 1,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -84,15 +83,16 @@ void rng_lld_start(RNGDriver *rngp) {
|
||||||
if (rngp->config == NULL)
|
if (rngp->config == NULL)
|
||||||
rngp->config = &default_config;
|
rngp->config = &default_config;
|
||||||
|
|
||||||
rngp->rng->POWER = 1;
|
rngp->rng->POWER = 1;
|
||||||
|
|
||||||
if (rngp->config->digital_error_correction)
|
if (rngp->config->digital_error_correction)
|
||||||
rngp->rng->CONFIG |= RNG_CONFIG_DERCEN_Msk;
|
rngp->rng->CONFIG |= RNG_CONFIG_DERCEN_Msk;
|
||||||
else
|
else
|
||||||
rngp->rng->CONFIG &= ~RNG_CONFIG_DERCEN_Msk;
|
rngp->rng->CONFIG &= ~RNG_CONFIG_DERCEN_Msk;
|
||||||
|
|
||||||
rngp->rng->INTENSET = RNG_INTENSET_VALRDY_Msk;
|
rngp->rng->EVENTS_VALRDY = 0;
|
||||||
rngp->rng->TASKS_START = 1;
|
rngp->rng->INTENSET = RNG_INTENSET_VALRDY_Msk;
|
||||||
|
rngp->rng->TASKS_START = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ void rng_lld_start(RNGDriver *rngp) {
|
||||||
*/
|
*/
|
||||||
void rng_lld_stop(RNGDriver *rngp) {
|
void rng_lld_stop(RNGDriver *rngp) {
|
||||||
rngp->rng->TASKS_STOP = 1;
|
rngp->rng->TASKS_STOP = 1;
|
||||||
rngp->rng->POWER = 0;
|
rngp->rng->POWER = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -121,23 +121,27 @@ void rng_lld_stop(RNGDriver *rngp) {
|
||||||
msg_t rng_lld_write(RNGDriver *rngp, uint8_t *buf, size_t n,
|
msg_t rng_lld_write(RNGDriver *rngp, uint8_t *buf, size_t n,
|
||||||
systime_t timeout) {
|
systime_t timeout) {
|
||||||
size_t i;
|
size_t i;
|
||||||
if (n == 0)
|
|
||||||
return MSG_OK;
|
|
||||||
|
|
||||||
NRF_RNG->EVENTS_VALRDY = 0;
|
|
||||||
|
|
||||||
for (i = 0 ; i < n ; i++) {
|
for (i = 0 ; i < n ; i++) {
|
||||||
/* wait for next byte */
|
/* Wait for byte ready
|
||||||
|
* 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 (NRF_RNG->EVENTS_VALRDY == 0) {
|
||||||
|
/* Sleep and wakeup on ARM event (interrupt) */
|
||||||
SCB->SCR |= SCB_SCR_SEVONPEND_Msk;
|
SCB->SCR |= SCB_SCR_SEVONPEND_Msk;
|
||||||
__SEV();
|
__SEV();
|
||||||
__WFE();
|
__WFE();
|
||||||
__WFE();
|
__WFE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read byte */
|
||||||
buf[i] = (char)NRF_RNG->VALUE;
|
buf[i] = (char)NRF_RNG->VALUE;
|
||||||
|
|
||||||
|
/* Mark as read */
|
||||||
NRF_RNG->EVENTS_VALRDY = 0;
|
NRF_RNG->EVENTS_VALRDY = 0;
|
||||||
|
|
||||||
|
/* Clear interrupt so we can wake up again */
|
||||||
nvicClearPending(RNG_IRQn);
|
nvicClearPending(RNG_IRQn);
|
||||||
}
|
}
|
||||||
return MSG_OK;
|
return MSG_OK;
|
||||||
|
|
Loading…
Reference in New Issue