summaryrefslogtreecommitdiff
path: root/src/drivers/ao_trng.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/ao_trng.c')
-rw-r--r--src/drivers/ao_trng.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/drivers/ao_trng.c b/src/drivers/ao_trng.c
index db742928..e69cd30b 100644
--- a/src/drivers/ao_trng.c
+++ b/src/drivers/ao_trng.c
@@ -29,7 +29,8 @@ ao_trng_fetch(void)
int usb_buf_id;
uint16_t i;
uint16_t *buf;
- uint32_t *rnd;
+ uint16_t t;
+ uint32_t *rnd = (uint32_t *) ao_adc_ring;
if (!buffer[0]) {
buffer[0] = ao_usb_alloc();
@@ -50,10 +51,12 @@ ao_trng_fetch(void)
ao_led_on(AO_LED_TRNG_READ);
while (count--) {
- rnd = (uint32_t *) ao_adc_get(AO_USB_IN_SIZE); /* one 16-bit value per output byte */
+ t = ao_adc_get(AO_USB_IN_SIZE) >> 1; /* one 16-bit value per output byte */
buf = buffer[usb_buf_id];
- for (i = 0; i < AO_USB_IN_SIZE / sizeof (uint16_t); i++)
- *buf++ = ao_crc_in_32_out_16(*rnd++);
+ 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);
+ }
ao_adc_ack(AO_USB_IN_SIZE);
ao_led_toggle(AO_LED_TRNG_READ|AO_LED_TRNG_WRITE);
ao_usb_write(buffer[usb_buf_id], AO_USB_IN_SIZE);