update new chopstx and use adc_buf for speed
authorNIIBE Yutaka <gniibe@fsij.org>
Tue, 4 Jun 2013 02:23:00 +0000 (11:23 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Tue, 4 Jun 2013 02:23:00 +0000 (11:23 +0900)
chopstx
src/adc_stm32f103.c
src/main.c

diff --git a/chopstx b/chopstx
index 23d3155..7a09ac9 160000 (submodule)
--- a/chopstx
+++ b/chopstx
@@ -1 +1 @@
-Subproject commit 23d3155f955344252295f99a8cce9ceb19acf6cf
+Subproject commit 7a09ac9a10ece38ec11c9d8588f198eea5c422b1
index 97c5191..f6ce83c 100644 (file)
      | STM32_DMA_CR_MINC       | STM32_DMA_CR_TCIE                     \
      | STM32_DMA_CR_TEIE)
 
+#if 0
 #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_TCIE       | STM32_DMA_CR_TEIE)
+#else
+#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)
+#endif
 
 #define NEUG_ADC_SETTING1_SMPR1 ADC_SMPR1_SMP_VREF(ADC_SAMPLE_VREF)     \
                               | ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_SENSOR)
@@ -139,7 +147,7 @@ void adc_init (void)
 extern uint8_t __process4_stack_base__, __process4_stack_size__;
 const uint32_t __stackaddr_adc = (uint32_t)&__process4_stack_base__;
 const size_t __stacksize_adc = (size_t)&__process4_stack_size__;
-#define PRIO_ADC 1
+#define PRIO_ADC 4
 
 static void adc_lld_serve_rx_interrupt (uint32_t flags);
 
@@ -211,6 +219,7 @@ void adc_start (void)
 static int adc_mode;
 static uint32_t *adc_ptr;
 static int adc_size;
+static uint32_t adc_buf[64];
 
 static void adc_start_conversion_internal (void)
 {
@@ -240,15 +249,15 @@ void adc_start_conversion (int mode, uint32_t *p, int size)
     {
       DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR; /* SetPeripheral */
       DMA1_Channel1->CMAR  = (uint32_t)p; /* SetMemory0 */
-      DMA1_Channel1->CNDTR  = (uint32_t)size / 4; /* size */
+      DMA1_Channel1->CNDTR  = (uint32_t)size / 4; /* counter */
       DMA1_Channel1->CCR  = NEUG_DMA_MODE_SAMPLE; /*mode*/
       DMA1_Channel1->CCR |= DMA_CCR1_EN;                   /* Enable */
     }
   else
     {
       DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR; /* SetPeripheral */
-      DMA1_Channel1->CMAR  = (uint32_t)&CRC->DR; /* SetMemory0 */
-      DMA1_Channel1->CNDTR  = NEUG_CRC32_COUNTS; /* size */
+      DMA1_Channel1->CMAR  = (uint32_t)adc_buf; /* SetMemory0 */
+      DMA1_Channel1->CNDTR  = size; /* counter */
       DMA1_Channel1->CCR  = NEUG_DMA_MODE_CRC32; /*mode*/
       DMA1_Channel1->CCR |= DMA_CCR1_EN;                   /* Enable */
     }
@@ -303,28 +312,23 @@ static void adc_lld_serve_rx_interrupt (uint32_t flags)
 
          if (adc_mode != ADC_SAMPLE_MODE)
            {
-             adc_size -= 4;
-             *adc_ptr++ = CRC->DR;
+             int i;
 
-             if (adc_size > 0)
+             for (i = 0; i < adc_size;)
                {
-                 DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR; /* SetPeripheral */
-                 DMA1_Channel1->CMAR  = (uint32_t)&CRC->DR; /* SetMemory0 */
-                 DMA1_Channel1->CNDTR = NEUG_CRC32_COUNTS; /* size */
-                 DMA1_Channel1->CCR  = NEUG_DMA_MODE_CRC32; /*mode*/
-                 DMA1_Channel1->CCR |= DMA_CCR1_EN;                /* Enable */
-                 adc_start_conversion_internal ();
+                 CRC->DR = adc_buf[i++];
+                 CRC->DR = adc_buf[i++];
+                 CRC->DR = adc_buf[i++];
+                 CRC->DR = adc_buf[i++];
+                 *adc_ptr++ = CRC->DR;
                }
            }
 
-         if (adc_mode == ADC_SAMPLE_MODE || adc_size <= 0)
-           {
-             chopstx_mutex_lock (&adc_mtx);
-             adc_data_available++;
-             if (adc_waiting)
-               chopstx_cond_signal (&adc_cond);
-             chopstx_mutex_unlock (&adc_mtx);
-           }
+         chopstx_mutex_lock (&adc_mtx);
+         adc_data_available++;
+         if (adc_waiting)
+           chopstx_cond_signal (&adc_cond);
+         chopstx_mutex_unlock (&adc_mtx);
        }
     }
 }
index 1be0b4e..177aa1e 100644 (file)
@@ -36,8 +36,7 @@
 #include "adc.h"
 
 chopstx_mutex_t usb_mtx;
-chopstx_cond_t cnd_usb_connection;
-chopstx_cond_t cnd_usb_buffer_ready;
+chopstx_cond_t cnd_usb;
 
 #define ENDP0_RXADDR        (0x40)
 #define ENDP0_TXADDR        (0x80)
@@ -265,7 +264,7 @@ usb_cb_ctrl_write_finish (uint8_t req, uint8_t req_no, uint16_t value,
        {
          /* Force exit from the main loop.  */
          chopstx_mutex_lock (&usb_mtx);
-         chopstx_cond_signal (&cnd_usb_buffer_ready);
+         chopstx_cond_signal (&cnd_usb);
          chopstx_mutex_unlock (&usb_mtx);
        }
     }
@@ -325,7 +324,7 @@ vcom_port_data_setup (uint8_t req, uint8_t req_no, uint16_t value)
 
          chopstx_mutex_lock (&usb_mtx);
          if (connected != connected_saved)
-           chopstx_cond_signal (&cnd_usb_connection);
+           chopstx_cond_signal (&cnd_usb);
          chopstx_mutex_unlock (&usb_mtx);
 
          return USB_SUCCESS;
@@ -631,7 +630,7 @@ void
 EP1_IN_Callback (void)
 {
   chopstx_mutex_lock (&usb_mtx);
-  chopstx_cond_signal (&cnd_usb_buffer_ready);
+  chopstx_cond_signal (&cnd_usb);
   chopstx_mutex_unlock (&usb_mtx);
 }
 
@@ -791,8 +790,7 @@ main (int argc, char **argv)
   chopstx_create (&led_thread, &attr, led_blinker, NULL);
 
   chopstx_mutex_init (&usb_mtx);
-  chopstx_cond_init (&cnd_usb_connection);
-  chopstx_cond_init (&cnd_usb_buffer_ready);
+  chopstx_cond_init (&cnd_usb);
 
   chopstx_attr_setschedparam (&attr, PRIO_USB);
   chopstx_attr_setstack (&attr, __stackaddr_usb, __stacksize_usb);
@@ -879,7 +877,7 @@ main (int argc, char **argv)
          else
            {
              usb_lld_tx_enable (ENDP1, i * 4);
-             chopstx_cond_wait (&cnd_usb_buffer_ready, &usb_mtx);
+             chopstx_cond_wait (&cnd_usb, &usb_mtx);
            }
          chopstx_mutex_unlock (&usb_mtx);