]> rtime.felk.cvut.cz Git - arc.git/blob - arch/ppc/mpc55xx/drivers/Adc_560x.c
Splitting of Adc to eQADC and Adc_560x......continued....now for all architectures...
[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 #include <assert.h>\r
17 #include <stdlib.h>\r
18 //#include "System.h"\r
19 #include "mpc55xx.h"\r
20 #include "Modules.h"\r
21 #include "Mcu.h"\r
22 #include "Adc.h"\r
23 #include "Det.h"\r
24 #include "Os.h"\r
25 #include "isr.h"\r
26 #include "irq.h"\r
27 #include "arc.h"\r
28 #include "Adc_Internal.h"\r
29 \r
30 /* Uncomment and use DMA for 5606 only if you now what you are doing */\r
31 #define DONT_USE_DMA_IN_ADC_MPC560X\r
32 \r
33 /* Are we gonna use Dma? */\r
34 #if ( defined(CFG_MPC5606S) && !defined(DONT_USE_DMA_IN_ADC_MPC560X) )\r
35         #define ADC_USES_DMA\r
36         #include "Dma.h"\r
37 #endif\r
38 \r
39 #if ( defined(ADC_USES_DMA) && !defined(USE_DMA) )\r
40         #error Adc is configured to use Dma but the module is not enabled.\r
41 #endif\r
42 \r
43 #define ADC_GROUP0              0\r
44 \r
45 /* Function prototypes. */\r
46 static void Adc_ConfigureADC (const Adc_ConfigType *ConfigPtr);\r
47 static void Adc_ConfigureADCInterrupts (void);\r
48 \r
49 void Adc_GroupConversionComplete (Adc_GroupType group);\r
50 \r
51 /* static variable declarations */\r
52 static Adc_StateType adcState = ADC_UNINIT;\r
53 static const Adc_ConfigType *AdcConfigPtr;      /* Pointer to configuration structure. */\r
54 \r
55 \r
56 #if (ADC_DEINIT_API == STD_ON)\r
57 Std_ReturnType Adc_DeInit (const Adc_ConfigType *ConfigPtr)\r
58 {\r
59   (void)ConfigPtr;\r
60 \r
61   if (E_OK == Adc_CheckDeInit(adcState, ConfigPtr))\r
62   {\r
63     for(Adc_GroupType group = (Adc_GroupType)ADC_GROUP0; group < AdcConfigPtr->nbrOfGroups; group++)\r
64     {\r
65       /* Set group status to idle. */\r
66       AdcConfigPtr->groupConfigPtr[group].status->groupStatus = ADC_IDLE;\r
67     }\r
68 \r
69     /* Disable DMA transfer*/\r
70 #ifndef CFG_MPC5604B\r
71     ADC_0.DMAE.B.DMAEN = 0;\r
72 #endif\r
73     /* Power down ADC */\r
74     ADC_0.MCR.R = 0x0001;\r
75 \r
76     /* Disable all interrupt*/\r
77     ADC_0.IMR.R = 0;\r
78 \r
79     /* Clean internal status. */\r
80     AdcConfigPtr = (Adc_ConfigType *)NULL;\r
81     adcState = ADC_UNINIT;\r
82   }\r
83 \r
84   return (E_OK);\r
85 }\r
86 #endif\r
87 \r
88 Std_ReturnType Adc_Init (const Adc_ConfigType *ConfigPtr)\r
89 {\r
90   if (E_OK == Adc_CheckInit(adcState, ConfigPtr))\r
91   {\r
92             /* First of all, store the location of the configuration data. */\r
93             AdcConfigPtr = ConfigPtr;\r
94 \r
95             /* Enable ADC. */\r
96              Adc_ConfigureADC(ConfigPtr);\r
97 \r
98              Adc_ConfigureADCInterrupts();\r
99 \r
100             /* Move on to INIT state. */\r
101             adcState = ADC_INIT;\r
102             return E_OK;\r
103   }\r
104   else\r
105   {\r
106     return E_NOT_OK;\r
107   }\r
108 }\r
109 \r
110 Std_ReturnType Adc_SetupResultBuffer (Adc_GroupType group, Adc_ValueGroupType *bufferPtr)\r
111 {\r
112   Std_ReturnType returnValue = E_NOT_OK;\r
113 \r
114   /* Check for development errors. */\r
115   if (E_OK == Adc_CheckSetupResultBuffer (AdcConfigPtr, group))\r
116   {\r
117     AdcConfigPtr->groupConfigPtr[group].status->resultBufferPtr = bufferPtr;\r
118     \r
119     returnValue = E_OK;\r
120   }\r
121 \r
122   return (returnValue);\r
123 }\r
124 \r
125 Adc_StreamNumSampleType Adc_GetStreamLastPointer(Adc_GroupType group, Adc_ValueGroupType** PtrToSamplePtr)\r
126 {\r
127         Adc_StreamNumSampleType nofSample = 0;\r
128         Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
129         \r
130         /** @req ADC216 */\r
131         /* Check for development errors. */\r
132         if ( (E_OK == Adc_CheckGetStreamLastPointer (adcState, AdcConfigPtr, group)) &&\r
133                  (groupPtr->status->groupStatus != ADC_BUSY) )\r
134         {\r
135             /* Set resultPtr to application buffer. */\r
136                 if(groupPtr->status->currSampleCount > 0){\r
137                         *PtrToSamplePtr = &groupPtr->status->resultBufferPtr[groupPtr->status->currSampleCount-1];\r
138                 }\r
139 \r
140             if ((ADC_CONV_MODE_ONESHOT == groupPtr->conversionMode) &&\r
141                 (ADC_STREAM_COMPLETED  == groupPtr->status->groupStatus))\r
142             {\r
143                         /** @req ADC327. */\r
144                         groupPtr->status->groupStatus = ADC_IDLE;\r
145             }\r
146             else if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
147                      (ADC_ACCESS_MODE_STREAMING == groupPtr->accessMode) &&\r
148                      (ADC_STREAM_BUFFER_LINEAR == groupPtr->streamBufferMode) &&\r
149                      (ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus))\r
150             {\r
151                         /** @req ADC327. */\r
152                         groupPtr->status->groupStatus = ADC_IDLE;\r
153             }\r
154             else if ( (ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
155                       ((ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus) ||\r
156                        (ADC_COMPLETED           == groupPtr->status->groupStatus)) )\r
157             {\r
158                 /* Restart continous mode, and reset result buffer */\r
159                 if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
160                     (ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus))\r
161                 {\r
162                           /* Start continous conversion again */\r
163                         Adc_StartGroupConversion(group);\r
164                 }\r
165                         /** @req ADC326 */\r
166                         /** @req ADC328 */\r
167             }\r
168             else{/* Keep status. */}\r
169         }\r
170         else\r
171         {\r
172                 /* Some condition not met */\r
173                 *PtrToSamplePtr = NULL;\r
174         }\r
175 \r
176         return nofSample;\r
177 \r
178 }\r
179 \r
180 #if (ADC_READ_GROUP_API == STD_ON)\r
181 Std_ReturnType Adc_ReadGroup (Adc_GroupType group, Adc_ValueGroupType *dataBufferPtr)\r
182 {\r
183   Std_ReturnType returnValue = E_OK;\r
184   uint8_t channel;\r
185   Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
186 \r
187   if (E_OK == Adc_CheckReadGroup (adcState, AdcConfigPtr, group))\r
188   {\r
189     /* Copy the result to application buffer. */\r
190     for (channel = 0; channel < groupPtr->numberOfChannels; channel++)\r
191         {\r
192                 if(groupPtr->status->currSampleCount > 0){\r
193                         dataBufferPtr[channel] = (&(groupPtr->status->resultBufferPtr[groupPtr->status->currSampleCount-1]))[channel];\r
194                 }else{\r
195                         dataBufferPtr[channel] = groupPtr->status->resultBufferPtr[channel];\r
196                 }\r
197         }\r
198 \r
199     if ((ADC_CONV_MODE_ONESHOT == groupPtr->conversionMode) &&\r
200         (ADC_STREAM_COMPLETED  == groupPtr->status->groupStatus))\r
201     {\r
202                 /** @req ADC330. */\r
203                 groupPtr->status->groupStatus = ADC_IDLE;\r
204     }\r
205     else if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
206              (ADC_STREAM_BUFFER_LINEAR == groupPtr->streamBufferMode) &&\r
207              (ADC_ACCESS_MODE_STREAMING == groupPtr->accessMode) &&\r
208              (ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus))\r
209     {\r
210                 /** @req ADC330. */\r
211                 groupPtr->status->groupStatus = ADC_IDLE;\r
212     }\r
213     else if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
214              ((ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus) ||\r
215               (ADC_COMPLETED           == groupPtr->status->groupStatus)))\r
216     {\r
217         /** @req ADC329 */\r
218       /* Restart continous mode, and reset result buffer */\r
219       if ((ADC_CONV_MODE_CONTINOUS == groupPtr->conversionMode) &&\r
220           (ADC_STREAM_COMPLETED    == groupPtr->status->groupStatus))\r
221       {\r
222                   /* Start continous conversion again */\r
223         Adc_StartGroupConversion(group);\r
224       }\r
225       /** @req ADC329 */\r
226       /** @req ADC331 */\r
227     }\r
228     else{/* Keep status. */}\r
229   }\r
230   else\r
231   {\r
232     /* An error have been raised from Adc_CheckReadGroup(). */\r
233     returnValue = E_NOT_OK;\r
234   }\r
235 \r
236   return (returnValue);\r
237 }\r
238 #endif\r
239 \r
240 void Adc_GroupConversionComplete (Adc_GroupType group)\r
241 {\r
242         Adc_GroupDefType *adcGroup = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
243 \r
244   if(ADC_ACCESS_MODE_SINGLE == adcGroup->accessMode )\r
245   {\r
246           adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
247           /* Call notification if enabled. */\r
248         #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
249           if (adcGroup->status->notifictionEnable && adcGroup->groupCallback != NULL)\r
250           {\r
251                   adcGroup->groupCallback();\r
252           }\r
253         #endif\r
254                   /* Disable trigger normal conversions for ADC0 */\r
255                   ADC_0.MCR.B.NSTART=0;\r
256   }\r
257   else\r
258   {\r
259         if(ADC_STREAM_BUFFER_LINEAR == adcGroup->streamBufferMode)\r
260         {\r
261                 adcGroup->status->currSampleCount++;\r
262                 if(adcGroup->status->currSampleCount < adcGroup->streamNumSamples)\r
263                 {\r
264                   adcGroup->status->currResultBufPtr += adcGroup->numberOfChannels;\r
265                   adcGroup->status->groupStatus = ADC_COMPLETED;\r
266 \r
267 #if defined (ADC_USES_DMA)\r
268                   /* Increase current result buffer ptr */\r
269                 Dma_ConfigureDestinationAddress((uint32_t)adcGroup->status->currResultBufPtr, adcGroup->dmaResultChannel);\r
270 #endif\r
271 \r
272                 ADC_0.IMR.B.MSKECH = 1;\r
273             ADC_0.MCR.B.NSTART=1;\r
274                 }\r
275                 else\r
276                 {\r
277                   /* All sample completed. */\r
278                   adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
279 \r
280                   /* Call notification if enabled. */\r
281                 #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
282                   if (adcGroup->status->notifictionEnable && adcGroup->groupCallback != NULL){\r
283                         adcGroup->groupCallback();\r
284                   }\r
285                 #endif\r
286                   /* Disable trigger normal conversions for ADC0 */\r
287                   ADC_0.MCR.B.NSTART=0;\r
288                 }\r
289         }\r
290         else if(ADC_STREAM_BUFFER_CIRCULAR == adcGroup->streamBufferMode)\r
291         {\r
292                 adcGroup->status->currSampleCount++;\r
293                 if(adcGroup->status->currSampleCount < adcGroup->streamNumSamples)\r
294                 {\r
295                         adcGroup->status->currResultBufPtr += adcGroup->numberOfChannels;\r
296 #if defined (ADC_USES_DMA)\r
297                         /* Increase current result buffer ptr */\r
298                         Dma_ConfigureDestinationAddress((uint32_t)adcGroup->status->currResultBufPtr, adcGroup->dmaResultChannel);\r
299 #endif\r
300                         adcGroup->status->groupStatus = ADC_COMPLETED;\r
301 \r
302                         ADC_0.IMR.B.MSKECH = 1;\r
303                     ADC_0.MCR.B.NSTART=1;\r
304                 }\r
305                 else\r
306                 {\r
307                   /* Sample completed. */\r
308                   /* Disable trigger normal conversions for ADC*/\r
309                   ADC_0.MCR.B.NSTART=0;\r
310                   adcGroup->status->groupStatus = ADC_STREAM_COMPLETED;\r
311                   /* Call notification if enabled. */\r
312                 #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
313                   if (adcGroup->status->notifictionEnable && adcGroup->groupCallback != NULL)\r
314                   {\r
315                           adcGroup->groupCallback();\r
316                   }\r
317                 #endif\r
318                 }\r
319         }\r
320         else\r
321         {\r
322                 //nothing to do.\r
323         }\r
324   }\r
325 }\r
326 void Adc_Group0ConversionComplete (void)\r
327 {\r
328         /* Clear ECH Flag and disable interruput */\r
329         ADC_0.ISR.B.ECH = 1;\r
330         ADC_0.IMR.B.MSKECH = 0;\r
331 \r
332         // Check which group is busy, only one is allowed to be busy at a time in a hw unit\r
333         for (int group = 0; group < ADC_NBR_OF_GROUPS; group++)\r
334         {\r
335           if((AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_BUSY) ||\r
336        (AdcConfigPtr->groupConfigPtr[group].status->groupStatus == ADC_COMPLETED))\r
337           {\r
338 #if !defined (ADC_USES_DMA)\r
339                 /* Copy to result buffer */\r
340                 for(uint8 index=0; index < AdcConfigPtr->groupConfigPtr[group].numberOfChannels; index++)\r
341                 {\r
342 #if defined(CFG_MPC5606S)\r
343                         AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = ADC_0.CDR[32+AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
344 #else\r
345                         AdcConfigPtr->groupConfigPtr[group].status->currResultBufPtr[index] = ADC_0.CDR[AdcConfigPtr->groupConfigPtr[group].channelList[index]].B.CDATA;\r
346 #endif\r
347                 }\r
348 #endif\r
349 \r
350             Adc_GroupConversionComplete((Adc_GroupType)group);\r
351                 break;\r
352           }\r
353         }\r
354 }\r
355 \r
356 void Adc_WatchdogError (void){\r
357 }\r
358 void Adc_ADCError (void){\r
359 }\r
360 \r
361 static void  Adc_ConfigureADC (const Adc_ConfigType *ConfigPtr)\r
362 {\r
363   /* Set ADC CLOCK */\r
364   ADC_0.MCR.B.ADCLKSEL = ConfigPtr->hwConfigPtr->adcPrescale;\r
365 \r
366   ADC_0.DSDR.B.DSD = 254;\r
367 \r
368   /* Power on ADC */\r
369   ADC_0.MCR.B.PWDN = 0;\r
370 \r
371 #if defined(ADC_USES_DMA)\r
372   /* Enable DMA. */\r
373   ADC_0.DMAE.B.DMAEN = 1;\r
374 #endif\r
375 }\r
376 \r
377 void Adc_ConfigureADCInterrupts (void)\r
378 {\r
379         ISR_INSTALL_ISR2(  "Adc_Err", Adc_ADCError, ADC_ER_INT,     2, 0 );\r
380         ISR_INSTALL_ISR2(  "Adc_Grp", Adc_Group0ConversionComplete, ADC_EOC_INT,     2, 0 );\r
381         ISR_INSTALL_ISR2(  "Adc_Wdg", Adc_WatchdogError, ADC_WD_INT,     2, 0 );\r
382 }\r
383 \r
384 #if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON)\r
385 void Adc_StartGroupConversion (Adc_GroupType group)\r
386 {\r
387         Adc_GroupDefType *groupPtr = (Adc_GroupDefType *)&AdcConfigPtr->groupConfigPtr[group];\r
388 \r
389         /* Run development error check. */\r
390         if (E_OK == Adc_CheckStartGroupConversion (adcState, AdcConfigPtr, group))\r
391         {\r
392                 /* Disable trigger normal conversions for ADC0 */\r
393                 ADC_0.MCR.B.NSTART = 0;\r
394 \r
395                 /* Set group state to BUSY. */\r
396                 groupPtr->status->groupStatus = ADC_BUSY;\r
397 \r
398                 groupPtr->status->currSampleCount = 0;\r
399                 groupPtr->status->currResultBufPtr = groupPtr->status->resultBufferPtr; /* Set current result buffer */\r
400 \r
401 #if defined(ADC_USES_DMA)\r
402                 Dma_ConfigureChannel ((Dma_TcdType *)groupPtr->groupDMAResults, groupPtr->dmaResultChannel);\r
403                 Dma_ConfigureDestinationAddress ((uint32_t)groupPtr->status->currResultBufPtr, groupPtr->dmaResultChannel);\r
404 #endif\r
405                 /* Always use single shot in streaming mode */\r
406                 if( groupPtr->accessMode == ADC_ACCESS_MODE_STREAMING)\r
407                 {\r
408                         /* Set conversion mode. */\r
409                         ADC_0.MCR.B.MODE = ADC_CONV_MODE_ONESHOT;\r
410                 }\r
411                 else\r
412                 {\r
413                         /* Set conversion mode. */\r
414                         ADC_0.MCR.B.MODE = groupPtr->conversionMode;\r
415                 }\r
416 \r
417                 /* Enable Overwrite*/\r
418                 ADC_0.MCR.B.OWREN = 1;\r
419 \r
420                 /* Set Conversion Time. */\r
421 #if defined(CFG_MPC5606S)\r
422                 uint32 groupChannelIdMask = 0;\r
423 \r
424                 ADC_0.CTR[1].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
425                 ADC_0.CTR[1].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
426                 ADC_0.CTR[1].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
427 \r
428                 for(uint8 i =0; i < groupPtr->numberOfChannels; i++)\r
429                 {\r
430                         groupChannelIdMask |= (1 << groupPtr->channelList[i]);\r
431                 }\r
432 \r
433 #if defined(ADC_USES_DMA)\r
434                 ADC_0.DMAE.R = 0x01;\r
435                 /* Enable DMA Transfer */\r
436                 ADC_0.DMAR[1].R = groupChannelIdMask;\r
437                 Dma_StartChannel(DMA_ADC_GROUP0_RESULT_CHANNEL);        /* Enable EDMA channel for ADC */\r
438 #endif\r
439 \r
440                 /* Enable Normal conversion */\r
441                 ADC_0.NCMR[1].R = groupChannelIdMask;\r
442 \r
443                 /* Enable Channel Interrupt */\r
444                 ADC_0.CIMR[1].R = groupChannelIdMask;\r
445 \r
446 #else\r
447                 uint32 groupChannelIdMask[3] = {0,0,0};\r
448 \r
449                 ADC_0.CTR[0].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
450                 ADC_0.CTR[0].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
451                 ADC_0.CTR[0].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
452                 ADC_0.CTR[1].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
453                 ADC_0.CTR[1].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
454                 ADC_0.CTR[1].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
455                 ADC_0.CTR[2].B.INPLATCH = groupPtr->adcChannelConvTime.INPLATCH;\r
456                 ADC_0.CTR[2].B.INPCMP = groupPtr->adcChannelConvTime.INPCMP;\r
457                 ADC_0.CTR[2].B.INPSAMP = groupPtr->adcChannelConvTime.INPSAMP;\r
458 \r
459                 for(uint8 i =0; i < groupPtr->numberOfChannels; i++)\r
460                 {\r
461                         if(groupPtr->channelList[i] <= 15){\r
462                                 groupChannelIdMask[0] |= (1 << groupPtr->channelList[i]);\r
463                         }else if((groupPtr->channelList[i] >= 32) && (groupPtr->channelList[i] <=47)){\r
464                                 groupChannelIdMask[1] |= (1 << (groupPtr->channelList[i] - 32));\r
465                         }else if((groupPtr->channelList[i] >= 64) && (groupPtr->channelList[i] <=95)){\r
466                                 groupChannelIdMask[2] |= (1 << (groupPtr->channelList[i] - 64));\r
467                         }\r
468                 }\r
469 \r
470                 /* Enable Normal conversion */\r
471                 ADC_0.NCMR[0].R = groupChannelIdMask[0];\r
472                 ADC_0.NCMR[1].R = groupChannelIdMask[1];\r
473                 ADC_0.NCMR[2].R = groupChannelIdMask[2];\r
474 \r
475                 /* Enable Channel Interrupt */\r
476                 ADC_0.CIMR[0].R = groupChannelIdMask[0];\r
477                 ADC_0.CIMR[1].R = groupChannelIdMask[1];\r
478                 ADC_0.CIMR[2].R = groupChannelIdMask[2];\r
479 #endif\r
480                 /* Clear interrupts */\r
481                 ADC_0.ISR.B.ECH = 1;\r
482                 /* Enable ECH interrupt */\r
483                 ADC_0.IMR.B.MSKECH = 1;\r
484 \r
485                 /* Trigger normal conversions for ADC0 */\r
486                 ADC_0.MCR.B.NSTART = 1;\r
487         }\r
488         else\r
489         {\r
490         /* Error have been set within Adc_CheckStartGroupConversion(). */\r
491         }\r
492 }\r
493 \r
494 void Adc_StopGroupConversion (Adc_GroupType group)\r
495 {\r
496   if (E_OK == Adc_CheckStopGroupConversion (adcState, AdcConfigPtr, group))\r
497   {\r
498         /* Disable trigger normal conversions for ADC0 */\r
499         ADC_0.MCR.B.NSTART = 0;\r
500 \r
501         /* Set group state to IDLE. */\r
502         AdcConfigPtr->groupConfigPtr[group].status->groupStatus = ADC_IDLE;\r
503 \r
504         /* Disable group notification if enabled. */\r
505     if(1 == AdcConfigPtr->groupConfigPtr[group].status->notifictionEnable){\r
506         Adc_DisableGroupNotification (group);\r
507     }\r
508   }\r
509   else\r
510   {\r
511         /* Error have been set within Adc_CheckStartGroupConversion(). */\r
512   }\r
513 }\r
514 #endif  /* endof #if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON) */\r
515 \r
516 #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
517 void Adc_EnableGroupNotification (Adc_GroupType group)\r
518 {\r
519         Adc_EnableInternalGroupNotification(adcState, AdcConfigPtr, group);\r
520 }\r
521 \r
522 void Adc_DisableGroupNotification (Adc_GroupType group)\r
523 {\r
524         Adc_InternalDisableGroupNotification(adcState, AdcConfigPtr, group);\r
525 }\r
526 #endif\r
527 \r
528 Adc_StatusType Adc_GetGroupStatus (Adc_GroupType group)\r
529 {\r
530         return Adc_InternalGetGroupStatus(adcState, AdcConfigPtr, group);\r
531 }\r
532 \r