fix race of ADC
authorNIIBE Yutaka <gniibe@fsij.org>
Sat, 17 Aug 2013 06:23:01 +0000 (15:23 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Sat, 17 Aug 2013 06:23:01 +0000 (15:23 +0900)
ChangeLog
src/adc_stm32f103.c

index b1fae81..04f65cf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-08-17  Niibe Yutaka  <gniibe@fsij.org>
+
+       * src/adc_stm32f103.c (adc_wait_completion): Fix race condition.
+       Clear (FLAGS & ~1) only, not all of possible interrupts.
+
 2013-08-16  Niibe Yutaka  <gniibe@fsij.org>
 
        * src/main.c (bDeviceState, fsij_device_state, connected): Protect
@@ -10,9 +15,6 @@
        (usb_cb_handle_event): Likewise.
        (main): Mutual exclusion by USB_MTX.
 
-       * src/adc_stm32f103.c (adc_wait_completion): Fix race condition.
-       Clear FLAGS only, not all of possible interrupts.
-
        * src/usb_lld.h (bDeviceState): Remove.
 
        * src/adc_stm32f103.c (NEUG_DMA_MODE): Merge NEUG_DMA_MODE_SAMPLE
index b96382c..30e5a4f 100644 (file)
@@ -232,7 +232,13 @@ int adc_wait_completion (chopstx_intr_t *intr)
     {
       chopstx_intr_wait (intr);
       flags = DMA1->ISR & STM32_DMA_ISR_MASK; /* Channel 1 interrupt cause.  */
-      DMA1->IFCR = flags; /* Clear interrupt of channel 1.  */
+      /*
+       * Clear interrupt cause of channel 1.
+       *
+       * Note that CGIFx=0, as CGIFx=1 clears all of GIF, HTIF, TCIF
+       * and TEIF.
+       */
+      DMA1->IFCR = (flags & ~1);
 
       if ((flags & STM32_DMA_ISR_TEIF) != 0)  /* DMA errors  */
        {