User our own ADC driver
authorNIIBE Yutaka <gniibe@fsij.org>
Tue, 2 Oct 2012 04:33:09 +0000 (13:33 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Tue, 2 Oct 2012 04:33:09 +0000 (13:33 +0900)
ChangeLog
src/Makefile.in
src/adc.h [new file with mode: 0644]
src/adc_stm32f103.c [new file with mode: 0644]
src/chconf.h
src/halconf.h
src/main.c
src/random.c

index c958472..7119a73 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2012-10-02  Niibe Yutaka  <gniibe@fsij.org>
 
+       * src/random.c: Use our own ADC driver.
+
+       * src/halconf.h (HAL_USE_ADC): Set FALSE.
+       (STM32_DMA_REQUIRED): Define here.
+
+       * src/chconf.h (CH_USE_SEMAPHORES): Set FALSE.
+
+       * src/Makefile.in (CSRC): Add adc_stm32f103.c.
+
+       * src/adc.h, src/adc_stm32f103.c: New.
+
        * src/random.c (NEUG_ADC_SETTING1_SMPR1): Tweak.
 
 2012-10-01  Niibe Yutaka  <gniibe@fsij.org>
index 89e7643..2515c3a 100644 (file)
@@ -75,7 +75,8 @@ CSRC = $(PORTSRC) \
        $(BOARDSRC) \
        ../boards/common/board-common.c \
        $(BOARD_DIR)/board.c \
-       sys.c aes-constant-ft.c main.c random.c sha256.c usb_lld.c
+       sys.c aes-constant-ft.c main.c sha256.c usb_lld.c \
+       random.c adc_stm32f103.c
 
 # List ASM source files here
 ASMSRC = $(PORTASM)
diff --git a/src/adc.h b/src/adc.h
new file mode 100644 (file)
index 0000000..0a1d855
--- /dev/null
+++ b/src/adc.h
@@ -0,0 +1,9 @@
+#define ADC_DATA_AVAILABLE ((eventmask_t)1)
+extern Thread *rng_thread;
+
+#define NEUG_SAMPLE_BUFSIZE     512
+extern uint16_t adc_samp[NEUG_SAMPLE_BUFSIZE];
+
+void adc_start (void);
+void adc_start_conversion (int offset, int size);
+void adc_stop (void);
diff --git a/src/adc_stm32f103.c b/src/adc_stm32f103.c
new file mode 100644 (file)
index 0000000..ae32652
--- /dev/null
@@ -0,0 +1,226 @@
+/*
+ * adc_stm32f103.c - ADC driver for STM32F103
+ *
+ * Copyright (C) 2011, 2012 Free Software Initiative of Japan
+ * Author: NIIBE Yutaka <gniibe@fsij.org>
+ *
+ * This file is a part of NeuG, a Random Number Generator
+ * implementation based on quantization error of ADC (for STM32F103).
+ *
+ * NeuG 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, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gnuk 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "ch.h"
+#include "hal.h"
+#include "neug.h"
+#include "adc.h"
+
+#define STM32_ADC_ADC1_DMA_PRIORITY         2
+#define STM32_ADC_ADC1_IRQ_PRIORITY         5
+
+#define ADC_SMPR1_SMP_VREF(n)   ((n) << 21)
+#define ADC_SMPR1_SMP_SENSOR(n) ((n) << 18)
+
+#define ADC_SMPR2_SMP_AN0(n)    ((n) << 0)
+#define ADC_SMPR2_SMP_AN1(n)    ((n) << 3)
+
+#define ADC_SQR1_NUM_CH(n)      (((n) - 1) << 20)
+
+#define ADC_SQR3_SQ1_N(n)       ((n) << 0)
+#define ADC_SQR3_SQ2_N(n)       ((n) << 5)
+#define ADC_SQR3_SQ3_N(n)       ((n) << 10)
+
+#define ADC_SAMPLE_1P5          0
+
+#define ADC_CHANNEL_IN0         0
+#define ADC_CHANNEL_IN1         1
+#define ADC_CHANNEL_SENSOR      16
+#define ADC_CHANNEL_VREFINT     17
+
+#define DELIBARATELY_DO_IT_WRONG_VREF_SAMPLE_TIME
+#define DELIBARATELY_DO_IT_WRONG_START_STOP
+
+#ifdef DELIBARATELY_DO_IT_WRONG_VREF_SAMPLE_TIME
+#define ADC_SAMPLE_VREF ADC_SAMPLE_1P5
+#else
+#define ADC_SAMPLE_VREF ADC_SAMPLE_239P5
+#endif
+
+/*
+ * ADC samples buffer.
+ */
+uint16_t adc_samp[NEUG_SAMPLE_BUFSIZE];
+
+#define NEUG_DMA_CHANNEL STM32_DMA1_STREAM1
+#define NEUG_DMA_MODE (  STM32_DMA_CR_PL (STM32_ADC_ADC1_DMA_PRIORITY)     \
+                      | STM32_DMA_CR_MSIZE_WORD | STM32_DMA_CR_PSIZE_WORD \
+                      | STM32_DMA_CR_MINC       | STM32_DMA_CR_TCIE       \
+                      | STM32_DMA_CR_TEIE)
+
+#define NEUG_ADC_SETTING1_SMPR1 ADC_SMPR1_SMP_VREF(ADC_SAMPLE_VREF)
+#define NEUG_ADC_SETTING1_SMPR2 0
+#define NEUG_ADC_SETTING1_SQR3  ADC_SQR3_SQ1_N(ADC_CHANNEL_VREFINT)
+#define NEUG_ADC_SETTING1_NUM_CHANNELS 1
+
+#if !defined(NEUG_ADC_SETTING2_SMPR1)
+#define NEUG_ADC_SETTING2_SMPR1 0
+#define NEUG_ADC_SETTING2_SMPR2 ADC_SMPR2_SMP_AN0(ADC_SAMPLE_1P5)    \
+                              | ADC_SMPR2_SMP_AN1(ADC_SAMPLE_1P5)
+#define NEUG_ADC_SETTING2_SQR3  ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0)      \
+                              | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN1)
+#define NEUG_ADC_SETTING2_NUM_CHANNELS 2
+#endif
+
+
+/*
+ * Do calibration for both of ADCs.
+ */
+void adc_init (void)
+{
+  chSysLock ();
+  rccEnableAPB2 (RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN, FALSE);
+  ADC1->CR1 = 0;
+  ADC1->CR2 = ADC_CR2_ADON;
+  ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_RSTCAL;
+  while ((ADC1->CR2 & ADC_CR2_RSTCAL) != 0)
+    ;
+  ADC1->CR2 = ADC_CR2_ADON | ADC_CR2_CAL;
+  while ((ADC1->CR2 & ADC_CR2_CAL) != 0)
+    ;
+  ADC1->CR2 = 0;
+
+  ADC2->CR1 = 0;
+  ADC2->CR2 = ADC_CR2_ADON;
+  ADC2->CR2 = ADC_CR2_ADON | ADC_CR2_RSTCAL;
+  while ((ADC2->CR2 & ADC_CR2_RSTCAL) != 0)
+    ;
+  ADC2->CR2 = ADC_CR2_ADON | ADC_CR2_CAL;
+  while ((ADC2->CR2 & ADC_CR2_CAL) != 0)
+    ;
+  ADC2->CR2 = 0;
+  rccDisableAPB2 (RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN, FALSE);
+  chSysUnlock ();
+}
+
+static void adc_lld_serve_rx_interrupt (void *arg, uint32_t flags);
+
+void adc_start (void)
+{
+  dmaStreamAllocate (NEUG_DMA_CHANNEL, STM32_ADC_ADC1_IRQ_PRIORITY,
+                    adc_lld_serve_rx_interrupt, NULL);
+  dmaStreamSetPeripheral (NEUG_DMA_CHANNEL, &ADC1->DR);
+
+  chSysLock ();
+
+  rccEnableAPB2 (RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN, FALSE);
+
+  ADC1->CR1 = (ADC_CR1_DUALMOD_2 | ADC_CR1_DUALMOD_1 | ADC_CR1_DUALMOD_0
+              | ADC_CR1_SCAN);
+  ADC1->CR2 = (ADC_CR2_TSVREFE | ADC_CR2_EXTTRIG | ADC_CR2_SWSTART
+              | ADC_CR2_EXTSEL | ADC_CR2_DMA | ADC_CR2_CONT | ADC_CR2_ADON);
+  ADC1->SMPR1 = NEUG_ADC_SETTING1_SMPR1;
+  ADC1->SMPR2 = NEUG_ADC_SETTING1_SMPR2;
+  ADC1->SQR1 = ADC_SQR1_NUM_CH(NEUG_ADC_SETTING1_NUM_CHANNELS);
+  ADC1->SQR2 = 0;
+  ADC1->SQR3 = NEUG_ADC_SETTING1_SQR3;
+
+  ADC2->CR1 = (ADC_CR1_DUALMOD_2 | ADC_CR1_DUALMOD_1 | ADC_CR1_DUALMOD_0
+              | ADC_CR1_SCAN);
+  ADC2->CR2 = ADC_CR2_EXTTRIG | ADC_CR2_CONT | ADC_CR2_ADON;
+  ADC2->SMPR1 = NEUG_ADC_SETTING2_SMPR1;
+  ADC2->SMPR2 = NEUG_ADC_SETTING2_SMPR2;
+  ADC2->SQR1 = ADC_SQR1_NUM_CH(NEUG_ADC_SETTING2_NUM_CHANNELS);
+  ADC2->SQR2 = 0;
+  ADC2->SQR3 = NEUG_ADC_SETTING2_SQR3;
+
+#ifdef DELIBARATELY_DO_IT_WRONG_START_STOP
+  ADC2->CR2 = 0;
+  ADC1->CR2 = 0;
+#endif
+
+  chSysUnlock ();
+}
+
+void adc_start_conversion (int offset, int size)
+{
+  uint16_t *p = adc_samp + offset;
+
+  dmaStreamSetMemory0 (NEUG_DMA_CHANNEL, p);
+  dmaStreamSetTransactionSize (NEUG_DMA_CHANNEL, size);
+  dmaStreamSetMode (NEUG_DMA_CHANNEL, NEUG_DMA_MODE);
+  dmaStreamEnable (NEUG_DMA_CHANNEL);
+
+#ifdef DELIBARATELY_DO_IT_WRONG_START_STOP
+  /* Power on */
+  ADC2->CR2 = ADC_CR2_EXTTRIG | ADC_CR2_CONT | ADC_CR2_ADON;
+  ADC1->CR2 = (ADC_CR2_TSVREFE | ADC_CR2_EXTTRIG | ADC_CR2_SWSTART
+              | ADC_CR2_EXTSEL | ADC_CR2_DMA | ADC_CR2_CONT | ADC_CR2_ADON);
+  /* Start conversion.  tSTAB is 1uS, but we don't follow the spec.  */
+  ADC2->CR2 = ADC_CR2_EXTTRIG | ADC_CR2_CONT | ADC_CR2_ADON;
+  ADC1->CR2 = (ADC_CR2_TSVREFE | ADC_CR2_EXTTRIG | ADC_CR2_SWSTART
+              | ADC_CR2_EXTSEL | ADC_CR2_DMA | ADC_CR2_CONT | ADC_CR2_ADON);
+#else
+  ADC2->CR2 = ADC_CR2_EXTTRIG | ADC_CR2_CONT | ADC_CR2_ADON;
+  ADC1->CR2 = (ADC_CR2_TSVREFE | ADC_CR2_EXTTRIG | ADC_CR2_SWSTART
+              | ADC_CR2_EXTSEL | ADC_CR2_DMA | ADC_CR2_CONT | ADC_CR2_ADON);
+#endif
+}
+
+static void adc_stop_conversion (void)
+{
+  dmaStreamDisable (NEUG_DMA_CHANNEL);
+#ifdef DELIBARATELY_DO_IT_WRONG_START_STOP
+  ADC1->CR2 = 0;
+  ADC2->CR2 = 0;
+#else
+  ADC2->CR2 &= ~ADC_CR2_CONT;
+  ADC1->CR2 &= ~ADC_CR2_CONT;
+#endif
+}
+
+void adc_stop (void)
+{
+  ADC1->CR1 = 0;
+  ADC1->CR2 = 0;
+
+  ADC2->CR1 = 0;
+  ADC2->CR2 = 0;
+
+  dmaStreamRelease (NEUG_DMA_CHANNEL);
+  rccDisableAPB2 (RCC_APB2ENR_ADC1EN | RCC_APB2ENR_ADC2EN, FALSE);
+}
+
+
+static void adc_lld_serve_rx_interrupt (void *arg, uint32_t flags)
+{
+  (void)arg;
+
+  if ((flags & STM32_DMA_ISR_TEIF) != 0)  /* DMA errors  */
+    {
+      /* access an unmapped address space or violates alignment rules.  */
+      adc_stop_conversion ();
+    }
+  else
+    {
+      if ((flags & STM32_DMA_ISR_TCIF) != 0) /* Transfer complete */
+       {
+         adc_stop_conversion ();
+         chSysLockFromIsr();
+         if (rng_thread)
+           chEvtSignalFlagsI (rng_thread, ADC_DATA_AVAILABLE);
+         chSysUnlockFromIsr();
+       }
+    }
+}
index e26f7fc..82bd9d4 100644 (file)
@@ -11,7 +11,7 @@
 #define CH_OPTIMIZE_SPEED               TRUE
 #define CH_USE_REGISTRY                 TRUE
 #define CH_USE_WAITEXIT                 TRUE
