+static void
+ao_trng_status(void)
+{
+ if (ao_failed)
+ printf("FAILED\n");
+ else
+ printf("NOMINAL\n");
+}
+
+void ao_trng_reset(void); /* forward declaration */
+
+static void
+ao_blink_green_toggle(void)
+{
+ ao_blinking_green = !ao_blinking_green;
+ if (!ao_blinking_green)
+ ao_led_off(AO_LED_GREEN);
+ ao_wakeup(&ao_blinking_green);
+}
+
+static const struct ao_cmds ao_trng_cmds[] = {
+ { ao_trng_fetch_cmd, "f <kbytes>\0Fetch a block of numbers" },
+ { ao_trng_reset, "R\0Reset" },
+ { ao_blink_green_toggle, "G\0Toggle green LED blinking" },
+ { ao_trng_status, "s\0Show status" },
+ { ao_trng_failure, "z\0Simulate failure" },
+ { 0, NULL },
+};
+
+#else
+
+static void
+ao_trng_send(void)
+{
+ static uint16_t *buffer[2];
+ int usb_buf_id;
+ uint16_t i;
+ uint16_t *buf;
+ uint16_t t;
+ uint32_t *rnd = (uint32_t *) ao_adc_ring;
+
+ if (!buffer[0]) {
+ buffer[0] = ao_usb_alloc();
+ buffer[1] = ao_usb_alloc();
+ if (!buffer[0])
+ return;
+ }
+
+ usb_buf_id = 0;
+
+ ao_crc_reset();
+
+ for (;;) {
+ ao_led_on(AO_LED_TRNG_ACTIVE);
+ 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[t]);
+ t = (t + 1) & ((AO_ADC_RING_SIZE>>1) - 1);
+ }
+ ao_adc_ack(AO_USB_IN_SIZE);
+ ao_led_off(AO_LED_TRNG_ACTIVE);
+ ao_usb_write(buffer[usb_buf_id], AO_USB_IN_SIZE);
+ usb_buf_id = 1-usb_buf_id;
+ }
+}
+
+static struct ao_task ao_trng_send_task;
+
+static void
+ao_bootloader_cmd(void)
+{
+ for (;;) {
+ getchar(); /* any char will do */
+ /* give feedback we are going into bootloader mode */
+ ao_led_on(AO_LED_GREEN);
+ ao_delay(AO_MS_TO_TICKS(500));
+ ao_led_off(AO_LED_GREEN);
+ ao_delay(AO_MS_TO_TICKS(500));
+ ao_led_on(AO_LED_GREEN);
+ ao_delay(AO_MS_TO_TICKS(500));
+ ao_led_off(AO_LED_GREEN);
+ ao_delay(AO_MS_TO_TICKS(500));
+ ao_led_on(AO_LED_GREEN);
+ ao_delay(AO_MS_TO_TICKS(500));
+ ao_led_off(AO_LED_GREEN);
+ ao_boot_loader();
+ }
+}
+
+static struct ao_task ao_bootloader_cmd_task;
+
+#endif
+
+