]> rtime.felk.cvut.cz Git - arc.git/blobdiff - arch/ppc/mpc55xx/drivers/Adc_560x.c
Adc, fix for mpc5668.
[arc.git] / arch / ppc / mpc55xx / drivers / Adc_560x.c
index 953ac7b4a7010f02fb624aae484db172c6c3200d..bb8633ebe880fba31015d4604f027c9dc478221e 100644 (file)
        #error Adc is configured to use Dma but the module is not enabled.\r
 #endif\r
 \r
+\r
 #if defined(CFG_MPC5668)\r
-#define ADC_0                          ADC\r
+#define ADC0_EOC_INT   ADC_A_EOC\r
+#define ADC0_ER_INT            ADC_A_ERR\r
+#define        ADC0_WD_INT             ADC_A_WD\r
+#define ADC1_EOC_INT   ADC_B_EOC\r
+#define ADC1_ER_INT            ADC_B_ERR\r
+#define        ADC1_WD_INT             ADC_B_WD\r
 #endif\r
 \r
 #if defined(CFG_MPC5668)\r
-#define ADC_EOC_INT    ADC_A_EOC\r
-#define ADC_ER_INT             ADC_A_ERR\r
-#define        ADC_WD_INT              ADC_A_WD\r
+#define ADC_BASE_ADDRESS 0xFFF80000\r
+#else\r
+#define ADC_BASE_ADDRESS 0xFFE00000\r
 #endif\r
 \r
 #define GET_HW_CONTROLLER(_controller)         \\r
-                                               ((struct ADC_tag *)(0xFFE00000 + 0x4000*(_controller)))\r
+                                               ((struct ADC_tag *)(ADC_BASE_ADDRESS + 0x4000*(_controller)))\r
 \r
-#define GET_HWUNITID_FROM_GROUP(_group) (_group / NOF_GROUP_PER_CONTROLLER)\r
+#define GET_HWUNITID_FROM_GROUP(_group) (_group / ADC_NOF_GROUP_PER_CONTROLLER)\r
 \r
 /* ----------------------------[private macro]-------------------------------*/\r
 /* ----------------------------[private typedef]-----------------------------*/\r
