]> rtime.felk.cvut.cz Git - arc.git/commitdiff
Splitting of Adc to eQADC and Adc_560x
authorjcar <devnull@localhost>
Fri, 17 Feb 2012 08:30:24 +0000 (09:30 +0100)
committerjcar <devnull@localhost>
Fri, 17 Feb 2012 08:30:24 +0000 (09:30 +0100)
arch/ppc/mpc55xx/drivers/Adc_560x.c [new file with mode: 0644]
arch/ppc/mpc55xx/drivers/eQADC.c [moved from arch/ppc/mpc55xx/drivers/Adc.c with 79% similarity]
boards/board_common.mk

diff --git a/arch/ppc/mpc55xx/drivers/Adc_560x.c b/arch/ppc/mpc55xx/drivers/Adc_560x.c
new file mode 100644 (file)
index 0000000..72d1076
--- /dev/null
@@ -0,0 +1,824 @@
+/* -------------------------------- Arctic Core ------------------------------\r
+ * Arctic Core - the open source AUTOSAR platform http://arccore.com\r
+ *\r
+ * Copyright (C) 2009  ArcCore AB <contact@arccore.com>\r
+ *\r
+ * This source code is free software; you can redistribute it and/or modify it\r
+ * under the terms of the GNU General Public License version 2 as published by the\r
+ * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but\r
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r
+ * for more details.\r
+ * -------------------------------- Arctic Core ------------------------------*/\r
+\r
+#include <assert.h>\r
+#include <stdlib.h>\r
+//#include "System.h"\r
+#include "mpc55xx.h"\r
+#include "Modules.h"\r
+#include "Mcu.h"\r
+#include "Adc.h"\r
+#include "Det.h"\r
+#include "Os.h"\r
+#include "isr.h"\r
+#include "irq.h"\r
+#include "arc.h"\r
+\r
+/* Uncomment and use DMA for 5606 only if you now what you are doing */\r
+#define DONT_USE_DMA_IN_ADC_MPC560X\r
+\r
+/* Are we gonna use Dma? */\r
+#if ( defined(CFG_MPC5606S) && !defined(DONT_USE_DMA_IN_ADC_MPC560X) )\r
+       #define ADC_USES_DMA\r
+       #include "Dma.h"\r
+#endif\r
+\r
+#if ( defined(ADC_USES_DMA) && !defined(USE_DMA) )\r
+       #error Adc is configured to use Dma but the module is not enabled.\r
+#endif\r
+\r
+#define ADC_GROUP0             0\r
+\r
+typedef enum\r
+{\r
+  ADC_UNINIT,\r
+  ADC_INIT,\r
+}Adc_StateType;\r
+\r
+/* Function prototypes. */\r
+static void Adc_ConfigureADC (const Adc_ConfigType *ConfigPtr);\r
+static void Adc_ConfigureADCInterrupts (void);\r
+\r
+void Adc_GroupConversionComplete (Adc_GroupType group);\r
+\r
+/* Development error checking. */\r
+static Std_ReturnType Adc_CheckReadGroup (Adc_GroupType group);\r
+static Std_ReturnType Adc_CheckStartGroupConversion (Adc_GroupType group);\r
+static Std_ReturnType Adc_CheckStopGroupConversion (Adc_GroupType group);\r
+static Std_ReturnType Adc_CheckInit (const Adc_ConfigType *ConfigPtr);\r
+#if (ADC_DEINIT_API == STD_ON)\r
+static Std_ReturnType Adc_CheckDeInit (void);\r
+#endif\r
+static Std_ReturnType Adc_CheckSetupResultBuffer (Adc_GroupType group);\r
+static Std_ReturnType Adc_CheckGetStreamLastPointer (Adc_GroupType group);\r
+\r
+/* static variable declarations */\r
+static Adc_StateType adcState = ADC_UNINIT;\r
+static const Adc_ConfigType *AdcConfigPtr;      /* Pointer to configuration structure. */\r
+\r
+/* Validate functions used for development error check */\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+Std_ReturnType ValidateInit(Adc_APIServiceIDType api)\r
+{\r
+       Std_ReturnType res = E_OK;\r
+       if(!(ADC_INIT == adcState)) {\r
+               Det_ReportError(MODULE_ID_ADC,0,api,ADC_E_UNINIT );\r
+               res = E_NOT_OK;\r
+       }\r
+       return res;\r
+}\r
+Std_ReturnType ValidateGroup(Adc_GroupType group,Adc_APIServiceIDType api)\r
+{\r
+       Std_ReturnType res = E_OK;\r
+       if(!((group >= 0) && (group < AdcConfig->nbrOfGroups))) {\r
+               Det_ReportError(MODULE_ID_ADC,0,api,ADC_E_PARAM_GROUP );\r
+               res = E_NOT_OK;\r
+       }\r
+       return res;\r
+}\r
+#endif\r
+\r
+#if (ADC_DEINIT_API == STD_ON)\r
+Std_ReturnType Adc_DeInit (const Adc_ConfigType *ConfigPtr)\r
+{\r
+  (void)ConfigPtr;\r
+\r
+  if (E_OK == Adc_CheckDeInit())\r
+  {\r
+    for(Adc_GroupType group = ADC_GROUP0; group < AdcConfigPtr->nbrOfGroups; group++)\r
+    {\r
+      /* Set group status to idle. */\r
+      AdcConfigPtr->groupConfigPtr[group].status->groupStatus = ADC_IDLE;\r
+    }\r
+\r
+    /* Disable DMA transfer*/\r
+#ifndef CFG_MPC5604B\r
+    ADC_0.DMAE.B.DMAEN = 0;\r
+#endif\r
+    /* Power down ADC */\r
+    ADC_0.MCR.R = 0x0001;\r
+\r
+    /* Disable all interrupt*/\r
+    ADC_0.IMR.R = 0;\r
+\r
+    /* Clean internal status. */\r
+    AdcConfigPtr = (Adc_ConfigType *)NULL;\r
+    adcState = ADC_UNINIT;\r
+  }\r
+\r
+  return (E_OK);\r
+}\r
+#endif\r
+\r
+Std_ReturnType Adc_Init (const Adc_ConfigType *ConfigPtr)\r
+{\r
+  if (E_OK == Adc_CheckInit(ConfigPtr))\r
+  {\r
+            /* First of all, store the location of the configuration data. */\r
+            AdcConfigPtr = ConfigPtr;\r
+\r
+            /* Enable ADC. */\r
+             Adc_ConfigureADC(ConfigPtr);\r
+\r
+             Adc_ConfigureADCInterrupts();\r
+\r
+            /* Move on to INIT state. */\r
+            adcState = ADC_INIT;\r
+            return E_OK;\r
+  }\r
+  else\r
+  {\r
+    return E_NOT_OK;\r
+  }\r
+}\r
+\r
+Std_ReturnType Adc_SetupResultBuffer (Adc_GroupType group, Adc_ValueGroupType *bufferPtr)\r
+{\r
+  Std_ReturnType returnValue = E_NOT_OK;\r
+\r
+  /* Check for development errors. */\r
+  if (E_OK == Adc_CheckSetupResultBuffer (group))\r
+  {\r
+    AdcConfigPtr->groupConfigPtr[group].status->resultBufferPtr = bufferPtr;\r
+    \r
+    returnValue = E_OK;\r
+  }\r
+\r
+  return (returnValue);\r
+}\r
+\r
+Adc_StreamNumSampleType Adc_GetStreamLastPointer(Adc_GroupType group, Adc_ValueGroupType** PtrToSamplePtr)\r
+{\r
+       Adc_StreamNumSampleType nofSample = 0;\r
+       Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
+       \r
+       /** @req ADC216 */\r
+       /* Check for development errors. */\r
+       if ( (E_OK == Adc_CheckGetStreamLastPointer (group)) &&\r
+                (groupPtr->status->groupStatus != ADC_BUSY) )\r
+       {\r
+           /* Set resultPtr to application buffer. */\r
+               if(groupPtr->status->currSampleCount > 0){\r
+                       *PtrToSamplePtr = &groupPtr->status->resultBufferPtr[groupPtr->status->currSampleCount-1];\r
+               }\r
+\r
+           if ((ADC_CONV_MODE_ONESHOT == groupPtr->conversionMode) &&\r
+               (ADC_STREAM_COMPLETED  == groupPtr->status->groupStatus))\r
+           {\r
+                       /** @req ADC327. */\r
+                       groupPtr->status->groupStatus = ADC_IDLE;\r
+           }\r
+           else if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
+                    (ADC_ACCESS_MODE_STREAMING == groupPtr->accessMode) &&\r
+                    (ADC_STREAM_BUFFER_LINEAR == groupPtr->streamBufferMode) &&\r
+                    (ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus))\r
+           {\r
+                       /** @req ADC327. */\r
+                       groupPtr->status->groupStatus = ADC_IDLE;\r
+           }\r
+           else if ( (ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
+                     ((ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus) ||\r
+                      (ADC_COMPLETED           == groupPtr->status->groupStatus)) )\r
+           {\r
+               /* Restart continous mode, and reset result buffer */\r
+               if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
+                   (ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus))\r
+               {\r
+                         /* Start continous conversion again */\r
+                       Adc_StartGroupConversion(group);\r
+               }\r
+                       /** @req ADC326 */\r
+                       /** @req ADC328 */\r
+           }\r
+           else{/* Keep status. */}\r
+       }\r
+       else\r
+       {\r
+               /* Some condition not met */\r
+               *PtrToSamplePtr = NULL;\r
+       }\r
+\r
+       return nofSample;\r
+\r
+}\r
+\r
+#if (ADC_READ_GROUP_API == STD_ON)\r
+Std_ReturnType Adc_ReadGroup (Adc_GroupType group, Adc_ValueGroupType *dataBufferPtr)\r
+{\r
+  Std_ReturnType returnValue = E_OK;\r
+  uint8_t channel;\r
+  Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
+\r
+  if (E_OK == Adc_CheckReadGroup (group))\r
+  {\r
+    /* Copy the result to application buffer. */\r
+    for (channel = 0; channel < groupPtr->numberOfChannels; channel++)\r
+       {\r
+               if(groupPtr->status->currSampleCount > 0){\r
+                       dataBufferPtr[channel] = (&(groupPtr->status->resultBufferPtr[groupPtr->status->currSampleCount-1]))[channel];\r
+               }else{\r
+                       dataBufferPtr[channel] = groupPtr->status->resultBufferPtr[channel];\r
+               }\r
+       }\r
+\r
+    if ((ADC_CONV_MODE_ONESHOT == groupPtr->conversionMode) &&\r
+        (ADC_STREAM_COMPLETED  == groupPtr->status->groupStatus))\r
+    {\r
+               /** @req ADC330. */\r
+               groupPtr->status->groupStatus = ADC_IDLE;\r
+    }\r
+    else if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
+             (ADC_STREAM_BUFFER_LINEAR == groupPtr->streamBufferMode) &&\r
+             (ADC_ACCESS_MODE_STREAMING == groupPtr->accessMode) &&\r
+             (ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus))\r
+    {\r
+               /** @req ADC330. */\r
+               groupPtr->status->groupStatus = ADC_IDLE;\r
+    }\r
+    else if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
+             ((ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus) ||\r
+              (ADC_COMPLETED           == groupPtr->status->groupStatus)))\r
+    {\r
+       /** @req ADC329 */\r
+      /* Restart continous mode, and reset result buffer */\r
+      if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
+          (ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus))\r
+      {\r
+                 /* Start continous conversion again */\r
+       Adc_StartGroupConversion(group);\r
+      }\r
+      /** @req ADC329 */\r
+      /** @req ADC331 */\r
+    }\r
+    else{/* Keep status. */}\r
+  }\r
+  else\r
+  {\r
+    /* An error have been raised from Adc_CheckReadGroup(). */\r
+    returnValue = E_NOT_OK;\r
+  }\r
+\r
+  return (returnValue);\r
+}\r
+#endif\r
+\r
+Adc_StatusType Adc_GetGroupStatus (Adc_GroupType group)\r
+{\r
+       Adc_StatusType returnValue;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+       if( (ValidateInit(ADC_GETGROUPSTATUS_ID) == E_NOT_OK) ||\r
+               (ValidateGroup(group, ADC_GETGROUPSTATUS_ID) == E_NOT_OK))\r
+       {\r
+               returnValue = ADC_IDLE;\r
+       }\r
+       else\r
+       {\r
+               returnValue = AdcConfigPtr->groupConfigPtr[group].status->groupStatus;\r
+       }\r
+#else\r
+  returnValue = AdcConfigPtr->groupConfigPtr[group].status->groupStatus;\r
+#endif\r
+  return (returnValue);\r
+}\r
+\r
+void Adc_GroupConversionComplete (Adc_GroupType group)\r
+{\r
+       Adc_GroupDefType *adcGroup = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
+\r
+  if(ADC_ACCESS_MODE_SINGLE == adcGroup->accessMode )\r
+  {\r
+         adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
+         /* Call notification if enabled. */\r
+       #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
+         if (adcGroup->status->notifictionEnable && adcGroup->groupCallback != NULL)\r
+         {\r
+                 adcGroup->groupCallback();\r
+         }\r
+       #endif\r
+                 /* Disable trigger normal conversions for ADC0 */\r
+                 ADC_0.MCR.B.NSTART=0;\r
+  }\r
+  else\r
+  {\r
+       if(ADC_STREAM_BUFFER_LINEAR == adcGroup->streamBufferMode)\r
+       {\r
+               adcGroup->status->currSampleCount++;\r
+               if(adcGroup->status->currSampleCount < adcGroup->streamNumSamples)\r
+               {\r
+                 adcGroup->status->currResultBufPtr += adcGroup->numberOfChannels;\r
+                 adcGroup->status->groupStatus = ADC_COMPLETED;\r
+\r
+#if defined (ADC_USES_DMA)\r
+                 /* Increase current result buffer ptr */\r
+               Dma_ConfigureDestinationAddress((uint32_t)adcGroup->status->currResultBufPtr, adcGroup->dmaResultChannel);\r
+#endif\r
+\r
+               ADC_0.IMR.B.MSKECH = 1;\r
+           ADC_0.MCR.B.NSTART=1;\r
+               }\r
+               else\r
+               {\r
+                 /* All sample completed. */\r
+                 adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
+\r
+                 /* Call notification if enabled. */\r
+               #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
+                 if (adcGroup->status->notifictionEnable && adcGroup->groupCallback != NULL){\r
+                       adcGroup->groupCallback();\r
+                 }\r
+               #endif\r
+                 /* Disable trigger normal conversions for ADC0 */\r
+                 ADC_0.MCR.B.NSTART=0;\r
+               }\r
+       }\r
+       else if(ADC_STREAM_BUFFER_CIRCULAR == adcGroup->streamBufferMode)\r
+       {\r
+               adcGroup->status->currSampleCount++;\r
+               if(adcGroup->status->currSampleCount < adcGroup->streamNumSamples)\r
+               {\r
+                       adcGroup->status->currResultBufPtr += adcGroup->numberOfChannels;\r
+#if defined (ADC_USES_DMA)\r
+                       /* Increase current result buffer ptr */\r
+                       Dma_ConfigureDestinationAddress((uint32_t)adcGroup->status->currResultBufPtr, adcGroup->dmaResultChannel);\r
+#endif\r
+                       adcGroup->status->groupStatus = ADC_COMPLETED;\r
+\r
+                       ADC_0.IMR.B.MSKECH = 1;\r
+                   ADC_0.MCR.B.NSTART=1;\r
+               }\r
+               else\r
+               {\r
+                 /* Sample completed. */\r
+                 /* Disable trigger normal conversions for ADC*/\r
+                 ADC_0.MCR.B.NSTART=0;\r
+                 adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
+                 /* Call notification if enabled. */\r
+               #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
+                 if (adcGroup->status->notifictionEnable && adcGroup->groupCallback != NULL)\r
+                 {\r
+                         adcGroup->groupCallback();\r
+                 }\r
+               #endif\r
+               }\r
+       }\r
+       else\r
+       {\r
+               //nothing to do.\r
+       }\r
+  }\r
+}\r
+void Adc_Group0ConversionComplete (void)\r
+{\r
+       /* Clear ECH Flag and disable interruput */\r
+       ADC_0.ISR.B.ECH = 1;\r
+       ADC_0.IMR.B.MSKECH = 0;\r
+\r
+       // 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
+       (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
+#if defined(CFG_MPC5606S)\r
+                       AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = ADC_0.CDR[32+AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
+#else\r
+                       AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = ADC_0.CDR[AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
+#endif\r
+               }\r
+#endif\r
+\r
+           Adc_GroupConversionComplete((Adc_GroupType)group);\r
+               break;\r
+         }\r
+       }\r
+}\r
+\r
+void Adc_WatchdogError (void){\r
+}\r
+void Adc_ADCError (void){\r
+}\r
+\r
+static void  Adc_ConfigureADC (const Adc_ConfigType *ConfigPtr)\r
+{\r
+  /* Set ADC CLOCK */\r
+  ADC_0.MCR.B.ADCLKSEL = ConfigPtr->hwConfigPtr->adcPrescale;\r
+\r
+  ADC_0.DSDR.B.DSD = 254;\r
+\r
+  /* Power on ADC */\r
+  ADC_0.MCR.B.PWDN = 0;\r
+\r
+#if defined(ADC_USES_DMA)\r
+  /* Enable DMA. */\r
+  ADC_0.DMAE.B.DMAEN = 1;\r
+#endif\r
+}\r
+\r
+void Adc_ConfigureADCInterrupts (void)\r
+{\r
+       ISR_INSTALL_ISR2(  "Adc_Err", Adc_ADCError, ADC_ER_INT,     2, 0 );\r
+       ISR_INSTALL_ISR2(  "Adc_Grp", Adc_Group0ConversionComplete, ADC_EOC_INT,     2, 0 );\r
+       ISR_INSTALL_ISR2(  "Adc_Wdg", Adc_WatchdogError, ADC_WD_INT,     2, 0 );\r
+}\r
+\r
+#if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON)\r
+void Adc_StartGroupConversion (Adc_GroupType group)\r
+{\r
+       Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
+\r
+       /* Run development error check. */\r
+       if (E_OK == Adc_CheckStartGroupConversion (group))\r
+       {\r
+               /* Disable trigger normal conversions for ADC0 */\r
+               ADC_0.MCR.B.NSTART = 0;\r
+\r
+               /* Set group state to BUSY. */\r
+               groupPtr->status->groupStatus = ADC_BUSY;\r
+\r
+               groupPtr->status->currSampleCount = 0;\r
+               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)groupPtr->status->currResultBufPtr, groupPtr->dmaResultChannel);\r
+#endif\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
+\r
+               /* Set Conversion Time. */\r
+#if defined(CFG_MPC5606S)\r
+               uint32 groupChannelIdMask = 0;\r
+\r
+               ADC_0.CTR[1].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
+               ADC_0.CTR[1].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
+               ADC_0.CTR[1].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
+\r
+               for(uint8 i =0; i < groupPtr->numberOfChannels; i++)\r
+               {\r
+                       groupChannelIdMask |= (1 << groupPtr->channelList[i]);\r
+               }\r
+\r
+#if defined(ADC_USES_DMA)\r
+               ADC_0.DMAE.R = 0x01;\r
+               /* Enable DMA Transfer */\r
+               ADC_0.DMAR[1].R = groupChannelIdMask;\r
+               Dma_StartChannel(DMA_ADC_GROUP0_RESULT_CHANNEL);        /* Enable EDMA channel for ADC */\r
+#endif\r
+\r
+               /* Enable Normal conversion */\r
+               ADC_0.NCMR[1].R = groupChannelIdMask;\r
+\r
+               /* Enable Channel Interrupt */\r
+               ADC_0.CIMR[1].R = groupChannelIdMask;\r
+\r
+#else\r
+               uint32 groupChannelIdMask[3] = {0,0,0};\r
+\r
+               ADC_0.CTR[0].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
+               ADC_0.CTR[0].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
+               ADC_0.CTR[0].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
+               ADC_0.CTR[1].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
+               ADC_0.CTR[1].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
+               ADC_0.CTR[1].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
+               ADC_0.CTR[2].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
+               ADC_0.CTR[2].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
+               ADC_0.CTR[2].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
+\r
+               for(uint8 i =0; i < groupPtr->numberOfChannels; i++)\r
+               {\r
+                       if(groupPtr->channelList[i] <= 15){\r
+                               groupChannelIdMask[0] |= (1 << groupPtr->channelList[i]);\r
+                       }else if((groupPtr->channelList[i] >= 32) && (groupPtr->channelList[i] <=47)){\r
+                               groupChannelIdMask[1] |= (1 << (groupPtr->channelList[i] - 32));\r
+                       }else if((groupPtr->channelList[i] >= 64) && (groupPtr->channelList[i] <=95)){\r
+                               groupChannelIdMask[2] |= (1 << (groupPtr->channelList[i] - 64));\r
+                       }\r
+               }\r
+\r
+               /* Enable Normal conversion */\r
+               ADC_0.NCMR[0].R = groupChannelIdMask[0];\r
+               ADC_0.NCMR[1].R = groupChannelIdMask[1];\r
+               ADC_0.NCMR[2].R = groupChannelIdMask[2];\r
+\r
+               /* Enable Channel Interrupt */\r
+               ADC_0.CIMR[0].R = groupChannelIdMask[0];\r
+               ADC_0.CIMR[1].R = groupChannelIdMask[1];\r
+               ADC_0.CIMR[2].R = groupChannelIdMask[2];\r
+#endif\r
+               /* Clear interrupts */\r
+               ADC_0.ISR.B.ECH = 1;\r
+               /* Enable ECH interrupt */\r
+               ADC_0.IMR.B.MSKECH = 1;\r
+\r
+               /* Trigger normal conversions for ADC0 */\r
+               ADC_0.MCR.B.NSTART = 1;\r
+       }\r
+       else\r
+       {\r
+       /* Error have been set within Adc_CheckStartGroupConversion(). */\r
+       }\r
+}\r
+\r
+void Adc_StopGroupConversion (Adc_GroupType group)\r
+{\r
+  if (E_OK == Adc_CheckStopGroupConversion (group))\r
+  {\r
+       /* Disable trigger normal conversions for ADC0 */\r
+       ADC_0.MCR.B.NSTART = 0;\r
+\r
+       /* Set group state to IDLE. */\r
+       AdcConfigPtr->groupConfigPtr[group].status->groupStatus = ADC_IDLE;\r
+\r
+       /* Disable group notification if enabled. */\r
+    if(1 == AdcConfigPtr->groupConfigPtr[group].status->notifictionEnable){\r
+       Adc_DisableGroupNotification (group);\r
+    }\r
+  }\r
+  else\r
+  {\r
+       /* Error have been set within Adc_CheckStartGroupConversion(). */\r
+  }\r
+}\r
+#endif  /* endof #if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON) */\r
+\r
+#define SYSTEM_CLOCK_DIVIDE(f)    ((f / 2) - 1)\r
+\r
+#if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
+void Adc_EnableGroupNotification (Adc_GroupType group)\r
+{\r
+       Std_ReturnType res;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+       if( (ValidateInit(ADC_ENABLEGROUPNOTIFICATION_ID) == E_NOT_OK) ||\r
+               (ValidateGroup(group, ADC_ENABLEGROUPNOTIFICATION_ID) == E_NOT_OK))\r
+       {\r
+               res = E_NOT_OK;\r
+       }\r
+       else if (AdcConfigPtr->groupConfigPtr[group].groupCallback == NULL)\r
+       {\r
+               res = E_NOT_OK;\r
+               Det_ReportError(MODULE_ID_ADC,0,ADC_ENABLEGROUPNOTIFICATION_ID ,ADC_E_NOTIF_CAPABILITY );\r
+       }\r
+       else\r
+       {\r
+               /* Nothing strange. Go on... */\r
+               res = E_OK;\r
+       }\r
+#else\r
+       res = E_OK;\r
+#endif\r
+       if (E_OK == res){\r
+               AdcConfigPtr->groupConfigPtr[group].status->notifictionEnable = 1;\r
+       }\r
+}\r
+\r
+void Adc_DisableGroupNotification (Adc_GroupType group)\r
+{\r
+       Std_ReturnType res;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+       if( (ValidateInit(ADC_DISABLEGROUPNOTIFICATION_ID) == E_NOT_OK) ||\r
+               (ValidateGroup(group, ADC_DISABLEGROUPNOTIFICATION_ID) == E_NOT_OK))\r
+       {\r
+               res = E_NOT_OK;\r
+       }\r
+       else if (AdcConfigPtr->groupConfigPtr[group].groupCallback == NULL)\r
+       {\r
+               res = E_NOT_OK;\r
+               Det_ReportError(MODULE_ID_ADC,0,ADC_DISABLEGROUPNOTIFICATION_ID ,ADC_E_NOTIF_CAPABILITY );\r
+       }\r
+       else\r
+       {\r
+               /* Nothing strange. Go on... */\r
+               res = E_OK;\r
+       }\r
+#else\r
+       res = E_OK;\r
+#endif\r
+       if (E_OK == res){\r
+               AdcConfigPtr->groupConfigPtr[group].status->notifictionEnable = 0;\r
+       }\r
+}\r
+#endif\r
+\r
+\r
+\r
+/* Development error checking functions. */\r
+#if (ADC_READ_GROUP_API == STD_ON)\r
+static Std_ReturnType Adc_CheckReadGroup (Adc_GroupType group)\r
+{\r
+  Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+\r
+  if( (ValidateInit(ADC_READGROUP_ID) == E_NOT_OK) ||\r
+      (ValidateGroup(group, ADC_READGROUP_ID) == E_NOT_OK))\r
+  {\r
+         returnValue = E_NOT_OK;\r
+  }\r
+  else if (ADC_IDLE == AdcConfigPtr->groupConfigPtr[group].status->groupStatus)\r
+  {\r
+    /* ADC388. */\r
+    returnValue = E_NOT_OK;\r
+    Det_ReportError(MODULE_ID_ADC,0,ADC_READGROUP_ID ,ADC_E_IDLE );\r
+  }\r
+  else\r
+  {\r
+    /* Nothing strange. Go on... */\r
+    returnValue = E_OK;\r
+  }\r
+#endif\r
+  return (returnValue);\r
+}\r
+#endif\r
+\r
+#if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON)\r
+static Std_ReturnType Adc_CheckStartGroupConversion (Adc_GroupType group)\r
+{\r
+  Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+\r
+  if( (ValidateInit(ADC_STARTGROUPCONVERSION_ID) == E_NOT_OK) ||\r
+      (ValidateGroup(group, ADC_STARTGROUPCONVERSION_ID) == E_NOT_OK))\r
+  {\r
+         returnValue = E_NOT_OK;\r
+  }\r
+  else if ( NULL == AdcConfigPtr->groupConfigPtr[group].status->resultBufferPtr )\r
+  {\r
+      /* ResultBuffer not set, ADC424 */\r
+         Det_ReportError(MODULE_ID_ADC,0,ADC_STARTGROUPCONVERSION_ID, ADC_E_BUFFER_UNINIT );\r
+         returnValue = E_NOT_OK;\r
+  }\r
+  else if (!(ADC_TRIGG_SRC_SW == AdcConfigPtr->groupConfigPtr[group].triggerSrc))\r
+  {\r
+    /* Wrong trig source, ADC133. */\r
+    Det_ReportError(MODULE_ID_ADC,0,ADC_STARTGROUPCONVERSION_ID, ADC_E_WRONG_TRIGG_SRC);\r
+    returnValue = E_NOT_OK;\r
+  }\r
+  else if (!((ADC_IDLE             == AdcConfigPtr->groupConfigPtr[group].status->groupStatus) ||\r
+             (ADC_STREAM_COMPLETED == AdcConfigPtr->groupConfigPtr[group].status->groupStatus)))\r
+  {\r
+    /* Group status not OK, ADC351, ADC428 */\r
+    Det_ReportError(MODULE_ID_ADC,0,ADC_STARTGROUPCONVERSION_ID, ADC_E_BUSY );\r
+\r
+    //returnValue = E_NOT_OK;\r
+    returnValue = E_OK;\r
+  }\r
+  else\r
+  {\r
+    returnValue = E_OK;\r
+  }\r
+#endif\r
+\r
+  return (returnValue);\r
+}\r
+\r
+static Std_ReturnType Adc_CheckStopGroupConversion (Adc_GroupType group)\r
+{\r
+  Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+  if( (ValidateInit(ADC_STOPGROUPCONVERSION_ID) == E_NOT_OK) ||\r
+      (ValidateGroup(group, ADC_STOPGROUPCONVERSION_ID) == E_NOT_OK))\r
+  {\r
+         returnValue = E_NOT_OK;\r
+  }\r
+  else if (!(ADC_TRIGG_SRC_SW == AdcConfigPtr->groupConfigPtr[group].triggerSrc))\r
+  {\r
+       /* Wrong trig source, ADC164. */\r
+       Det_ReportError(MODULE_ID_ADC,0,ADC_STOPGROUPCONVERSION_ID, ADC_E_WRONG_TRIGG_SRC);\r
+       returnValue = E_NOT_OK;\r
+  }\r
+  else if (ADC_IDLE == AdcConfigPtr->groupConfigPtr[group].status->groupStatus)\r
+  {\r
+       /* Group status not OK, ADC241 */\r
+       Det_ReportError(MODULE_ID_ADC,0,ADC_STOPGROUPCONVERSION_ID, ADC_E_IDLE );\r
+       returnValue = E_NOT_OK;\r
+  }\r
+  else\r
+  {\r
+       returnValue = E_OK;\r
+  }\r
+#endif\r
+\r
+  return (returnValue);\r
+}\r
+#endif\r
+\r
+static Std_ReturnType Adc_CheckInit (const Adc_ConfigType *ConfigPtr)\r
+{\r
+  Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+  if (!(ADC_UNINIT == adcState))\r
+  {\r
+    /* Oops, already initialised. */\r
+    Det_ReportError(MODULE_ID_ADC,0,ADC_INIT_ID, ADC_E_ALREADY_INITIALIZED );\r
+    returnValue = E_NOT_OK;\r
+  }\r
+  else if (ConfigPtr == NULL)\r
+  {\r
+    /* Wrong config! */\r
+    Det_ReportError(MODULE_ID_ADC,0,ADC_INIT_ID, ADC_E_PARAM_CONFIG );\r
+    returnValue = E_NOT_OK;\r
+  }\r
+  else\r
+  {\r
+    /* Looks good!! */\r
+    returnValue = E_OK;\r
+  }\r
+#endif\r
+  return (returnValue);\r
+}\r
+\r
+#if (ADC_DEINIT_API == STD_ON)\r
+static Std_ReturnType Adc_CheckDeInit (void)\r
+{\r
+       Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+       if(ValidateInit(ADC_DEINIT_ID) == E_OK)\r
+       {\r
+               for (Adc_GroupType group = ADC_GROUP0; group < AdcConfigPtr->nbrOfGroups; group++)\r
+               {\r
+                       /*  Check ADC is IDLE or COMPLETE*/\r
+                       if((AdcConfigPtr->groupConfigPtr[group].status->groupStatus != ADC_IDLE) && (AdcConfigPtr->groupConfigPtr[group].status->groupStatus != ADC_STREAM_COMPLETED))\r
+                       {\r
+                               Det_ReportError(MODULE_ID_ADC,0,ADC_DEINIT_ID, ADC_E_BUSY );\r
+                               returnValue = E_NOT_OK;\r
+                       }\r
+               }\r
+       }\r
+       else\r
+       {\r
+               returnValue = E_NOT_OK;\r
+       }\r
+#endif\r
+       return (returnValue);\r
+}\r
+#endif\r
+\r
+static Std_ReturnType Adc_CheckSetupResultBuffer (Adc_GroupType group)\r
+{\r
+  Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+  if(ValidateGroup(group, ADC_SETUPRESULTBUFFER_ID) == E_NOT_OK)\r
+  {\r
+         returnValue = E_NOT_OK;\r
+  }\r
+#endif\r
+  return (returnValue);\r
+}\r
+\r
+static Std_ReturnType Adc_CheckGetStreamLastPointer (Adc_GroupType group)\r
+{\r
+  Std_ReturnType returnValue = E_OK;\r
+\r
+#if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
+  if( (ValidateInit(ADC_GETSTREAMLASTPOINTER_ID) == E_NOT_OK) ||\r
+         (ValidateGroup(group, ADC_GETSTREAMLASTPOINTER_ID) == E_NOT_OK))\r
+  {\r
+         returnValue = E_NOT_OK;\r
+  }\r
+  else if(AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_IDLE)\r
+  { /** @req ADC215 Check ADC is not in IDLE */\r
+       Det_ReportError(MODULE_ID_ADC,0,ADC_GETSTREAMLASTPOINTER_ID, ADC_E_IDLE );\r
+       returnValue = E_NOT_OK;\r
+  }\r
+#endif\r
+  return (returnValue);\r
+}\r
+\r
+\r
+\r
similarity index 79%
rename from arch/ppc/mpc55xx/drivers/Adc.c
rename to arch/ppc/mpc55xx/drivers/eQADC.c
index c49d97dc9191e2a38e4763a9f2b37d500e887996..b69baf0be0895d25a10f59874b20a14f4b61c546 100644 (file)
 #include "irq.h"\r
 #include "arc.h"\r
 \r