-#define CH_USE_SEMAPHORES               TRUE
+#define CH_USE_SEMAPHORES               FALSE
 #define CH_USE_SEMAPHORES_PRIORITY      FALSE
 #define CH_USE_SEMSW                    FALSE
 #define CH_USE_MUTEXES                  TRUE
index c6a85d5..16fa151 100644 (file)
@@ -6,7 +6,7 @@
 #include "mcuconf.h"
 
 #define HAL_USE_PAL              TRUE
-#define HAL_USE_ADC              TRUE
+#define HAL_USE_ADC              FALSE
 #define HAL_USE_CAN              FALSE
 #define HAL_USE_GPT              FALSE
 #define HAL_USE_I2C              FALSE
@@ -27,5 +27,7 @@
 #define SERIAL_BUFFERS_SIZE         16
 
 
+/* Define manually, as we implement ADC driver by ourselves.  */
+#define STM32_DMA_REQUIRED
 
 #endif /* _HALCONF_H_ */
index 0cc2c87..6b5b814 100644 (file)
@@ -30,6 +30,7 @@
 #include "neug.h"
 #include "usb_lld.h"
 #include "sys.h"
+#include "adc.h"
 
 /*
  * We are trying to avoid dependency to C library. 
@@ -677,8 +678,6 @@ static msg_t led_blinker (void *arg)
 #define RANDOM_BYTES_LENGTH 32
 static uint32_t random_word[RANDOM_BYTES_LENGTH/sizeof (uint32_t)];
 
-extern void adc2_init (void);
-
 /*
  * Entry point.
  *
@@ -693,7 +692,7 @@ main (int argc, char **argv)
   fill_serial_no_by_unique_id ();
 
   halInit ();
-  adc2_init ();
+  adc_init ();
   chSysInit ();
 
   main_thread = chThdSelf ();
index b103a11..39eb1ad 100644 (file)
 #include "ch.h"
 #include "hal.h"
 #include "neug.h"
+#include "adc.h"
 
-static Thread *rng_thread;
+Thread *rng_thread;
 #define ADC_DATA_AVAILABLE ((eventmask_t)1)
 
-/* Depth of the conversion buffer.  */
-#define ADC_GRP1_BUF_DEPTH      256
-
-#define NEUG_ADC_SETTING1_SMPR1 ADC_SMPR1_SMP_VREF(ADC_SAMPLE_1P5)
-#define NEUG_ADC_SETTING1_SMPR2 0
-#define NEUG_ADC_SETTING1_SQR3  ADC_SQR3_SQ1_N(ADC_CHANNEL_VREFINT)
-#define NEUG_ADC_SETTING1_NUM_CHANNELS 1
-
-#if !defined(NEUG_ADC_SETTING2_SMPR1)
-#define NEUG_ADC_SETTING2_SMPR1 0
-#define NEUG_ADC_SETTING2_SMPR2 ADC_SMPR2_SMP_AN0(ADC_SAMPLE_1P5)    \
-                              | ADC_SMPR2_SMP_AN1(ADC_SAMPLE_1P5)
-#define NEUG_ADC_SETTING2_SQR3  ADC_SQR3_SQ1_N(ADC_CHANNEL_IN0)      \
-                              | ADC_SQR3_SQ2_N(ADC_CHANNEL_IN1)
-#define NEUG_ADC_SETTING2_NUM_CHANNELS 2
-#endif
-
-
-void adc2_init (void)
-{
-  chSysLock ();
-  rccEnableAPB2 (RCC_APB2ENR_ADC2EN, FALSE);
-  ADC2->CR1 = 0;
-  ADC2->CR2 = ADC_CR2_ADON;
-  ADC2->CR2 = ADC_CR2_ADON | ADC_CR2_RSTCAL;
-  while ((ADC2->CR2 & ADC_CR2_RSTCAL) != 0)
-    ;
-  ADC2->CR2 = ADC_CR2_ADON | ADC_CR2_CAL;
-  while ((ADC2->CR2 & ADC_CR2_CAL) != 0)
-    ;
-  ADC2->CR2 = 0;
-  rccDisableAPB2 (RCC_APB2ENR_ADC2EN, FALSE);
-  chSysUnlock ();
-}
-
-static void adc2_start (void)
-{
-  chSysLock ();
-
-  rccEnableAPB2 (RCC_APB2ENR_ADC2EN, FALSE);
-
-  ADC2->CR1 = (ADC_CR1_DUALMOD_2 | ADC_CR1_DUALMOD_1 | ADC_CR1_DUALMOD_0
-              | ADC_CR1_SCAN);
-  ADC2->CR2 = ADC_CR2_EXTTRIG | ADC_CR2_CONT | ADC_CR2_ADON;
-  ADC2->SMPR1 = NEUG_ADC_SETTING2_SMPR1;
-  ADC2->SMPR2 = NEUG_ADC_SETTING2_SMPR2;
-  ADC2->SQR1 = ADC_SQR1_NUM_CH(NEUG_ADC_SETTING2_NUM_CHANNELS);
-  ADC2->SQR2 = 0;
-  ADC2->SQR3 = NEUG_ADC_SETTING2_SQR3;
-
-  chSysUnlock ();
-}
-
-static void adc2_start_conversion (void)
-{
-  ADC2->CR2 = ADC_CR2_EXTTRIG | ADC_CR2_CONT | ADC_CR2_ADON;
-}
-
-void adc2_stop_conversion (void)
-{
-  ADC2->CR2 &= ~ADC_CR2_CONT;
-}
-
-static void adc2_stop (void)
-{
-  rccDisableAPB2 (RCC_APB2ENR_ADC2EN, FALSE);
-}
-
-/*
- * ADC samples buffer.
- */
-static adcsample_t samp[ADC_GRP1_BUF_DEPTH * 2];
-static void adccb (ADCDriver *adcp, adcsample_t *buffer, size_t n);
-static void adccb_err (ADCDriver *adcp, adcerror_t err);
-
-/*
- * ADC conversion group.
- * Mode: Dual fast interleaved mode.
- *   ADC1: master.
- *   ADC2: slave.
- * Channels (default settings):
- *   ADC1: two channels of SENSOR and VREF
- *   ADC2: two channels of AN0 and AN1
- */
-static const ADCConversionGroup adcgrpcfg = {
-  FALSE,
-  1,          /* This is 1, even if NEUG_ADC_SETTING1_NUM_CHANNELS > 1.  */
-  adccb,
-  adccb_err,
-  ADC_CR1_DUALMOD_2 | ADC_CR1_DUALMOD_1 | ADC_CR1_DUALMOD_0,
-  ADC_CR2_TSVREFE | ADC_CR2_EXTTRIG | ADC_CR2_SWSTART | ADC_CR2_EXTSEL,
-  NEUG_ADC_SETTING1_SMPR1,
-  NEUG_ADC_SETTING1_SMPR2,
-  ADC_SQR1_NUM_CH(NEUG_ADC_SETTING1_NUM_CHANNELS),
-  0,
-  NEUG_ADC_SETTING1_SQR3
-};
-
-/*
- * ADC end conversion callback.
- */
-static void adccb (ADCDriver *adcp, adcsample_t *buffer, size_t n)
-{
-  (void) buffer; (void) n;
-
-  chSysLockFromIsr();
-  if (adcp->state == ADC_COMPLETE && rng_thread)
-    chEvtSignalFlagsI (rng_thread, ADC_DATA_AVAILABLE);
-  chSysUnlockFromIsr();
-}
-
-static void adccb_err (ADCDriver *adcp, adcerror_t err)
-{
-  (void)adcp;  (void)err;
-}
-\f
 #include "sha256.h"
 
 static sha256_context sha256_ctx_data;
