]> rtime.felk.cvut.cz Git - arc.git/blob - arch/ppc/mpc55xx/drivers/Adc_560x.c
782d5c94c6fb220f6e1d953b7b2e87c2e2076ee6
[arc.git] / arch / ppc / mpc55xx / drivers / Adc_560x.c
1 /* -------------------------------- Arctic Core ------------------------------\r
2  * Arctic Core - the open source AUTOSAR platform http://arccore.com\r
3  *\r
4  * Copyright (C) 2009  ArcCore AB <contact@arccore.com>\r
5  *\r
6  * This source code is free software; you can redistribute it and/or modify it\r
7  * under the terms of the GNU General Public License version 2 as published by the\r
8  * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.\r
9  *\r
10  * This program is distributed in the hope that it will be useful, but\r
11  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\r
12  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\r
13  * for more details.\r
14  * -------------------------------- Arctic Core ------------------------------*/\r
15 \r
16 \r
17 /* In order to support multiple hw units we need to match group to a certain hw controller.\r
18  * We handle this in a very simple way i.e. group 0-99 -> hwUnitId 0, group 100-199 -> hwUnitId 1 etc.*\r
19  */\r
20 \r
21 /* ----------------------------[includes]------------------------------------*/\r
22 \r
23 #include <assert.h>\r
24 #include <stdlib.h>\r
25 #include "Std_Types.h"\r
26 #include "mpc55xx.h"\r
27 #include "Modules.h"\r
28 #include "Mcu.h"\r
29 #include "Adc.h"\r
30 #include "Det.h"\r
31 #include "Os.h"\r
32 #include "isr.h"\r
33 #include "irq.h"\r
34 #include "arc.h"\r
35 #include "Adc_Internal.h"\r
36 /* ----------------------------[private define]------------------------------*/\r
37 \r
38 \r
39 /* Uncomment and use DMA for 5606 only if you now what you are doing */\r
40 #define DONT_USE_DMA_IN_ADC_MPC560X\r
41 \r
42 /* Are we gonna use Dma? */\r
43 #if ( defined(CFG_MPC5606S) && !defined(DONT_USE_DMA_IN_ADC_MPC560X) )\r
44         #define ADC_USES_DMA\r
45         #include "Dma.h"\r
46 #endif\r
47 \r
48 #if ( defined(ADC_USES_DMA) && !defined(USE_DMA) )\r
49         #error Adc is configured to use Dma but the module is not enabled.\r
50 #endif\r
51 \r
52 \r
53 #if defined(CFG_MPC5668)\r
54 #define ADC0_EOC_INT    ADC_A_EOC\r
55 #define ADC0_ER_INT             ADC_A_ERR\r
56 #define ADC0_WD_INT             ADC_A_WD\r
57 #define ADC1_EOC_INT    ADC_B_EOC\r
58 #define ADC1_ER_INT             ADC_B_ERR\r
59 #define ADC1_WD_INT             ADC_B_WD\r
60 #endif\r
61 \r
62 #define GET_HW_CONTROLLER(_controller)  \\r
63                                                 ((struct ADC_tag *)(0xFFE00000 + 0x4000*(_controller)))\r
64 \r
65 #define GET_HWUNITID_FROM_GROUP(_group) (_group / ADC_NOF_GROUP_PER_CONTROLLER)\r
66 \r
67 /* ----------------------------[private macro]-------------------------------*/\r
68 /* ----------------------------[private typedef]-----------------------------*/\r
69 /* ----------------------------[private function prototypes]-----------------*/\r
70 /* ----------------------------[private variables]---------------------------*/\r
71 \r
72 /* static variable declarations */\r
73 static Adc_StateType adcState = ADC_UNINIT;\r
74 static const Adc_ConfigType *AdcGlobalConfigPtr;      /* Pointer to configuration structure. */\r
75 \r
76 /* ----------------------------[private functions]---------------------------*/\r
77 \r
78 /* Function prototypes. */\r
79 static void Adc_ConfigureADC (const Adc_ConfigType *AdcConfigPtr);\r
80 static void Adc_ConfigureADCInterrupts (const Adc_ConfigType *AdcConfigPtr);\r
81 void Adc_GroupConversionComplete (Adc_GroupType group, const Adc_ConfigType *AdcConfigPtr, volatile struct ADC_tag *hwPtr);\r
82 \r
83 static const Adc_ConfigType * Adc_GetControllerConfigPtrFromHwUnitId(int unit)\r
84 {\r
85         const Adc_ConfigType *AdcConfigPtr = NULL;\r
86 \r
87         if(adcState == ADC_INIT){\r
88                 for (int configId = 0; configId < ADC_ARC_CTRL_CONFIG_CNT; configId++) {\r
89                         if(unit == AdcGlobalConfigPtr[configId].hwConfigPtr->hwUnitId){\r
90                                 AdcConfigPtr = &AdcGlobalConfigPtr[configId];\r
91                                 break;\r
92                         }\r
93                 }\r
94         }\r
95 \r
96         return AdcConfigPtr;\r
97 }\r
98 \r
99 static const Adc_ConfigType * Adc_GetControllerConfigPtrFromGroupId(Adc_GroupType group)\r
100 {\r
101         return Adc_GetControllerConfigPtrFromHwUnitId(GET_HWUNITID_FROM_GROUP(group));\r
102 }\r
103 /* ----------------------------[public functions]----------------------------*/\r
104 \r
105 #if (ADC_DEINIT_API == STD_ON)\r
106 void Adc_DeInit ()\r
107 {\r
108   volatile struct ADC_tag *hwPtr;\r
109   boolean okToClear = TRUE;\r
110 \r
111   for (int configId = 0; configId < ADC_ARC_CTRL_CONFIG_CNT; configId++) {\r
112           const Adc_ConfigType *AdcConfigPtr = &AdcGlobalConfigPtr[configId];\r
113 \r
114           if (E_OK == Adc_CheckDeInit(adcState, AdcConfigPtr))\r
115           {\r
116                 hwPtr = GET_HW_CONTROLLER(AdcGlobalConfigPtr[configId].hwConfigPtr->hwUnitId);\r
117                 for(Adc_GroupType group = (Adc_GroupType)0; group < AdcConfigPtr->nbrOfGroups; group++)\r
118                 {\r
119                   /* Set group status to idle. */\r
120                   AdcConfigPtr->groupConfigPtr[group].status->groupStatus = ADC_IDLE;\r
121                 }\r
122 \r
123                 /* Disable DMA transfer*/\r
124         #ifndef CFG_MPC5604B\r
125                 hwPtr->DMAE.B.DMAEN = 0;\r
126         #endif\r
127                 /* Power down ADC */\r
128                 hwPtr->MCR.R = 0x0001;\r
129 \r
130                 /* Disable all interrupt*/\r
131                 hwPtr->IMR.R = 0;\r
132           }\r
133           else\r
134           {\r
135                 /* Not ok to change adcState if any unit is running */\r
136             okToClear = FALSE;\r
137           }\r
138         }\r
139 \r
140     if(okToClear)\r
141     {\r
142         /* Clean internal status. */\r
143         AdcGlobalConfigPtr = (Adc_ConfigType *)NULL;\r
144         adcState = ADC_UNINIT;\r
145     }\r
146 }\r
147 #endif\r
148 \r
149 void Adc_Init (const Adc_ConfigType *ConfigPtr)\r
150 {\r
151   if (E_OK == Adc_CheckInit(adcState, ConfigPtr))\r
152   {\r
153         /* First of all, store the location of the global configuration data. */\r
154         AdcGlobalConfigPtr = ConfigPtr;\r
155 \r
156         for (int configId = 0; configId < ADC_ARC_CTRL_CONFIG_CNT; configId++)\r
157         {\r
158           const Adc_ConfigType *AdcConfigPtr = &AdcGlobalConfigPtr[configId];\r
159 \r
160           /* Enable ADC. */\r
161       Adc_ConfigureADC(AdcConfigPtr);\r
162 \r
163           Adc_ConfigureADCInterrupts(AdcConfigPtr);\r
164         }\r
165 \r
166         /* Move on to INIT state. */\r
167         adcState = ADC_INIT;\r
168   }\r
169 }\r
170 \r
171 Std_ReturnType Adc_SetupResultBuffer (Adc_GroupType group, Adc_ValueGroupType *bufferPtr)\r
172 {\r
173   Std_ReturnType returnValue = E_NOT_OK;\r
174 \r
175   const Adc_ConfigType *AdcConfigPtr = Adc_GetControllerConfigPtrFromGroupId(group);\r
176 \r
177   /* Check for development errors. */\r
178   if (E_OK == Adc_CheckSetupResultBuffer (adcState, AdcConfigPtr, group))\r
179   {\r
180     AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->resultBufferPtr = bufferPtr;\r
181     \r
182     returnValue = E_OK;\r
183   }\r
184 \r
185   return (returnValue);\r
186 }\r
187 \r
188 Adc_StreamNumSampleType Adc_GetStreamLastPointer(Adc_GroupType group, Adc_ValueGroupType** PtrToSamplePtr)\r
189 {\r
190         const Adc_ConfigType *AdcConfigPtr = Adc_GetControllerConfigPtrFromGroupId(group);\r
191         Adc_StreamNumSampleType nofSample = 0;\r
192         \r
193         /** @req ADC216 */\r
194         /* Check for development errors. */\r
195         if (E_OK == Adc_CheckGetStreamLastPointer (adcState, AdcConfigPtr, group))\r
196         {\r
197                 Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER];\r
198 \r
199                 if (groupPtr->status->groupStatus != ADC_BUSY)\r
200             {\r
201                         /* Set resultPtr to application buffer. */\r
202                         if(groupPtr->status->currSampleCount > 0){\r
203                                 *PtrToSamplePtr = &groupPtr->status->resultBufferPtr[groupPtr->status->currSampleCount-1];\r
204                         }\r
205 \r
206                         if ((ADC_CONV_MODE_ONESHOT == groupPtr->conversionMode) &&\r
207                                 (ADC_STREAM_COMPLETED  == groupPtr->status->groupStatus))\r
208                         {\r
209                                 /** @req ADC327. */\r
210                                 groupPtr->status->groupStatus = ADC_IDLE;\r
211                         }\r
212                         else if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
213                                          (ADC_ACCESS_MODE_STREAMING == groupPtr->accessMode) &&\r
214                                          (ADC_STREAM_BUFFER_LINEAR == groupPtr->streamBufferMode) &&\r
215                                          (ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus))\r
216                         {\r
217                                 /** @req ADC327. */\r
218                                 groupPtr->status->groupStatus = ADC_IDLE;\r
219                         }\r
220                         else if ( (ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
221                                           ((ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus) ||\r
222                                            (ADC_COMPLETED           == groupPtr->status->groupStatus)) )\r
223                         {\r
224                                 /* Restart continous mode, and reset result buffer */\r
225                                 if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
226                                         (ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus))\r
227                                 {\r
228                                   /* Start continous conversion again */\r
229                                         Adc_StartGroupConversion(group);\r
230                                 }\r
231                                 /** @req ADC326 */\r
232                                 /** @req ADC328 */\r
233                         }\r
234                         else{/* Keep status. */}\r
235             }\r
236                 else\r
237                 {\r
238                         /* Some condition not met */\r
239                         *PtrToSamplePtr = NULL;\r
240                 }\r
241         }\r
242         else\r
243         {\r
244                 /* Some condition not met */\r
245                 *PtrToSamplePtr = NULL;\r
246         }\r
247 \r
248         return nofSample;\r
249 \r
250 }\r
251 \r
252 #if (ADC_READ_GROUP_API == STD_ON)\r
253 Std_ReturnType Adc_ReadGroup (Adc_GroupType group, Adc_ValueGroupType *dataBufferPtr)\r
254 {\r
255   Std_ReturnType returnValue = E_OK;\r
256   uint8_t channel;\r
257   const Adc_ConfigType *AdcConfigPtr = Adc_GetControllerConfigPtrFromGroupId(group);\r
258 \r
259   if (E_OK == Adc_CheckReadGroup (adcState, AdcConfigPtr, group))\r
260   {\r
261         Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER];\r
262 \r
263     /* Copy the result to application buffer. */\r
264     for (channel = 0; channel < groupPtr->numberOfChannels; channel++)\r
265         {\r
266                 if(groupPtr->status->currSampleCount > 0){\r
267                         dataBufferPtr[channel] = (&(groupPtr->status->resultBufferPtr[groupPtr->status->currSampleCount-1]))[channel];\r
268                 }else{\r
269                         dataBufferPtr[channel] = groupPtr->status->resultBufferPtr[channel];\r
270                 }\r
271         }\r
272 \r
273     if ((ADC_CONV_MODE_ONESHOT == groupPtr->conversionMode) &&\r
274         (ADC_STREAM_COMPLETED  == groupPtr->status->groupStatus))\r
275     {\r
276                 /** @req ADC330. */\r
277                 groupPtr->status->groupStatus = ADC_IDLE;\r
278     }\r
279     else if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
280              (ADC_STREAM_BUFFER_LINEAR == groupPtr->streamBufferMode) &&\r
281              (ADC_ACCESS_MODE_STREAMING == groupPtr->accessMode) &&\r
282              (ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus))\r
283     {\r
284                 /** @req ADC330. */\r
285                 groupPtr->status->groupStatus = ADC_IDLE;\r
286     }\r
287     else if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
288              ((ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus) ||\r
289               (ADC_COMPLETED           == groupPtr->status->groupStatus)))\r
290     {\r
291         /** @req ADC329 */\r
292       /* Restart continous mode, and reset result buffer */\r
293       if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
294           (ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus))\r
295       {\r
296                   /* Start continous conversion again */\r
297         Adc_StartGroupConversion(group);\r
298       }\r
299       /** @req ADC329 */\r
300       /** @req ADC331 */\r
301     }\r
302     else{/* Keep status. */}\r
303   }\r
304   else\r
305   {\r
306     /* An error have been raised from Adc_CheckReadGroup(). */\r
307     returnValue = E_NOT_OK;\r
308   }\r
309 \r
310   return (returnValue);\r
311 }\r
312 #endif\r
313 \r
314 void Adc_GroupConversionComplete (Adc_GroupType group, const Adc_ConfigType *AdcConfigPtr, volatile struct ADC_tag *hwPtr)\r
315 {\r
316   Adc_GroupDefType *adcGroup = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER];\r
317 \r
318   if(ADC_ACCESS_MODE_SINGLE == adcGroup->accessMode )\r
319   {\r
320           adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
321 \r
322     /* Disable trigger normal conversions for ADC0 */\r
323     hwPtr->MCR.B.NSTART=0;\r
324 \r
325           /* Call notification if enabled. */\r
326         #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
327           if (adcGroup->status->notifictionEnable && adcGroup->groupCallback != NULL)\r
328           {\r
329                   adcGroup->groupCallback();\r
330           }\r
331         #endif\r
332   }\r
333   else\r
334   {\r
335         if(ADC_STREAM_BUFFER_LINEAR == adcGroup->streamBufferMode)\r
336         {\r
337                 adcGroup->status->currSampleCount++;\r
338                 if(adcGroup->status->currSampleCount < adcGroup->streamNumSamples)\r
339                 {\r
340                   adcGroup->status->currResultBufPtr += adcGroup->numberOfChannels;\r
341                   adcGroup->status->groupStatus = ADC_COMPLETED;\r
342 \r
343 #if defined (ADC_USES_DMA)\r
344                   /* Increase current result buffer ptr */\r
345                 Dma_ConfigureDestinationAddress((uint32_t)adcGroup->status->currResultBufPtr, adcGroup->dmaResultChannel);\r
346 #endif\r
347 \r
348                 hwPtr->IMR.B.MSKECH = 1;\r
349             hwPtr->MCR.B.NSTART=1;\r
350                 }\r
351                 else\r
352                 {\r
353                   /* All sample completed. */\r
354                   adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
355 \r
356       /* Disable trigger normal conversions for ADC0 */\r
357       hwPtr->MCR.B.NSTART=0;\r
358 \r
359                   /* Call notification if enabled. */\r
360                 #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
361                   if (adcGroup->status->notifictionEnable && adcGroup->groupCallback != NULL){\r
362                         adcGroup->groupCallback();\r
363                   }\r
364                 #endif\r
365                 }\r
366         }\r
367         else if(ADC_STREAM_BUFFER_CIRCULAR == adcGroup->streamBufferMode)\r
368         {\r
369                 adcGroup->status->currSampleCount++;\r
370                 if(adcGroup->status->currSampleCount < adcGroup->streamNumSamples)\r
371                 {\r
372                         adcGroup->status->currResultBufPtr += adcGroup->numberOfChannels;\r
373 #if defined (ADC_USES_DMA)\r
374                         /* Increase current result buffer ptr */\r
375                         Dma_ConfigureDestinationAddress((uint32_t)adcGroup->status->currResultBufPtr, adcGroup->dmaResultChannel);\r
376 #endif\r
377                         adcGroup->status->groupStatus = ADC_COMPLETED;\r
378 \r
379                         hwPtr->IMR.B.MSKECH = 1;\r
380                     hwPtr->MCR.B.NSTART=1;\r
381                 }\r
382                 else\r
383                 {\r
384                   /* Sample completed. */\r
385 \r
386                   /* Disable trigger normal conversions for ADC*/\r
387                   hwPtr->MCR.B.NSTART=0;\r
388 \r
389                   adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
390                   /* Call notification if enabled. */\r
391                 #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
392                   if (adcGroup->status->notifictionEnable && adcGroup->groupCallback != NULL)\r
393                   {\r
394                           adcGroup->groupCallback();\r
395                   }\r
396                 #endif\r
397                 }\r
398         }\r
399         else\r
400         {\r
401                 //nothing to do.\r
402         }\r
403   }\r
404 }\r
405 \r
406 void Adc_Group0ConversionComplete (int unit)\r
407 {\r
408         volatile struct ADC_tag *hwPtr = GET_HW_CONTROLLER(unit);\r
409         const Adc_ConfigType *AdcConfigPtr = Adc_GetControllerConfigPtrFromHwUnitId(unit);\r
410 \r
411         /* Clear ECH Flag and disable interruput */\r
412         hwPtr->ISR.B.ECH = 1;\r
413         hwPtr->IMR.B.MSKECH = 0;\r
414 \r
415         // Check which group is busy, only one is allowed to be busy at a time in a hw unit\r
416         for (int group = 0; group < AdcConfigPtr->nbrOfGroups; group++)\r
417         {\r
418           if((AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_BUSY) ||\r
419        (AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_COMPLETED))\r
420           {\r
421 #if !defined (ADC_USES_DMA)\r
422                 /* Copy to result buffer */\r
423                 for(uint8 index=0; index < AdcConfigPtr->groupConfigPtr[group].numberOfChannels; index++)\r
424                 {\r
425 #if defined(CFG_MPC5606S)\r
426                         AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = hwPtr->CDR[32+AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
427 #else\r
428                         AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = hwPtr->CDR[AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
429 #endif\r
430                 }\r
431 #endif\r
432 \r
433             Adc_GroupConversionComplete((Adc_GroupType)group, AdcConfigPtr, hwPtr);\r
434                 break;\r
435           }\r
436         }\r
437 }\r
438 \r
439 static void Adc_Group0ConversionComplete_ADC0(void){\r
440         Adc_Group0ConversionComplete(ADC_CTRL_0);\r
441 }\r
442 \r
443 static void Adc_Group0ConversionComplete_ADC1(void){\r
444         Adc_Group0ConversionComplete(ADC_CTRL_1);\r
445 }\r
446 \r
447 void Adc_WatchdogError (void){\r
448 }\r
449 void Adc_ADCError (void){\r
450 }\r
451 \r
452 static void  Adc_ConfigureADC (const Adc_ConfigType *AdcConfigPtr)\r
453 {\r
454   volatile struct ADC_tag *hwPtr = GET_HW_CONTROLLER(AdcConfigPtr->hwConfigPtr->hwUnitId);\r
455 \r
456   /* Set ADC CLOCK */\r
457   hwPtr->MCR.B.ADCLKSEL = AdcConfigPtr->hwConfigPtr->adcPrescale;\r
458 \r
459   hwPtr->DSDR.B.DSD = 254;\r
460 \r
461   /* Power on ADC */\r
462   hwPtr->MCR.B.PWDN = 0;\r
463 \r
464 #if defined(ADC_USES_DMA)\r
465   /* Enable DMA. */\r
466   hwPtr->DMAE.B.DMAEN = 1;\r
467 #endif\r
468 }\r
469 \r
470 void Adc_ConfigureADCInterrupts (const Adc_ConfigType *AdcConfigPtr)\r
471 {\r
472         if(AdcConfigPtr->hwConfigPtr->hwUnitId == 0)\r
473         {\r
474                 ISR_INSTALL_ISR2(  "Adc_Err", Adc_ADCError, ADC0_ER_INT,     2, 0 );\r
475                 ISR_INSTALL_ISR2(  "Adc_Grp", Adc_Group0ConversionComplete_ADC0, ADC0_EOC_INT,     2, 0 );\r
476                 ISR_INSTALL_ISR2(  "Adc_Wdg", Adc_WatchdogError, ADC0_WD_INT,     2, 0 );\r
477     }\r
478         else if(AdcConfigPtr->hwConfigPtr->hwUnitId == 1)\r
479         {\r
480                 ISR_INSTALL_ISR2(  "Adc_Err", Adc_ADCError, ADC1_ER_INT,     2, 0 );\r
481                 ISR_INSTALL_ISR2(  "Adc_Grp", Adc_Group0ConversionComplete_ADC1, ADC1_EOC_INT,     2, 0 );\r
482                 ISR_INSTALL_ISR2(  "Adc_Wdg", Adc_WatchdogError, ADC1_WD_INT,     2, 0 );\r
483     }\r
484         else\r
485     {\r
486         assert(0);\r
487     }\r
488 }\r
489 \r
490 #if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON)\r
491 void Adc_StartGroupConversion (Adc_GroupType group)\r
492 {\r
493         const Adc_ConfigType *AdcConfigPtr = Adc_GetControllerConfigPtrFromGroupId(group);\r
494 \r
495         /* Run development error check. */\r
496         if (E_OK == Adc_CheckStartGroupConversion (adcState, AdcConfigPtr, group))\r
497         {\r
498                 volatile struct ADC_tag *hwPtr = GET_HW_CONTROLLER(AdcConfigPtr->hwConfigPtr->hwUnitId);\r
499 \r
500                 Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER];\r
501 \r
502                 /* Disable trigger normal conversions for ADC0 */\r
503                 hwPtr->MCR.B.NSTART = 0;\r
504 \r
505                 /* Set group state to BUSY. */\r
506                 groupPtr->status->groupStatus = ADC_BUSY;\r
507 \r
508                 groupPtr->status->currSampleCount = 0;\r
509                 groupPtr->status->currResultBufPtr = groupPtr->status->resultBufferPtr; /* Set current result buffer */\r
510 \r
511 #if defined(ADC_USES_DMA)\r
512                 Dma_ConfigureChannel ((Dma_TcdType *)groupPtr->groupDMAResults, groupPtr->dmaResultChannel);\r
513                 Dma_ConfigureDestinationAddress ((uint32_t)groupPtr->status->currResultBufPtr, groupPtr->dmaResultChannel);\r
514 #endif\r
515                 /* Always use single shot in streaming mode */\r
516                 if( groupPtr->accessMode == ADC_ACCESS_MODE_STREAMING)\r
517                 {\r
518                         /* Set conversion mode. */\r
519                         hwPtr->MCR.B.MODE = ADC_CONV_MODE_ONESHOT;\r
520                 }\r
521                 else\r
522                 {\r
523                         /* Set conversion mode. */\r
524                         hwPtr->MCR.B.MODE = groupPtr->conversionMode;\r
525                 }\r
526 \r
527                 /* Enable Overwrite*/\r
528                 hwPtr->MCR.B.OWREN = 1;\r
529 \r
530                 /* Set Conversion Time. */\r
531 #if defined(CFG_MPC5606S)\r
532                 uint32 groupChannelIdMask = 0;\r
533 \r
534                 hwPtr->CTR[1].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
535                 hwPtr->CTR[1].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
536                 hwPtr->CTR[1].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
537 \r
538                 for(uint8 i =0; i < groupPtr->numberOfChannels; i++)\r
539                 {\r
540                         groupChannelIdMask |= (1 << groupPtr->channelList[i]);\r
541                 }\r
542 \r
543 #if defined(ADC_USES_DMA)\r
544                 hwPtr->DMAE.R = 0x01;\r
545                 /* Enable DMA Transfer */\r
546                 hwPtr->DMAR[1].R = groupChannelIdMask;\r
547                 Dma_StartChannel(DMA_ADC_GROUP0_RESULT_CHANNEL);        /* Enable EDMA channel for ADC */\r
548 #endif\r
549 \r
550                 /* Enable Normal conversion */\r
551                 hwPtr->NCMR[1].R = groupChannelIdMask;\r
552 \r
553                 /* Enable Channel Interrupt */\r
554                 hwPtr->CIMR[1].R = groupChannelIdMask;\r
555 \r
556 #else\r
557                 uint32 groupChannelIdMask[3] = {0,0,0};\r
558 \r
559                 hwPtr->CTR[0].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
560                 hwPtr->CTR[0].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
561                 hwPtr->CTR[0].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
562                 hwPtr->CTR[1].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
563                 hwPtr->CTR[1].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
564                 hwPtr->CTR[1].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
565 //              hwPtr->CTR[2].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
566 //              hwPtr->CTR[2].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
567 //              hwPtr->CTR[2].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
568 \r
569                 for(uint8 i =0; i < groupPtr->numberOfChannels; i++)\r
570                 {\r
571 #if defined(CFG_MPC5668)\r
572                         if(groupPtr->channelList[i] <= 31){\r
573 #else\r
574                         if(groupPtr->channelList[i] <= 15){\r
575 #endif\r
576                                 groupChannelIdMask[0] |= (1 << groupPtr->channelList[i]);\r
577                         }else if((groupPtr->channelList[i] >= 32) && (groupPtr->channelList[i] <=47)){\r
578                                 groupChannelIdMask[1] |= (1 << (groupPtr->channelList[i] - 32));\r
579                         }else if((groupPtr->channelList[i] >= 64) && (groupPtr->channelList[i] <=95)){\r
580                                 groupChannelIdMask[2] |= (1 << (groupPtr->channelList[i] - 64));\r
581                         }\r
582                 }\r
583 \r
584                 /* Enable Normal conversion */\r
585                 hwPtr->NCMR[0].R = groupChannelIdMask[0];\r
586                 hwPtr->NCMR[1].R = groupChannelIdMask[1];\r
587 //              hwPtr->NCMR[2].R = groupChannelIdMask[2];\r
588 \r
589                 /* Enable Channel Interrupt */\r
590                 hwPtr->CIMR[0].R = groupChannelIdMask[0];\r
591                 hwPtr->CIMR[1].R = groupChannelIdMask[1];\r
592 //              hwPtr->CIMR[2].R = groupChannelIdMask[2];\r
593 #endif\r
594                 /* Clear interrupts */\r
595                 hwPtr->ISR.B.ECH = 1;\r
596                 /* Enable ECH interrupt */\r
597                 hwPtr->IMR.B.MSKECH = 1;\r
598 \r
599                 /* Trigger normal conversions for ADC0 */\r
600                 hwPtr->MCR.B.NSTART = 1;\r
601         }\r
602         else\r
603         {\r
604         /* Error have been set within Adc_CheckStartGroupConversion(). */\r
605         }\r
606 }\r
607 \r
608 void Adc_StopGroupConversion (Adc_GroupType group)\r
609 {\r
610   const Adc_ConfigType *AdcConfigPtr = Adc_GetControllerConfigPtrFromGroupId(group);\r
611 \r
612   if (E_OK == Adc_CheckStopGroupConversion (adcState, AdcConfigPtr, group))\r
613   {\r
614         volatile struct ADC_tag *hwPtr = GET_HW_CONTROLLER(AdcConfigPtr->hwConfigPtr->hwUnitId);\r
615 \r
616         /* Disable trigger normal conversions for ADC0 */\r
617         hwPtr->MCR.B.NSTART = 0;\r
618 \r
619         /* Set group state to IDLE. */\r
620         AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->groupStatus = ADC_IDLE;\r
621 \r
622         /* Disable group notification if enabled. */\r
623     if(1 == AdcConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->notifictionEnable){\r
624         Adc_DisableGroupNotification (group);\r
625     }\r
626   }\r
627   else\r
628   {\r
629         /* Error have been set within Adc_CheckStartGroupConversion(). */\r
630   }\r
631 }\r
632 #endif  /* endof #if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON) */\r
633 \r
634 #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
635 void Adc_EnableGroupNotification (Adc_GroupType group)\r
636 {\r
637         Adc_EnableInternalGroupNotification(adcState, Adc_GetControllerConfigPtrFromGroupId(group), group);\r
638 }\r
639 \r
640 void Adc_DisableGroupNotification (Adc_GroupType group)\r
641 {\r
642         Adc_InternalDisableGroupNotification(adcState, Adc_GetControllerConfigPtrFromGroupId(group), group);\r
643 }\r
644 #endif\r
645 \r
646 Adc_StatusType Adc_GetGroupStatus (Adc_GroupType group)\r
647 {\r
648         return Adc_InternalGetGroupStatus(adcState, Adc_GetControllerConfigPtrFromGroupId(group), group);\r
649 }\r
650 \r