-/* Uncomment and use DMA for 5606 only if you now what you are doing */\r
-#define DONT_USE_DMA_IN_ADC_MPC560X\r
-\r
-/* Are we gonna use Dma? */\r
-#if ( !defined(CFG_MPC560X) || \\r
-      ( defined(CFG_MPC5606S) && !defined(DONT_USE_DMA_IN_ADC_MPC560X) ) )\r
-       #define ADC_USES_DMA\r
-       #include "Dma.h"\r
-#endif\r
+#define ADC_USES_DMA\r
+#include "Dma.h"\r
 \r
 #if ( defined(ADC_USES_DMA) && !defined(USE_DMA) )\r
        #error Adc is configured to use Dma but the module is not enabled.\r
@@ -42,7 +35,6 @@
 \r
 #define ADC_GROUP0             0\r
 \r
-#if !defined(CFG_MPC560X)\r
 typedef union\r
 {\r
   vuint32_t R;\r
@@ -200,7 +192,6 @@ const Dma_TcdType AdcCalibrationDMAResultConfig =
   .INT_MAJ = 0,\r
   .START = 0\r
 };\r
-#endif\r
 \r
 typedef enum\r
 {\r
@@ -209,16 +200,11 @@ typedef enum
 }Adc_StateType;\r
 \r
 /* Function prototypes. */\r
