summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-01-28 00:14:36 -0800
committerKeith Packard <keithp@keithp.com>2016-01-28 00:15:31 -0800
commitf2d3202de9a5847923f72afe2969eb7ccd7342c7 (patch)
treefcc2978cf91666fe078e7d2405b0ceedfc796eb7
parent02fd767ab60a9957faa2bff29c62ed954abc34e7 (diff)
altos/chaoskey: Add support for flipping between raw and cooked bits
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>
-rwxr-xr-xao-bringup/turnon_chaoskey50
-rw-r--r--src/chaoskey-v0.1/ao_pins.h7
-rw-r--r--src/drivers/ao_trng_send.c55
3 files changed, 100 insertions, 12 deletions
diff --git a/ao-bringup/turnon_chaoskey b/ao-bringup/turnon_chaoskey
new file mode 100755
index 00000000..8c8a6758
--- /dev/null
+++ b/ao-bringup/turnon_chaoskey
@@ -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 $?
diff --git a/src/chaoskey-v0.1/ao_pins.h b/src/chaoskey-v0.1/ao_pins.h
index 8f3eb7b1..95d9a576 100644
--- a/src/chaoskey-v0.1/ao_pins.h
+++ b/src/chaoskey-v0.1/ao_pins.h
@@ -67,6 +67,11 @@
#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_ */
diff --git a/src/drivers/ao_trng_send.c b/src/drivers/ao_trng_send.c
index bac6035c..64c016b2 100644
--- a/src/drivers/ao_trng_send.c
+++ b/src/drivers/ao_trng_send.c
@@ -19,17 +19,48 @@
#include <ao_adc_fast.h>
#include <ao_crc.h>
#include <ao_trng_send.h>
+#include <ao_exti.h>
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 *buf;
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();
@@ -42,15 +73,16 @@ ao_trng_send(void)
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_led_off(AO_LED_TRNG_ACTIVE);
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)
{
+ 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");
}