altos: Provide ISR-based code paths for SPI
[fw/altos] / src / stm / ao_adc_stm.c
index 1722a9ecdf0698e555969891867f468ea8bf5451..93cf6b6de8f3adfee98e2fb168e7001a8475c114 100644 (file)
@@ -28,11 +28,11 @@ static uint8_t                      ao_adc_ready;
                                 (0 << STM_ADC_CR2_JWSTART) |           \
                                 (STM_ADC_CR2_JEXTEN_DISABLE << STM_ADC_CR2_JEXTEN) | \
                                 (0 << STM_ADC_CR2_JEXTSEL) |           \
-                                (1 << STM_ADC_CR2_ALIGN) |             \
+                                (0 << STM_ADC_CR2_ALIGN) |             \
                                 (0 << STM_ADC_CR2_EOCS) |              \
                                 (1 << STM_ADC_CR2_DDS) |               \
                                 (1 << STM_ADC_CR2_DMA) |               \
-                                (STM_ADC_CR2_DELS_NONE << STM_ADC_CR2_DELS) | \
+                                (STM_ADC_CR2_DELS_UNTIL_READ << STM_ADC_CR2_DELS) | \
                                 (0 << STM_ADC_CR2_CONT) |              \
                                 (1 << STM_ADC_CR2_ADON))
 
@@ -41,7 +41,7 @@ static uint8_t                        ao_adc_ready;
  *
  * Mark time in ring, shut down DMA engine
  */
-static void ao_adc_done(void)
+static void ao_adc_done(int arg)
 {
        ao_adc_ring[ao_adc_head].tick = ao_time();
        ao_adc_head = ao_adc_ring_next(ao_adc_head);
@@ -72,7 +72,7 @@ ao_adc_poll(void)
                            (0 << STM_DMA_CCR_PINC) |
                            (0 << STM_DMA_CCR_CIRC) |
                            (STM_DMA_CCR_DIR_PER_TO_MEM << STM_DMA_CCR_DIR));
-       ao_dma_set_isr(STM_DMA_INDEX(STM_DMA_CHANNEL_ADC1), ao_adc_done);
+       ao_dma_set_isr(STM_DMA_INDEX(STM_DMA_CHANNEL_ADC1), ao_adc_done, 0);
        ao_dma_start(STM_DMA_INDEX(STM_DMA_CHANNEL_ADC1));
 
        stm_adc.cr2 = AO_ADC_CR2_VAL | (1 << STM_ADC_CR2_SWSTART);
@@ -168,10 +168,10 @@ ao_adc_init(void)
                       (0 << STM_ADC_CR1_EOCIE ) |
                       (0 << STM_ADC_CR1_AWDCH ));
 
-       /* 4 cycle sample time for everyone */
-       stm_adc.smpr1 = 0;
-       stm_adc.smpr2 = 0;
-       stm_adc.smpr3 = 0;
+       /* 384 cycle sample time for everyone */
+       stm_adc.smpr1 = 0x3ffff;
+       stm_adc.smpr2 = 0x3fffffff;
+       stm_adc.smpr3 = 0x3fffffff;
 
        stm_adc.sqr1 = ((AO_NUM_ADC - 1) << 20);
        stm_adc.sqr2 = 0;
@@ -221,5 +221,7 @@ ao_adc_init(void)
        /* Clear any stale status bits */
        stm_adc.sr = 0;
        ao_adc_ready = 1;
+
+       ao_dma_alloc(STM_DMA_INDEX(STM_DMA_CHANNEL_ADC1));
        ao_cmd_register(&ao_adc_cmds[0]);
 }