-#if defined(CFG_MPC560X)\r
-static void Adc_ConfigureADC (const Adc_ConfigType *ConfigPtr);\r
-static void Adc_ConfigureADCInterrupts (void);\r
-#else\r
 static void Adc_ConfigureEQADC (const Adc_ConfigType *ConfigPtr);\r
 static void Adc_ConfigureEQADCInterrupts (void);\r
 static void Adc_EQADCCalibrationSequence (void);\r
 static void Adc_WriteEQADCRegister (Adc_EQADCRegisterType reg, Adc_EQADCRegister value);\r
 static Adc_EQADCRegister Adc_ReadEQADCRegister (Adc_EQADCRegisterType reg);\r
-#endif\r
 \r
 void Adc_GroupConversionComplete (Adc_GroupType group);\r
 \r
@@ -263,34 +249,6 @@ Std_ReturnType ValidateGroup(Adc_GroupType group,Adc_APIServiceIDType api)
 Std_ReturnType Adc_DeInit (const Adc_ConfigType *ConfigPtr)\r
 {\r
   (void)ConfigPtr;\r
-#if defined(CFG_MPC560X)\r
-\r
-  if (E_OK == Adc_CheckDeInit())\r
-  {\r
-    for(Adc_GroupType group = ADC_GROUP0; group < AdcConfigPtr->nbrOfGroups; group++)\r
-    {\r
-      /* Set group status to idle. */\r
-      AdcConfigPtr->groupConfigPtr[group].status->groupStatus = ADC_IDLE;\r
-    }\r
-\r
-    /* Disable DMA transfer*/\r
-#ifndef CFG_MPC5604B\r
-    ADC_0.DMAE.B.DMAEN = 0;\r
-#endif\r
-    /* Power down ADC */\r
-    ADC_0.MCR.R = 0x0001;\r
-\r
-    /* Disable all interrupt*/\r
-    ADC_0.IMR.R = 0;\r
-\r
-    /* Clean internal status. */\r
-    AdcConfigPtr = (Adc_ConfigType *)NULL;\r
-    adcState = ADC_UNINIT;\r
-  }\r
-\r
-  return (E_OK);\r
-    \r
-#else\r
 \r
   Adc_eQADCQueueType queue;\r
   Adc_GroupType group;\r
@@ -369,35 +327,11 @@ Std_ReturnType Adc_DeInit (const Adc_ConfigType *ConfigPtr)
     adcState = ADC_UNINIT;\r
   }\r
   return (E_OK);\r