@@ -84,10 +90,12 @@ static const Adc_ConfigType * Adc_GetControllerConfigPtrFromHwUnitId(int unit)
 {\r
        const Adc_ConfigType *AdcConfigPtr = NULL;\r
 \r
-       for (int configId = 0; configId < ADC_ARC_CTRL_CONFIG_CNT; configId++) {\r
-               if(unit == AdcGlobalConfigPtr[configId].hwConfigPtr->hwUnitId){\r
-                       AdcConfigPtr = &AdcGlobalConfigPtr[configId];\r
-      break;\r
+       if(adcState == ADC_INIT){\r
+               for (int configId = 0; configId < ADC_ARC_CTRL_CONFIG_CNT; configId++) {\r
+                       if(unit == AdcGlobalConfigPtr[configId].hwConfigPtr->hwUnitId){\r
+                               AdcConfigPtr = &AdcGlobalConfigPtr[configId];\r
+                               break;\r
+                       }\r
                }\r
        }\r
 \r
@@ -107,11 +115,11 @@ void Adc_DeInit ()
   boolean okToClear = TRUE;\r
 \r
   for (int configId = 0; configId < ADC_ARC_CTRL_CONFIG_CNT; configId++) {\r
-         hwPtr = GET_HW_CONTROLLER(AdcGlobalConfigPtr[configId].hwConfigPtr->hwUnitId);\r
          const Adc_ConfigType *AdcConfigPtr = &AdcGlobalConfigPtr[configId];\r
 \r
          if (E_OK == Adc_CheckDeInit(adcState, AdcConfigPtr))\r
          {\r
+               hwPtr = GET_HW_CONTROLLER(AdcGlobalConfigPtr[configId].hwConfigPtr->hwUnitId);\r
                for(Adc_GroupType group = (Adc_GroupType)0; group < AdcConfigPtr->nbrOfGroups; group++)\r
                {\r
                  /* Set group status to idle. */\r
@@ -175,7 +183,7 @@ Std_ReturnType Adc_SetupResultBuffer (Adc_GroupType group, Adc_ValueGroupType *b
   /* Check for development errors. */\r
   if (E_OK == Adc_CheckSetupResultBuffer (adcState, AdcConfigPtr, group))\r
   {\r
-    AdcConfigPtr->groupConfigPtr[group%NOF_GROUP_PER_CONTROLLER].status->resultBufferPtr = bufferPtr;\r
+    AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->resultBufferPtr = bufferPtr;\r
     \r
     returnValue = E_OK;\r
   }\r
@@ -186,49 +194,56 @@ Std_ReturnType Adc_SetupResultBuffer (Adc_GroupType group, Adc_ValueGroupType *b
 Adc_StreamNumSampleType Adc_GetStreamLastPointer(Adc_GroupType group, Adc_ValueGroupType** PtrToSamplePtr)\r
 {\r
        const Adc_ConfigType *AdcConfigPtr = Adc_GetControllerConfigPtrFromGroupId(group);\r
-\r
        Adc_StreamNumSampleType nofSample = 0;\r
-       Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group%NOF_GROUP_PER_CONTROLLER];\r
        \r
        /** @req ADC216 */\r
        /* Check for development errors. */\r
-       if ( (E_OK == Adc_CheckGetStreamLastPointer (adcState, AdcConfigPtr, group)) &&\r
-                (groupPtr->status->groupStatus != ADC_BUSY) )\r
+       if (E_OK == Adc_CheckGetStreamLastPointer (adcState, AdcConfigPtr, group))\r
        {\r
-           /* Set resultPtr to application buffer. */\r
-               if(groupPtr->status->currSampleCount > 0){\r
-                       *PtrToSamplePtr = &groupPtr->status->resultBufferPtr[groupPtr->status->currSampleCount-1];\r
-               }\r
+               Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER];\r
 \r
-           if ((ADC_CONV_MODE_ONESHOT == groupPtr->conversionMode) &&\r
-               (ADC_STREAM_COMPLETED  == groupPtr->status->groupStatus))\r
+               if (groupPtr->status->groupStatus != ADC_BUSY)\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
+                       /* 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{/* Keep status. */}\r
+               else\r
+               {\r
+                       /* Some condition not met */\r
+                       *PtrToSamplePtr = NULL;\r
+               }\r
        }\r
        else\r
        {\r
@@ -246,10 +261,11 @@ Std_ReturnType Adc_ReadGroup (Adc_GroupType group, Adc_ValueGroupType *dataBuffe
   Std_ReturnType returnValue = E_OK;\r
   uint8_t channel;\r
   const Adc_ConfigType *AdcConfigPtr = Adc_GetControllerConfigPtrFromGroupId(group);\r
-  Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group%NOF_GROUP_PER_CONTROLLER];\r
 \r
   if (E_OK == Adc_CheckReadGroup (adcState, AdcConfigPtr, group))\r
   {\r
+       Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER];\r
+\r
     /* Copy the result to application buffer. */\r
     for (channel = 0; channel < groupPtr->numberOfChannels; channel++)\r
        {\r
@@ -303,7 +319,7 @@ Std_ReturnType Adc_ReadGroup (Adc_GroupType group, Adc_ValueGroupType *dataBuffe
 \r
 void Adc_GroupConversionComplete (Adc_GroupType group, const Adc_ConfigType *AdcConfigPtr, volatile struct ADC_tag *hwPtr)\r
 {\r
-  Adc_GroupDefType *adcGroup = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group%NOF_GROUP_PER_CONTROLLER];\r
+  Adc_GroupDefType *adcGroup = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER];\r
 \r
   if(ADC_ACCESS_MODE_SINGLE == adcGroup->accessMode )\r
   {\r
@@ -403,7 +419,7 @@ void Adc_Group0ConversionComplete (int unit)
        hwPtr->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
+       for (int group = 0; group < AdcConfigPtr->nbrOfGroups; group++)\r
        {\r
          if((AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_BUSY) ||\r
        (AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_COMPLETED))\r
@@ -481,13 +497,14 @@ void Adc_ConfigureADCInterrupts (const Adc_ConfigType *AdcConfigPtr)
 void Adc_StartGroupConversion (Adc_GroupType group)\r
 {\r
        const Adc_ConfigType *AdcConfigPtr = Adc_GetControllerConfigPtrFromGroupId(group);\r
-       volatile struct ADC_tag *hwPtr = GET_HW_CONTROLLER(AdcConfigPtr->hwConfigPtr->hwUnitId);\r
-\r
-       Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group%NOF_GROUP_PER_CONTROLLER];\r
 \r
        /* Run development error check. */\r
        if (E_OK == Adc_CheckStartGroupConversion (adcState, AdcConfigPtr, group))\r
        {\r
+               volatile struct ADC_tag *hwPtr = GET_HW_CONTROLLER(AdcConfigPtr->hwConfigPtr->hwUnitId);\r
+\r
+               Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER];\r
+\r
                /* Disable trigger normal conversions for ADC0 */\r
                hwPtr->MCR.B.NSTART = 0;\r
 \r
@@ -597,18 +614,19 @@ void Adc_StartGroupConversion (Adc_GroupType group)
 void Adc_StopGroupConversion (Adc_GroupType group)\r
 {\r
   const Adc_ConfigType *AdcConfigPtr = Adc_GetControllerConfigPtrFromGroupId(group);\r
-  volatile struct ADC_tag *hwPtr = GET_HW_CONTROLLER(AdcConfigPtr->hwConfigPtr->hwUnitId);\r
 \r
   if (E_OK == Adc_CheckStopGroupConversion (adcState, AdcConfigPtr, group))\r
   {\r
+       volatile struct ADC_tag *hwPtr = GET_HW_CONTROLLER(AdcConfigPtr->hwConfigPtr->hwUnitId);\r
+\r
        /* Disable trigger normal conversions for ADC0 */\r
        hwPtr->MCR.B.NSTART = 0;\r
 \r
        /* Set group state to IDLE. */\r
-       AdcConfigPtr->groupConfigPtr[group%NOF_GROUP_PER_CONTROLLER].status->groupStatus = ADC_IDLE;\r
+       AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->groupStatus = ADC_IDLE;\r
 \r
        /* Disable group notification if enabled. */\r
-    if(1 == AdcConfigPtr->groupConfigPtr[group%NOF_GROUP_PER_CONTROLLER].status->notifictionEnable){\r
+    if(1 == AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->notifictionEnable){\r
        Adc_DisableGroupNotification (group);\r
     }\r
   }\r