summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-09-12 13:40:06 -0700
committerKeith Packard <keithp@keithp.com>2017-09-12 13:40:06 -0700
commit10d14146ef84fbe4670454bc0996854a4066cfea (patch)
tree1e9c4b3b374dc0739dbc347db6193977b8d28ab6
parent8284ba8bf78aade8f9d8f711cfefe2010ce81066 (diff)
chaoskey: Wait for input data to stabilize before using it
The ADC data takes a while to start working after power on; wait for the range of input values to look reasonable before using the data. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/drivers/ao_trng_send.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/drivers/ao_trng_send.c b/src/drivers/ao_trng_send.c
index b1227aaa..7cda053d 100644
--- a/src/drivers/ao_trng_send.c
+++ b/src/drivers/ao_trng_send.c
@@ -153,10 +153,20 @@ ao_trng_send(void)
ao_crc_reset();
- ao_delay(TRNG_ENABLE_DELAY);
-
for (s = 0; s < AO_TRNG_START_WAIT; s++) {
- if (ao_trng_get_cooked(buffer[0]))
+ int i;
+ uint16_t min, max;
+ uint16_t buf[AO_USB_IN_SIZE>>1];
+
+ ao_trng_get_raw(buf);
+ min = max = buf[0];
+ for (i = 1; i < (AO_USB_IN_SIZE>>1); i++) {
+ uint16_t v = buf[i];
+ if (v < min) min = v;
+ if (v > max) max = v;
+ }
+ /* Wait for at least 10 bits of range */
+ if ((uint16_t) (max - min) >= 1024)
break;
ao_delay(AO_MS_TO_TICKS(10));
}