-#endif /* ENDOF defined(CFG_MPC560X) */\r
 }\r
 #endif\r
 \r
 Std_ReturnType Adc_Init (const Adc_ConfigType *ConfigPtr)\r
 {\r
-#if defined(CFG_MPC560X)\r
-\r
-  if (E_OK == Adc_CheckInit(ConfigPtr))\r
-  {\r
-            /* First of all, store the location of the configuration data. */\r
-            AdcConfigPtr = ConfigPtr;\r
-\r
-            /* Enable ADC. */\r
-             Adc_ConfigureADC(ConfigPtr);\r
-\r
-             Adc_ConfigureADCInterrupts();\r
-\r
-            /* Move on to INIT state. */\r
-            adcState = ADC_INIT;\r
-            return E_OK;\r
-  }\r
-  else\r
-  {\r
-    return E_NOT_OK;\r
-  }\r
-\r
-#else\r
-\r
   Std_ReturnType returnValue;\r
   Adc_InternalChannelIdType channel;\r
   Adc_InternalChannelIdType channelId;\r
@@ -482,7 +416,6 @@ Std_ReturnType Adc_Init (const Adc_ConfigType *ConfigPtr)
   }\r
 \r
   return (returnValue);  \r
-#endif  \r
 }\r
 \r
 Std_ReturnType Adc_SetupResultBuffer (Adc_GroupType group, Adc_ValueGroupType *bufferPtr)\r
