altos/usbtrng: Split out random number generating code to separate driver
authorKeith Packard <keithp@keithp.com>
Sun, 1 Mar 2015 00:06:23 +0000 (16:06 -0800)
committerKeith Packard <keithp@keithp.com>
Sun, 1 Mar 2015 00:10:10 +0000 (16:10 -0800)
Signed-off-by: Keith Packard <keithp@keithp.com>
src/drivers/ao_trng.c [new file with mode: 0644]
src/drivers/ao_trng.h [new file with mode: 0644]
src/usbtrng-v2.0/Makefile
src/usbtrng-v2.0/ao_pins.h
src/usbtrng-v2.0/ao_usbtrng.c

diff --git a/src/drivers/ao_trng.c b/src/drivers/ao_trng.c
new file mode 100644 (file)
index 0000000..db74292
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright © 2015 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <ao.h>
+#include <ao_adc_fast.h>
+#include <ao_crc.h>
+#include <ao_trng.h>
+
+static void
+ao_trng_fetch(void)
+{
+       static uint16_t *buffer[2];
+       uint32_t        kbytes = 1;
+       uint32_t        count;
+       int             usb_buf_id;
+       uint16_t        i;
+       uint16_t        *buf;
+       uint32_t        *rnd;
+
+       if (!buffer[0]) {
+               buffer[0] = ao_usb_alloc();
+               buffer[1] = ao_usb_alloc();
+               if (!buffer[0])
+                       return;
+       }
+
+       ao_cmd_decimal();
+       if (ao_cmd_status == ao_cmd_success)
+               kbytes = ao_cmd_lex_u32;
+       else
+               ao_cmd_status = ao_cmd_success;
+       usb_buf_id = 0;
+       count = kbytes * (1024/AO_USB_IN_SIZE);
+
+       ao_crc_reset();
+
+       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 */
+               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++);
+               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);
+               ao_led_toggle(AO_LED_TRNG_READ|AO_LED_TRNG_WRITE);
+               usb_buf_id = 1-usb_buf_id;
+       }
+       ao_led_off(AO_LED_TRNG_READ|AO_LED_TRNG_WRITE);
+       flush();
+}
+
+static const struct ao_cmds ao_trng_cmds[] = {
+       { ao_trng_fetch,        "f <kbytes>\0Fetch a block of numbers" },
+       { 0, NULL },
+};
+
+void
+ao_trng_init(void)
+{
+       ao_cmd_register(ao_trng_cmds);
+}
diff --git a/src/drivers/ao_trng.h b/src/drivers/ao_trng.h
new file mode 100644 (file)
index 0000000..7857742
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright © 2015 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_TRNG_H_
+#define _AO_TRNG_H_
+
+void
+ao_trng_init(void);
+
+#endif /* _AO_TRNG_H_ */
index abbdbbcc1207cb30c56755e2fe6da99c82e78027..49798f1c85aa8ae6749e680d75151ff7aa44b897 100644 (file)
@@ -12,6 +12,7 @@ INC = \
        ao_pins.h \
        ao_product.h \
        ao_task.h \
        ao_pins.h \
        ao_product.h \
        ao_task.h \
+       ao_adc_fast.h \
        stm32f0.h
 
 #
        stm32f0.h
 
 #
@@ -31,6 +32,7 @@ ALTOS_SRC = \
        ao_boot_chain.c \
        ao_cmd.c \
        ao_usb_stm.c \
        ao_boot_chain.c \
        ao_cmd.c \
        ao_usb_stm.c \
+       ao_trng.c \
        ao_task.c \
        ao_product.c
 
        ao_task.c \
        ao_product.c
 
index 2375944438c88f635afddc48e515f3479626f64b..1997d2052a49d37ccde48087416c7c67a4fc2c75 100644 (file)
@@ -60,4 +60,8 @@
 #define AO_CRC_WIDTH   32
 #define AO_CRC_INIT    0xffffffff
 
 #define AO_CRC_WIDTH   32
 #define AO_CRC_INIT    0xffffffff
 
+/* TRNG */
+#define AO_LED_TRNG_READ       AO_LED_RED
+#define AO_LED_TRNG_WRITE      AO_LED_GREEN
+
 #endif /* _AO_PINS_H_ */
 #endif /* _AO_PINS_H_ */
index e1f43cdd17fd2a4062717ec70220aaa3f773f960..42713b6ec842fb2023e9e4441527cdbdf6e5ed08 100644 (file)
 #include <ao.h>
 #include <ao_adc_fast.h>
 #include <ao_crc.h>
 #include <ao.h>
 #include <ao_adc_fast.h>
 #include <ao_crc.h>
-
-static void
-ao_trng_fetch(void)
-{
-       static uint16_t *buffer[2];
-       uint32_t        kbytes = 1;
-       uint32_t        count;
-       int             usb_buf_id;
-       int             i;
-       uint16_t        *buf;
-       uint32_t        *rnd;
-
-       if (!buffer[0]) {
-               buffer[0] = ao_usb_alloc();
-               buffer[1] = ao_usb_alloc();
-               if (!buffer[0])
-                       return;
-       }
-
-       ao_cmd_decimal();
-       if (ao_cmd_status == ao_cmd_success)
-               kbytes = ao_cmd_lex_u32;
-       else
-               ao_cmd_status = ao_cmd_success;
-       usb_buf_id = 0;
-       count = kbytes * (1024/AO_USB_IN_SIZE);
-
-       ao_crc_reset();
-
-       ao_led_on(AO_LED_GREEN);
-       while (count--) {
-               buf = buffer[usb_buf_id];
-//             printf ("before get: head %3d tail %3d running %d\n", ao_adc_ring_head, ao_adc_ring_tail, ao_adc_running); flush();
-               rnd = (uint32_t *) ao_adc_get(AO_USB_IN_SIZE);  /* one 16-bit value per output byte */
-//             printf ("after get: head %3d tail %3d running %d\n", ao_adc_ring_head, ao_adc_ring_tail, ao_adc_running); flush();
-               for (i = 0; i < 32; i++)
-                       *buf++ = ao_crc_in_32_out_16(*rnd++);
-               ao_adc_ack(AO_USB_IN_SIZE);
-//             printf ("after ack: head %3d tail %3d running %d\n", ao_adc_ring_head, ao_adc_ring_tail, ao_adc_running); flush();
-               ao_led_toggle(AO_LED_GREEN|AO_LED_RED);
-               ao_usb_write(buffer[usb_buf_id], AO_USB_IN_SIZE);
-               ao_led_toggle(AO_LED_GREEN|AO_LED_RED);
-               usb_buf_id = 1-usb_buf_id;
-       }
-       ao_led_off(AO_LED_GREEN|AO_LED_RED);
-       flush();
-}
-
-static const struct ao_cmds usbtrng_cmds[] = {
-       { ao_trng_fetch,        "f <kbytes>\0Fetch a block of numbers" },
-       { 0, NULL },
-};
+#include <ao_trng.h>
 
 void main(void)
 {
 
 void main(void)
 {
@@ -86,7 +35,8 @@ void main(void)
 
        ao_usb_init();
 
 
        ao_usb_init();
 
-       ao_cmd_register(usbtrng_cmds);
+       ao_trng_init();
+
        ao_led_off(AO_LED_RED);
 
        ao_start_scheduler();
        ao_led_off(AO_LED_RED);
 
        ao_start_scheduler();