]> rtime.felk.cvut.cz Git - arc.git/commitdiff
Adc upgrade for 5606 also, fixed so DMA works as well
authorjcar <devnull@localhost>
Wed, 16 Nov 2011 13:52:22 +0000 (14:52 +0100)
committerjcar <devnull@localhost>
Wed, 16 Nov 2011 13:52:22 +0000 (14:52 +0100)
arch/ppc/mpc55xx/drivers/Adc.c

index cd7dfb47f0391f2833d04515222247bdd2906730..3b139c9b60fc4f3691eb6322c8d5cf714bddf795 100644 (file)
@@ -19,7 +19,7 @@
  * The DMA based ADC demands channels being sequential in a group i.e. 1,2,3 or 5,6,7 and NOT 1,3,7.\r
  * This also forbids the use of streamed buffers at the moment. Work is ongoing to correct DMA behaviour.\r
  */\r
-#define DONT_USE_DMA_IN_ADC_MPC5606S\r
+//#define DONT_USE_DMA_IN_ADC_MPC5606S\r
 \r
 /* Are we gonna use Dma? */\r
 #if (  !defined(CFG_MPC5606S) || \\r
@@ -676,6 +676,7 @@ void Adc_GroupConversionComplete (Adc_GroupType group)
 \r
 #if defined(CFG_MPC5606S)\r
                ADC_0.IMR.B.MSKECH = 1;\r
+         ADC_0.MCR.B.NSTART=1;\r
 #else\r
                /* Set single scan enable bit */\r
                EQADC.CFCR[group].B.SSE = 1;\r
@@ -717,6 +718,7 @@ void Adc_GroupConversionComplete (Adc_GroupType group)
 \r
 #if defined(CFG_MPC5606S)\r
                        ADC_0.IMR.B.MSKECH = 1;\r
+                 ADC_0.MCR.B.NSTART=1;\r
 #else\r
                        /* Set single scan enable bit */\r
                        EQADC.CFCR[group].B.SSE = 1;\r
@@ -758,17 +760,18 @@ void Adc_Group0ConversionComplete (void)
        // Check which group is busy, only one is allowed to be busy at a time in a hw unit\r
        for (int group = 0; group < ADC_NBR_OF_GROUPS; group++)\r
        {\r
-         if(AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_BUSY)\r
+         if((AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_BUSY) ||\r
+       (AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_COMPLETED))\r
          {\r
 #if !defined (ADC_USES_DMA)\r
                /* Copy to result buffer */\r
                for(uint8 index=0; index < AdcConfigPtr->groupConfigPtr[group].numberOfChannels; index++)\r
                {\r
-                       currResultBufPtr[index] = ADC_0.CDR[32+AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
+                       AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = ADC_0.CDR[32+AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
                }\r
 #endif\r
 \r
-           Adc_GroupConversionComplete(group);\r
+           Adc_GroupConversionComplete((Adc_GroupType)group);\r
                break;\r
          }\r
        }\r
@@ -821,11 +824,20 @@ void Adc_StartGroupConversion (Adc_GroupType group)
                groupPtr->status->currResultBufPtr = groupPtr->status->resultBufferPtr; /* Set current result buffer */\r
 \r
 #if defined(ADC_USES_DMA)\r
-               Dma_ConfigureChannel ((Dma_TcdType *)groupPtr->groupDMAResults), groupPtr->dmaResultChannel);\r
-               Dma_ConfigureDestinationAddress ((uint32_t)currResultBufPtr, groupPtr->dmaResultChannel);\r
+               Dma_ConfigureChannel ((Dma_TcdType *)groupPtr->groupDMAResults, groupPtr->dmaResultChannel);\r
+               Dma_ConfigureDestinationAddress ((uint32_t)groupPtr->status->currResultBufPtr, groupPtr->dmaResultChannel);\r
 #endif\r
-               /* Set conversion mode. */\r
-               ADC_0.MCR.B.MODE = groupPtr->conversionMode;\r
+               /* Always use single shot in streaming mode */\r
+               if( groupPtr->accessMode == ADC_ACCESS_MODE_STREAMING)\r
+               {\r
+                       /* Set conversion mode. */\r
+                       ADC_0.MCR.B.MODE = ADC_CONV_MODE_ONESHOT;\r
+               }\r
+               else\r
+               {\r
+                       /* Set conversion mode. */\r
+                       ADC_0.MCR.B.MODE = groupPtr->conversionMode;\r
+               }\r
 \r
                /* Enable Overwrite*/\r
                ADC_0.MCR.B.OWREN = 1;\r