@@ -649,13 +582,8 @@ void Adc_GroupConversionComplete (Adc_GroupType group)
                  adcGroup->groupCallback();\r
          }\r
        #endif\r
-#if defined(CFG_MPC560X)\r
-                 /* Disable trigger normal conversions for ADC0 */\r
-                 ADC_0.MCR.B.NSTART=0;\r
-#else\r
                  /* Disable trigger. */\r
                  EQADC.CFCR[group].B.MODE = 0;\r
-#endif\r
   }\r
   else\r
   {\r
@@ -672,13 +600,8 @@ void Adc_GroupConversionComplete (Adc_GroupType group)
                Dma_ConfigureDestinationAddress((uint32_t)adcGroup->status->currResultBufPtr, adcGroup->dmaResultChannel);\r
 #endif\r
 \r
-#if defined(CFG_MPC560X)\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
-#endif\r
                }\r
                else\r
                {\r
@@ -691,13 +614,8 @@ void Adc_GroupConversionComplete (Adc_GroupType group)
                        adcGroup->groupCallback();\r
                  }\r
                #endif\r
-#if defined(CFG_MPC560X)\r
-                 /* Disable trigger normal conversions for ADC0 */\r
-                 ADC_0.MCR.B.NSTART=0;\r
-#else\r
                  /* Disable trigger. */\r
                  EQADC.CFCR[group].B.MODE = 0;\r
