chaoskey: Wait for input data to stabilize before using it
[fw/altos] / src / drivers / ao_trng_send.c
index 85034efd767f7337ebbabbff75a428fccd6b8e73..7cda053d3ff2263d9bb7c89b55d6947a786b52d1 100644 (file)
@@ -104,7 +104,7 @@ ao_trng_get_cooked(uint16_t *buf)
 {
        uint16_t        i;
        uint16_t        t;
-       uint32_t        *rnd = (uint32_t *) ao_adc_ring;
+       uint32_t        *rnd = (uint32_t *) (void *) ao_adc_ring;
        uint8_t         mismatch = 0;
 
        t = ao_adc_get(AO_USB_IN_SIZE) >> 1;            /* one 16-bit value per output byte */
@@ -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));
        }