@@ -207,9 +91,9 @@ static uint8_t ep_round;
  */
 static void ep_fill_initial_string (void)
 {
-  memset (samp, 0, 5 * 8 * sizeof (adcsample_t));
-  samp[0] = 1;
-  samp[3*8] = 1;
+  memset (adc_samp, 0, 5 * 8 * sizeof (uint16_t));
+  adc_samp[0] = 1;
+  adc_samp[3*8] = 1;
 }
 
 static void ep_init (int mode)
@@ -218,16 +102,12 @@ static void ep_init (int mode)
   if (mode == NEUG_MODE_RAW_LSB)
     {
       ep_round = EP_ROUND_RAW_LSB;
-      adc2_start_conversion ();
-      adcStartConversion (&ADCD1, &adcgrpcfg, samp,
-                         EP_ROUND_RAW_LSB_INPUTS*8/2);
+      adc_start_conversion (0, EP_ROUND_RAW_LSB_INPUTS*8/2);
     }
   else if (mode == NEUG_MODE_RAW_DATA)
     {
       ep_round = EP_ROUND_RAW_DATA;
-      adc2_start_conversion ();
-      adcStartConversion (&ADCD1, &adcgrpcfg, samp,
-                         EP_ROUND_RAW_DATA_INPUTS*8/2);
+      adc_start_conversion (0, EP_ROUND_RAW_DATA_INPUTS*8/2);
     }
   else
     {
@@ -238,18 +118,16 @@ static void ep_init (int mode)
        * We take LSBs of each samples.
        * Thus, we need tansactions of: required_number_of_input_in_byte*8/2 
        */
-      adc2_start_conversion ();
-      adcStartConversion (&ADCD1, &adcgrpcfg,
-                         &samp[5*8], EP_ROUND_0_INPUTS*8/2);
+      adc_start_conversion (5*8, EP_ROUND_0_INPUTS*8/2);
     }
 }
 
 static uint8_t ep_get_byte_from_samples (int i)
 {
-  return (  ((samp[i*8+0] & 1) << 0) | ((samp[i*8+1] & 1) << 1)
-         | ((samp[i*8+2] & 1) << 2) | ((samp[i*8+3] & 1) << 3)
-         | ((samp[i*8+4] & 1) << 4) | ((samp[i*8+5] & 1) << 5)
-         | ((samp[i*8+6] & 1) << 6) | ((samp[i*8+7] & 1) << 7));
+  return (  ((adc_samp[i*8+0] & 1) << 0) | ((adc_samp[i*8+1] & 1) << 1)
+         | ((adc_samp[i*8+2] & 1) << 2) | ((adc_samp[i*8+3] & 1) << 3)
+         | ((adc_samp[i*8+4] & 1) << 4) | ((adc_samp[i*8+5] & 1) << 5)
+         | ((adc_samp[i*8+6] & 1) << 6) | ((adc_samp[i*8+7] & 1) << 7));
 }
 
 static void noise_source_continuous_test (uint8_t noise);
