altos/chaoskey: Add support for flipping between raw and cooked bits
authorKeith Packard <keithp@keithp.com>
Thu, 28 Jan 2016 08:14:36 +0000 (00:14 -0800)
committerKeith Packard <keithp@keithp.com>
Thu, 28 Jan 2016 08:15:31 +0000 (00:15 -0800)
Plug the 'force bootloader' thing onto the board while it's running
and it will generate raw bits instead of running them through the CRC
to whiten. Useful for validating the raw hardware.

Signed-off-by: Keith Packard <keithp@keithp.com>
ao-bringup/turnon_chaoskey [new file with mode: 0755]
src/chaoskey-v0.1/ao_pins.h
src/drivers/ao_trng_send.c

diff --git a/ao-bringup/turnon_chaoskey b/ao-bringup/turnon_chaoskey
new file mode 100755 (executable)
index 0000000..8c8a675
--- /dev/null
@@ -0,0 +1,50 @@
+#!/bin/sh
+
+if [ -x /usr/bin/ao-flash-stm32f0x ]; then
+       FLASH_STM=/usr/bin/ao-flash-stm32f0x
+else
+       echo "Can't find ao-flash-stm32f0x!  Aborting."
+       exit 1
+fi
+
+if [ -x /usr/bin/ao-usbload ]; then
+       USBLOAD=/usr/bin/ao-usbload
+else
+       echo "Can't find ao-usbload!  Aborting."
+       exit 1
+fi
+
+VERSION=0.1
+PRODUCT=ChaosKey
+
+echo "ChaosKey v$VERSION Turn-On and Calibration Program"
+echo "Copyright 2015 by Keith Packard.  Released under GPL v2"
+echo
+echo "Expectations:"
+echo "\tChaosKey v$VERSION powered from USB"
+echo "\t\twith ST-Link-V2 cabled to debug header"
+echo
+
+
+case $# in
+    1)
+       SERIAL="$1"
+       echo "$PRODUCT-$VERSION serial number: $SERIAL" 
+       ;;
+    0)
+       echo -n "$PRODUCT-$VERSION serial number: "
+       read SERIAL
+       ;;
+    *)
+       echo "Usage: $0 <serial-number>" 1>&2
+       exit 1;
+       ;;
+esac
+
+$FLASH_STM ../src/chaoskey-v$VERSION/flash-loader/chaoskey-v$VERSION-*.elf || exit 1
+
+sleep 2
+
+$USBLOAD --serial=$SERIAL ../src/chaoskey-v$VERSION/chaoskey-v$VERSION*.ihx || exit 1
+
+exit $?
index 8f3eb7b1b7bdf78c1e3896cf811654d6ac06da18..95d9a57604748c9eba0ae02e419bd3e749559840 100644 (file)
 #define AO_CRC_INIT    0xffffffff
 
 /* TRNG */
 #define AO_CRC_INIT    0xffffffff
 
 /* TRNG */
-#define AO_LED_TRNG_ACTIVE     AO_LED_GREEN
+#define AO_LED_TRNG_COOKED     AO_LED_GREEN
+#define AO_LED_TRNG_RAW                AO_LED_RED
+
+/* Mode pin */
+#define AO_RAW_PORT            (&stm_gpioa)
+#define AO_RAW_BIT             15
 
 #endif /* _AO_PINS_H_ */
 
 #endif /* _AO_PINS_H_ */
index bac6035cd8dbde1b09fdb929debc5fc4b67a8c80..64c016b2da6949cf72333f29345b0dd47b84d48e 100644 (file)
 #include <ao_adc_fast.h>
 #include <ao_crc.h>
 #include <ao_trng_send.h>
 #include <ao_adc_fast.h>
 #include <ao_crc.h>
 #include <ao_trng_send.h>
+#include <ao_exti.h>
 
 static void
 
 static void
-ao_trng_send(void)
+ao_trng_send_raw(uint16_t *buf)
+{
+       uint16_t        i;
+       uint16_t        t;
+       uint16_t        *rnd = (uint16_t *) ao_adc_ring;
+
+       t = ao_adc_get(AO_USB_IN_SIZE>>1);      /* one 16-bit value per two output bytes */
+       for (i = 0; i < AO_USB_IN_SIZE / sizeof (uint16_t); i++) {
+               *buf++ = rnd[t];
+               t = (t + 1) & (AO_ADC_RING_SIZE - 1);
+       }
+}
+
+static void
+ao_trng_send_cooked(uint16_t *buf)
 {
 {
-       static uint16_t *buffer[2];
-       int             usb_buf_id;
        uint16_t        i;
        uint16_t        i;
-       uint16_t        *buf;
        uint16_t        t;
        uint32_t        *rnd = (uint32_t *) ao_adc_ring;
 
        uint16_t        t;
        uint32_t        *rnd = (uint32_t *) ao_adc_ring;
 
+       t = ao_adc_get(AO_USB_IN_SIZE) >> 1;    /* one 16-bit value per output byte */
+       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);
+       }
+}
+
+static inline int
+ao_send_raw(void)
+{
+       return !ao_gpio_get(AO_RAW_PORT, AO_RAW_BIT, AO_RAW_PIN);
+}
+
+static void
+ao_trng_send(void)
+{
+       static uint16_t *buffer[2];
+       int     usb_buf_id;
+
        if (!buffer[0]) {
                buffer[0] = ao_usb_alloc();
                buffer[1] = ao_usb_alloc();
        if (!buffer[0]) {
                buffer[0] = ao_usb_alloc();
                buffer[1] = ao_usb_alloc();
@@ -42,15 +73,16 @@ ao_trng_send(void)
        ao_crc_reset();
 
        for (;;) {
        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);
+               if (ao_send_raw()) {
+                       ao_led_on(AO_LED_TRNG_RAW);
+                       ao_trng_send_raw(buffer[usb_buf_id]);
+                       ao_led_off(AO_LED_TRNG_RAW);
+               } else {
+                       ao_led_on(AO_LED_TRNG_COOKED);
+                       ao_trng_send_cooked(buffer[usb_buf_id]);
+                       ao_led_off(AO_LED_TRNG_COOKED);
                }
                ao_adc_ack(AO_USB_IN_SIZE);
                }
                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;
        }
                ao_usb_write(buffer[usb_buf_id], AO_USB_IN_SIZE);
                usb_buf_id = 1-usb_buf_id;
        }
@@ -61,5 +93,6 @@ static struct ao_task ao_trng_send_task;
 void
 ao_trng_send_init(void)
 {
 void
 ao_trng_send_init(void)
 {
+       ao_enable_input(AO_RAW_PORT, AO_RAW_BIT, AO_EXTI_MODE_PULL_UP);
        ao_add_task(&ao_trng_send_task, ao_trng_send, "trng_send");
 }
        ao_add_task(&ao_trng_send_task, ao_trng_send, "trng_send");
 }