diff options
Diffstat (limited to 'src/drivers/ao_trng.c')
| -rw-r--r-- | src/drivers/ao_trng.c | 11 | 
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);  | 