@@ -257,7 +135,7 @@ static void noise_source_continuous_test (uint8_t noise);
 static void ep_fill_wbuf (int i, int flip, int mode)
 {
   if (mode == NEUG_MODE_RAW_DATA)
-    sha256_ctx_data.wbuf[i] = (samp[i*2+1] << 16) | samp[i*2];
+    sha256_ctx_data.wbuf[i] = (adc_samp[i*2+1] << 16) | adc_samp[i*2];
   else
     {
       uint8_t b0, b1, b2, b3;
@@ -316,8 +194,7 @@ static int ep_process (int mode)
     {
       if (ep_round == EP_ROUND_0)
        {
-         adc2_start_conversion ();
-         adcStartConversion (&ADCD1, &adcgrpcfg, samp, EP_ROUND_1_INPUTS*8/2);
+         adc_start_conversion (0, EP_ROUND_1_INPUTS*8/2);
          sha256_start (&sha256_ctx_data);
          sha256_process (&sha256_ctx_data);
          ep_round++;
@@ -325,8 +202,7 @@ static int ep_process (int mode)
        }
       else if (ep_round == EP_ROUND_1)
        {
-         adc2_start_conversion ();
-         adcStartConversion (&ADCD1, &adcgrpcfg, samp, EP_ROUND_2_INPUTS*8/2);
+         adc_start_conversion (0, EP_ROUND_2_INPUTS*8/2);
          sha256_process (&sha256_ctx_data);
          ep_round++;
          return 0;
@@ -560,13 +436,8 @@ static msg_t rng (void *arg)
 
   rng_thread = chThdSelf ();
 
-  adcStart (&ADCD1, NULL);
-  /* Override DMA settings. */
-  ADCD1.dmamode = STM32_DMA_CR_PL(STM32_ADC_ADC1_DMA_PRIORITY)
-    | STM32_DMA_CR_MSIZE_WORD | STM32_DMA_CR_PSIZE_WORD | STM32_DMA_CR_MINC
-    | STM32_DMA_CR_TCIE       | STM32_DMA_CR_TEIE       | STM32_DMA_CR_EN;
-  /* Enable ADC2 */
-  adc2_start ();
+  /* Enable ADCs */
+  adc_start ();
 
   ep_init (0);
 
@@ -592,8 +463,7 @@ static msg_t rng (void *arg)
       chMtxUnlock ();
     }
 
-  adc2_stop ();
-  adcStop (&ADCD1);
+  adc_stop ();
 
   return 0;
 }