summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-02-07 15:33:42 -0800
committerKeith Packard <keithp@keithp.com>2016-02-07 15:42:28 -0800
commit147f0df6a29b37fbfb0824ecd276482f0eecb397 (patch)
treecfe919edcc08c7a84163ffdeb906ac8d5961f07b /src
parent1473f9234ffd34d8f37bc489dfc9fc4d7f1b3eed (diff)
altos: Delay TRNG ADC long enough for HV supply to stabilize
Looks like it takes about 70ms for the supply to start running right, so delay after powering it up for that long. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src')
-rw-r--r--src/drivers/ao_trng_send.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/drivers/ao_trng_send.c b/src/drivers/ao_trng_send.c
index 63366d3e..11f441f8 100644
--- a/src/drivers/ao_trng_send.c
+++ b/src/drivers/ao_trng_send.c
@@ -22,7 +22,8 @@
#include <ao_exti.h>
#include <ao_power.h>
-static uint8_t trng_running;
+static uint8_t trng_running;
+static AO_TICK_TYPE trng_power_time;
static void
ao_trng_send_raw(uint16_t *buf)
@@ -45,7 +46,7 @@ ao_trng_send_cooked(uint16_t *buf)
uint16_t t;
uint32_t *rnd = (uint32_t *) ao_adc_ring;
- t = ao_adc_get(AO_USB_IN_SIZE) >> 1; /* one 16-bit value per output byte */
+ t = ao_adc_get(AO_USB_IN_SIZE) >> 1; /* two 16-bit values per two output bytes */
for (i = 0; i < AO_USB_IN_SIZE / sizeof (uint16_t); i++) {
*buf++ = ao_crc_in_32_out_16(rnd[t]);
t = (t + 1) & ((AO_ADC_RING_SIZE>>1) - 1);
@@ -73,15 +74,26 @@ ao_trng_send(void)
usb_buf_id = 0;
+#ifdef AO_TRNG_ENABLE_PORT
+ ao_gpio_set(AO_TRNG_ENABLE_PORT, AO_TRNG_ENABLE_BIT, AO_TRNG_ENABLE_PIN, 1);
+#endif
+ trng_power_time = ao_time();
+
ao_crc_reset();
for (;;) {
if (!trng_running) {
+ AO_TICK_TYPE delay;
+
+ delay = trng_power_time + AO_MS_TO_TICKS(100) - ao_time();
+ if (delay > AO_MS_TO_TICKS(100))
+ delay = AO_MS_TO_TICKS(100);
+
/* Delay long enough for the HV power supply
* to stabilize so that the first bits we read
* aren't of poor quality
*/
- ao_delay(AO_MS_TO_TICKS(10));
+ ao_delay(delay);
trng_running = TRUE;
}
if (ao_send_raw()) {
@@ -118,6 +130,7 @@ static void ao_trng_resume(void *arg)
#ifdef AO_TRNG_ENABLE_PORT
ao_gpio_set(AO_TRNG_ENABLE_PORT, AO_TRNG_ENABLE_BIT, AO_TRNG_ENABLE_PIN, 1);
#endif
+ trng_power_time = ao_time();
}
static struct ao_power ao_trng_power = {
@@ -131,7 +144,7 @@ void
ao_trng_send_init(void)
{
#ifdef AO_TRNG_ENABLE_PORT
- ao_enable_output(AO_TRNG_ENABLE_PORT, AO_TRNG_ENABLE_BIT, AO_TRNG_ENABLE_PIN, 1);
+ ao_enable_output(AO_TRNG_ENABLE_PORT, AO_TRNG_ENABLE_BIT, AO_TRNG_ENABLE_PIN, 0);
ao_power_register(&ao_trng_power);
#endif
ao_enable_input(AO_RAW_PORT, AO_RAW_BIT, AO_EXTI_MODE_PULL_UP);