-#endif\r
                }\r
        }\r
        else if(ADC_STREAM_BUFFER_CIRCULAR == adcGroup->streamBufferMode)\r
@@ -712,24 +630,14 @@ void Adc_GroupConversionComplete (Adc_GroupType group)
 #endif\r
                        adcGroup->status->groupStatus = ADC_COMPLETED;\r
 \r
-#if defined(CFG_MPC560X)\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
-#endif\r
                }\r
                else\r
                {\r
                  /* Sample completed. */\r
-#if defined(CFG_MPC560X)\r
-                 /* Disable trigger normal conversions for ADC*/\r
-                 ADC_0.MCR.B.NSTART=0;\r
-#else\r
                  /* Disable trigger. */\r
                  EQADC.CFCR[group].B.MODE = 0;\r
-#endif\r
                  adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
                  /* Call notification if enabled. */\r
                #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
@@ -746,198 +654,6 @@ void Adc_GroupConversionComplete (Adc_GroupType group)
        }\r
   }\r
 }\r
-#if defined(CFG_MPC560X)\r
-void Adc_Group0ConversionComplete (void)\r
-{\r
-       /* Clear ECH Flag and disable interruput */\r
-       ADC_0.ISR.B.ECH = 1;\r
-       ADC_0.IMR.B.MSKECH = 0;\r
-\r
-       // 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
-       (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
-#if defined(CFG_MPC5606S)\r
-                       AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = ADC_0.CDR[32+AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
-#else\r
-                       AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = ADC_0.CDR[AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
-#endif\r
-               }\r
-#endif\r
-\r
-           Adc_GroupConversionComplete((Adc_GroupType)group);\r
-               break;\r
-         }\r
-       }\r
-}\r
-\r
-void Adc_WatchdogError (void){\r
-}\r
-void Adc_ADCError (void){\r
-}\r
-\r
-static void  Adc_ConfigureADC (const Adc_ConfigType *ConfigPtr)\r
-{\r
-  /* Set ADC CLOCK */\r
-  ADC_0.MCR.B.ADCLKSEL = ConfigPtr->hwConfigPtr->adcPrescale;\r
-\r
-  ADC_0.DSDR.B.DSD = 254;\r
-\r
-  /* Power on ADC */\r
-  ADC_0.MCR.B.PWDN = 0;\r
-\r
-#if defined(ADC_USES_DMA)\r
-  /* Enable DMA. */\r
-  ADC_0.DMAE.B.DMAEN = 1;\r
-#endif\r
-}\r
-\r
-void Adc_ConfigureADCInterrupts (void)\r
-{\r
-       ISR_INSTALL_ISR2(  "Adc_Err", Adc_ADCError, ADC_ER_INT,     2, 0 );\r
-       ISR_INSTALL_ISR2(  "Adc_Grp", Adc_Group0ConversionComplete, ADC_EOC_INT,     2, 0 );\r
-       ISR_INSTALL_ISR2(  "Adc_Wdg", Adc_WatchdogError, ADC_WD_INT,     2, 0 );\r
-}\r
-\r
-#if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON)\r
-void Adc_StartGroupConversion (Adc_GroupType group)\r
-{\r
-       Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
-\r
-       /* Run development error check. */\r
-       if (E_OK == Adc_CheckStartGroupConversion (group))\r
-       {\r
-               /* Disable trigger normal conversions for ADC0 */\r
-               ADC_0.MCR.B.NSTART = 0;\r
-\r
-               /* Set group state to BUSY. */\r
-               groupPtr->status->groupStatus = ADC_BUSY;\r
-\r
-               groupPtr->status->currSampleCount = 0;\r
-               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)groupPtr->status->currResultBufPtr, groupPtr->dmaResultChannel);\r
-#endif\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
-\r
-               /* Set Conversion Time. */\r
-#if defined(CFG_MPC5606S)\r
-               uint32 groupChannelIdMask = 0;\r
-\r
-               ADC_0.CTR[1].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
-               ADC_0.CTR[1].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
-               ADC_0.CTR[1].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
-\r
-               for(uint8 i =0; i < groupPtr->numberOfChannels; i++)\r
-               {\r
-                       groupChannelIdMask |= (1 << groupPtr->channelList[i]);\r
-               }\r
-\r
-#if defined(ADC_USES_DMA)\r
-               ADC_0.DMAE.R = 0x01;\r
-               /* Enable DMA Transfer */\r
-               ADC_0.DMAR[1].R = groupChannelIdMask;\r
-               Dma_StartChannel(DMA_ADC_GROUP0_RESULT_CHANNEL);        /* Enable EDMA channel for ADC */\r
-#endif\r
-\r
-               /* Enable Normal conversion */\r
-               ADC_0.NCMR[1].R = groupChannelIdMask;\r
-\r
-               /* Enable Channel Interrupt */\r
-               ADC_0.CIMR[1].R = groupChannelIdMask;\r
-\r
-#else\r
-               uint32 groupChannelIdMask[3] = {0,0,0};\r
-\r
-               ADC_0.CTR[0].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
-               ADC_0.CTR[0].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
-               ADC_0.CTR[0].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
-               ADC_0.CTR[1].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
-               ADC_0.CTR[1].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
-               ADC_0.CTR[1].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
-               ADC_0.CTR[2].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
-               ADC_0.CTR[2].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
-               ADC_0.CTR[2].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
-\r
-               for(uint8 i =0; i < groupPtr->numberOfChannels; i++)\r
-               {\r
-                       if(groupPtr->channelList[i] <= 15){\r
-                               groupChannelIdMask[0] |= (1 << groupPtr->channelList[i]);\r
-                       }else if((groupPtr->channelList[i] >= 32) && (groupPtr->channelList[i] <=47)){\r
-                               groupChannelIdMask[1] |= (1 << (groupPtr->channelList[i] - 32));\r
-                       }else if((groupPtr->channelList[i] >= 64) && (groupPtr->channelList[i] <=95)){\r
-                               groupChannelIdMask[2] |= (1 << (groupPtr->channelList[i] - 64));\r
-                       }\r
-               }\r
-\r
-               /* Enable Normal conversion */\r
-               ADC_0.NCMR[0].R = groupChannelIdMask[0];\r
-               ADC_0.NCMR[1].R = groupChannelIdMask[1];\r
-               ADC_0.NCMR[2].R = groupChannelIdMask[2];\r
-\r
-               /* Enable Channel Interrupt */\r
-               ADC_0.CIMR[0].R = groupChannelIdMask[0];\r
-               ADC_0.CIMR[1].R = groupChannelIdMask[1];\r
-               ADC_0.CIMR[2].R = groupChannelIdMask[2];\r
-#endif\r
-               /* Clear interrupts */\r
-               ADC_0.ISR.B.ECH = 1;\r
-               /* Enable ECH interrupt */\r
-               ADC_0.IMR.B.MSKECH = 1;\r
-\r
-               /* Trigger normal conversions for ADC0 */\r
-               ADC_0.MCR.B.NSTART = 1;\r
-       }\r
-       else\r
-       {\r
-       /* Error have been set within Adc_CheckStartGroupConversion(). */\r
-       }\r
-}\r
-\r
-void Adc_StopGroupConversion (Adc_GroupType group)\r
-{\r
-  if (E_OK == Adc_CheckStopGroupConversion (group))\r
-  {\r
-       /* Disable trigger normal conversions for ADC0 */\r
-       ADC_0.MCR.B.NSTART = 0;\r
-\r
-       /* Set group state to IDLE. */\r
-       AdcConfigPtr->groupConfigPtr[group].status->groupStatus = ADC_IDLE;\r
-\r
-       /* Disable group notification if enabled. */\r
-    if(1 == AdcConfigPtr->groupConfigPtr[group].status->notifictionEnable){\r
-       Adc_DisableGroupNotification (group);\r
-    }\r
-  }\r
-  else\r
-  {\r
-       /* Error have been set within Adc_CheckStartGroupConversion(). */\r
-  }\r
-}\r
-#endif  /* endof #if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON) */\r
-\r
-#else /* End of mpc5606s unique */\r
 \r
 void Adc_Group0ConversionComplete (void)\r
 {\r
@@ -1340,7 +1056,6 @@ static void Adc_EQADCCalibrationSequence (void)
     assert (0);\r
   }\r
 }\r
-#endif\r
 \r
 #define SYSTEM_CLOCK_DIVIDE(f)    ((f / 2) - 1)\r
 \r
index fa306a4efc9ef47d0736f64b75cf8c85427409fe..56d7f3628d658d7ec4b43214f4a02721ff989d15 100644 (file)
@@ -92,7 +92,9 @@ obj-$(USE_DIO) += Dio_Lcfg.o
 obj-$(USE_PORT) += Port.o\r
 obj-$(USE_PORT) += Port_Cfg.o\r
 \r
-obj-$(USE_ADC) += Adc.o\r
+obj-$(USE_ADC)-$(CFG_MPC560X) += Adc_560x.o\r
+obj-$(USE_ADC)-$(CFG_MPC5516) += eQADC.o\r
+obj-$(USE_ADC)-$(CFG_MPC5567) += eQADC.o\r
 obj-$(USE_ADC) += Adc_Cfg.o\r
 \r
 # J1939Tp\r