cleanup API of ADC
authorNIIBE Yutaka <gniibe@fsij.org>
Fri, 16 Aug 2013 08:22:25 +0000 (17:22 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Fri, 16 Aug 2013 08:22:25 +0000 (17:22 +0900)
ChangeLog
src/adc.h
src/adc_stm32f103.c
src/neug.c
src/neug.h
src/usb_lld.h

index ad0ecd8..d3220b7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2013-08-16  Niibe Yutaka  <gniibe@fsij.org>
+
+       * src/usb_lld.h (bDeviceState): Remove.
+
+       * src/adc_stm32f103.c (NEUG_DMA_MODE): Merge NEUG_DMA_MODE_SAMPLE
+       and NEUG_DMA_MODE_CRC32 which are same value now.
+       (adc_start_conversion_internal): Remove.
+       (adc_start_conversion): Remove MODE, it's not SIZE but COUNT now.
+
+       * src/neug.c (ep_init, ep_process): Follow the change of
+       adc_start_conversion.
+
+       * chopstx: New version of Chopstx.
+
 2013-08-13  Niibe Yutaka  <gniibe@fsij.org>
 
        * src/main.c (struct line_coding): Add packed attribute.
index 1efefce..67367b0 100644 (file)
--- a/src/adc.h
+++ b/src/adc.h
@@ -12,5 +12,5 @@ void adc_stop (void);
 
 extern uint32_t adc_buf[64];
 
-void adc_start_conversion (int mode, int offset, int size);
+void adc_start_conversion (int offset, int count);
 int adc_wait_completion (chopstx_intr_t *intr);
index 7c01e2a..6efcea2 100644 (file)
 #endif
 
 #define NEUG_DMA_CHANNEL STM32_DMA1_STREAM1
-#define NEUG_DMA_MODE_SAMPLE                                            \
+#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_DMA_MODE_CRC32                                             \
-  (  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_TEIE  )
 
 #define NEUG_ADC_SETTING1_SMPR1 ADC_SMPR1_SMP_VREF(ADC_SAMPLE_VREF)     \
                               | ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_SENSOR)
@@ -174,8 +168,13 @@ void adc_start (void)
 
 uint32_t adc_buf[64];
 
-static void adc_start_conversion_internal (void)
+void adc_start_conversion (int offset, int count)
 {
+  DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR;        /* SetPeripheral */
+  DMA1_Channel1->CMAR = (uint32_t)&adc_buf[offset]; /* SetMemory0    */
+  DMA1_Channel1->CNDTR = count;                     /* Counter       */
+  DMA1_Channel1->CCR = NEUG_DMA_MODE | DMA_CCR1_EN; /* Mode   */
+
 #ifdef DELIBARATELY_DO_IT_WRONG_START_STOP
   /* Power on */
   ADC2->CR2 = ADC_CR2_EXTTRIG | ADC_CR2_CONT | ADC_CR2_ADON;
@@ -192,25 +191,6 @@ static void adc_start_conversion_internal (void)
 #endif
 }
 
-void adc_start_conversion (int mode, int offset, int size)
-{
-  DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR; /* SetPeripheral */
-  DMA1_Channel1->CMAR = (uint32_t)&adc_buf[offset]; /* SetMemory0 */
- if (mode == ADC_SAMPLE_MODE)
-    {
-      DMA1_Channel1->CNDTR = (uint32_t)size / 4; /* counter */
-      DMA1_Channel1->CCR = NEUG_DMA_MODE_SAMPLE; /*mode*/
-    }
-  else
-    {
-      DMA1_Channel1->CNDTR = size; /* counter */
-      DMA1_Channel1->CCR = NEUG_DMA_MODE_CRC32; /*mode*/
-    }
- DMA1_Channel1->CCR |= DMA_CCR1_EN;                /* Enable */
-
- adc_start_conversion_internal ();
-}
-
 
 static void adc_stop_conversion (void)
 {
@@ -238,6 +218,8 @@ void adc_stop (void)
 }
 
 
+static uint32_t adc_err;
+
 /*
  * Return 0 on success.
  * Return 1 on error.
@@ -256,6 +238,7 @@ int adc_wait_completion (chopstx_intr_t *intr)
        {
          /* Should never happened.  If any, it's coding error. */
          /* Access an unmapped address space or alignment violation.  */
+         adc_err++;
          adc_stop_conversion ();
          return 1;
        }
@@ -264,5 +247,11 @@ int adc_wait_completion (chopstx_intr_t *intr)
          adc_stop_conversion ();
          return 0;
        }
+
+      /*
+       * Even if STM32_DMA_CR_HTIE is unset, we come here with HTIF=1,
+       * with unknown reason.  Just ignore the interrupt by HTIF to
+       * continue more data.
+       */
     }
 }
index 9bdd153..76b2181 100644 (file)
@@ -121,18 +121,18 @@ static void ep_init (int mode)
   if (mode == NEUG_MODE_RAW)
     {
       ep_round = EP_ROUND_RAW;
-      adc_start_conversion (ADC_CRC32_MODE, 0, EP_ROUND_RAW_INPUTS);
+      adc_start_conversion (0, EP_ROUND_RAW_INPUTS);
     }
   else if (mode == NEUG_MODE_RAW_DATA)
     {
       ep_round = EP_ROUND_RAW_DATA;
-      adc_start_conversion (ADC_SAMPLE_MODE, 0, EP_ROUND_RAW_DATA_INPUTS);
+      adc_start_conversion (0, EP_ROUND_RAW_DATA_INPUTS / 4);
     }
   else
     {
       ep_round = EP_ROUND_0;
       ep_fill_initial_string ();
-      adc_start_conversion (ADC_CRC32_MODE, 2, EP_ROUND_0_INPUTS);
+      adc_start_conversion (2, EP_ROUND_0_INPUTS);
     }
 }
 
@@ -205,7 +205,7 @@ static int ep_process (int mode)
          ep_fill_wbuf_v (i+2, 1, v);
        }
 
-      adc_start_conversion (ADC_CRC32_MODE, 0, EP_ROUND_1_INPUTS);
+      adc_start_conversion (0, EP_ROUND_1_INPUTS);
       sha256_process (&sha256_ctx_data);
       ep_round++;
       return 0;
@@ -222,7 +222,7 @@ static int ep_process (int mode)
          ep_fill_wbuf_v (i, 1, v);
        }
 
-      adc_start_conversion (ADC_CRC32_MODE, 0, EP_ROUND_2_INPUTS + 3);
+      adc_start_conversion (0, EP_ROUND_2_INPUTS + 3);
       sha256_process (&sha256_ctx_data);
       ep_round++;
       return 0;
index 04a223b..f84f0cb 100644 (file)
@@ -3,9 +3,9 @@
 
 #define NEUG_PRE_LOOP 32
 
-#define NEUG_MODE_CONDITIONED 0
-#define NEUG_MODE_RAW         1
-#define NEUG_MODE_RAW_DATA    2
+#define NEUG_MODE_CONDITIONED 0        /* Conditioned data.             */
+#define NEUG_MODE_RAW         1        /* CRC-32 filtered sample data.  */
+#define NEUG_MODE_RAW_DATA    2        /* Sample data directly.         */
 
 extern uint8_t neug_mode;
 extern uint16_t neug_err_cnt;
index b98d267..8dc00b9 100644 (file)
@@ -88,7 +88,6 @@ enum DEVICE_STATE
   CONFIGURED
 };
 
-extern uint32_t bDeviceState;
 extern const uint8_t usb_initial_feature;
 
 #define STM32_USB_IRQ_PRIORITY     11