]> rtime.felk.cvut.cz Git - arc.git/blob - drivers/Adc_Internal.c
Merge branch 'mikulka' of git@rtime.felk.cvut.cz:arc into mikulka
[arc.git] / drivers / Adc_Internal.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 "Modules.h"\r
17 #include "Adc.h"\r
18 #include "Det.h"\r
19 #include "Os.h"\r
20 #include "arc.h"\r
21 #include "Adc_Internal.h"\r
22 \r
23 #ifndef CFG_MPC560X\r
24 #define ADC_NOF_GROUP_PER_CONTROLLER 100\r
25 #endif\r
26 \r
27 /* Validate functions used for development error check */\r
28 #if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
29 Std_ReturnType ValidateInit(Adc_StateType adcState, Adc_APIServiceIDType api)\r
30 {\r
31         Std_ReturnType res = E_OK;\r
32         if(!(ADC_INIT == adcState)) {\r
33                 Det_ReportError(MODULE_ID_ADC,0,api,ADC_E_UNINIT );\r
34                 res = E_NOT_OK;\r
35         }\r
36         return res;\r
37 }\r
38 Std_ReturnType ValidateGroup(const Adc_ConfigType *ConfigPtr, Adc_GroupType group,Adc_APIServiceIDType api)\r
39 {\r
40         Std_ReturnType res = E_OK;\r
41         if(!(((group % ADC_NOF_GROUP_PER_CONTROLLER) >= 0) && ((group % ADC_NOF_GROUP_PER_CONTROLLER) < ConfigPtr->nbrOfGroups))\r
42      || ConfigPtr == 0) {\r
43                 Det_ReportError(MODULE_ID_ADC,0,api,ADC_E_PARAM_GROUP );\r
44                 res = E_NOT_OK;\r
45         }\r
46         return res;\r
47 }\r
48 #endif\r
49 \r
50 \r
51 Adc_StatusType Adc_InternalGetGroupStatus (Adc_StateType adcState, const Adc_ConfigType *ConfigPtr, Adc_GroupType group)\r
52 {\r
53         Adc_StatusType returnValue;\r
54 \r
55 #if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
56         if( (ValidateInit(adcState, ADC_GETGROUPSTATUS_ID) == E_NOT_OK) ||\r
57                 (ValidateGroup(ConfigPtr, group, ADC_GETGROUPSTATUS_ID) == E_NOT_OK))\r
58         {\r
59                 returnValue = ADC_IDLE;\r
60         }\r
61         else\r
62         {\r
63                 returnValue = ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->groupStatus;\r
64         }\r
65 #else\r
66   returnValue = ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->groupStatus;\r
67 #endif\r
68   return (returnValue);\r
69 }\r
70 \r
71 #if (ADC_GRP_NOTIF_CAPABILITY == STD_ON)\r
72 void Adc_EnableInternalGroupNotification (Adc_StateType adcState, const Adc_ConfigType *ConfigPtr, Adc_GroupType group)\r
73 {\r
74         Std_ReturnType res;\r
75 \r
76 #if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
77         if( (ValidateInit(adcState, ADC_ENABLEGROUPNOTIFICATION_ID) == E_NOT_OK) ||\r
78                 (ValidateGroup(ConfigPtr, group, ADC_ENABLEGROUPNOTIFICATION_ID) == E_NOT_OK))\r
79         {\r
80                 res = E_NOT_OK;\r
81         }\r
82         else if (ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].groupCallback == NULL)\r
83         {\r
84                 res = E_NOT_OK;\r
85                 Det_ReportError(MODULE_ID_ADC,0,ADC_ENABLEGROUPNOTIFICATION_ID ,ADC_E_NOTIF_CAPABILITY );\r
86         }\r
87         else\r
88         {\r
89                 /* Nothing strange. Go on... */\r
90                 res = E_OK;\r
91         }\r
92 #else\r
93         res = E_OK;\r
94 #endif\r
95         if (E_OK == res){\r
96                 ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->notifictionEnable = 1;\r
97         }\r
98 }\r
99 \r
100 void Adc_InternalDisableGroupNotification (Adc_StateType adcState, const Adc_ConfigType *ConfigPtr, Adc_GroupType group)\r
101 {\r
102         Std_ReturnType res;\r
103 \r
104 #if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
105         if( (ValidateInit(adcState, ADC_DISABLEGROUPNOTIFICATION_ID) == E_NOT_OK) ||\r
106                 (ValidateGroup(ConfigPtr, group, ADC_DISABLEGROUPNOTIFICATION_ID) == E_NOT_OK))\r
107         {\r
108                 res = E_NOT_OK;\r
109         }\r
110         else if (ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].groupCallback == NULL)\r
111         {\r
112                 res = E_NOT_OK;\r
113                 Det_ReportError(MODULE_ID_ADC,0,ADC_DISABLEGROUPNOTIFICATION_ID ,ADC_E_NOTIF_CAPABILITY );\r
114         }\r
115         else\r
116         {\r
117                 /* Nothing strange. Go on... */\r
118                 res = E_OK;\r
119         }\r
120 #else\r
121         res = E_OK;\r
122 #endif\r
123         if (E_OK == res){\r
124                 ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->notifictionEnable = 0;\r
125         }\r
126 }\r
127 #endif\r
128 \r
129 \r
130 \r
131 /* Development error checking functions. */\r
132 #if (ADC_READ_GROUP_API == STD_ON)\r
133 Std_ReturnType Adc_CheckReadGroup (Adc_StateType adcState, const Adc_ConfigType *ConfigPtr, Adc_GroupType group)\r
134 {\r
135   Std_ReturnType returnValue = E_OK;\r
136 \r
137 #if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
138 \r
139   if( (ValidateInit(adcState, ADC_READGROUP_ID) == E_NOT_OK) ||\r
140       (ValidateGroup(ConfigPtr, group, ADC_READGROUP_ID) == E_NOT_OK))\r
141   {\r
142           returnValue = E_NOT_OK;\r
143   }\r
144   else if (ADC_IDLE == ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->groupStatus)\r
145   {\r
146     /* ADC388. */\r
147     returnValue = E_NOT_OK;\r
148     Det_ReportError(MODULE_ID_ADC,0,ADC_READGROUP_ID ,ADC_E_IDLE );\r
149   }\r
150   else\r
151   {\r
152     /* Nothing strange. Go on... */\r
153     returnValue = E_OK;\r
154   }\r
155 #endif\r
156   return (returnValue);\r
157 }\r
158 #endif\r
159 \r
160 #if (ADC_ENABLE_START_STOP_GROUP_API == STD_ON)\r
161 Std_ReturnType Adc_CheckStartGroupConversion (Adc_StateType adcState, const Adc_ConfigType *ConfigPtr, Adc_GroupType group)\r
162 {\r
163   Std_ReturnType returnValue = E_OK;\r
164 \r
165 #if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
166 \r
167   if( (ValidateInit(adcState, ADC_STARTGROUPCONVERSION_ID) == E_NOT_OK) ||\r
168       (ValidateGroup(ConfigPtr, group, ADC_STARTGROUPCONVERSION_ID) == E_NOT_OK))\r
169   {\r
170           returnValue = E_NOT_OK;\r
171   }\r
172   else if ( NULL == ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->resultBufferPtr )\r
173   {\r
174       /* ResultBuffer not set, ADC424 */\r
175           Det_ReportError(MODULE_ID_ADC,0,ADC_STARTGROUPCONVERSION_ID, ADC_E_BUFFER_UNINIT );\r
176           returnValue = E_NOT_OK;\r
177   }\r
178   else if (!(ADC_TRIGG_SRC_SW == ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].triggerSrc))\r
179   {\r
180     /* Wrong trig source, ADC133. */\r
181     Det_ReportError(MODULE_ID_ADC,0,ADC_STARTGROUPCONVERSION_ID, ADC_E_WRONG_TRIGG_SRC);\r
182     returnValue = E_NOT_OK;\r
183   }\r
184   else if (!((ADC_IDLE             == ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->groupStatus) ||\r
185              (ADC_STREAM_COMPLETED == ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->groupStatus)))\r
186   {\r
187     /* Group status not OK, ADC351, ADC428 */\r
188     Det_ReportError(MODULE_ID_ADC,0,ADC_STARTGROUPCONVERSION_ID, ADC_E_BUSY );\r
189 \r
190     //returnValue = E_NOT_OK;\r
191     returnValue = E_OK;\r
192   }\r
193   else\r
194   {\r
195     returnValue = E_OK;\r
196   }\r
197 #endif\r
198 \r
199   return (returnValue);\r
200 }\r
201 \r
202 Std_ReturnType Adc_CheckStopGroupConversion (Adc_StateType adcState, const Adc_ConfigType *ConfigPtr, Adc_GroupType group)\r
203 {\r
204   Std_ReturnType returnValue = E_OK;\r
205 \r
206 #if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
207   if( (ValidateInit(adcState, ADC_STOPGROUPCONVERSION_ID) == E_NOT_OK) ||\r
208       (ValidateGroup(ConfigPtr, group, ADC_STOPGROUPCONVERSION_ID) == E_NOT_OK))\r
209   {\r
210           returnValue = E_NOT_OK;\r
211   }\r
212   else if (!(ADC_TRIGG_SRC_SW == ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].triggerSrc))\r
213   {\r
214         /* Wrong trig source, ADC164. */\r
215         Det_ReportError(MODULE_ID_ADC,0,ADC_STOPGROUPCONVERSION_ID, ADC_E_WRONG_TRIGG_SRC);\r
216         returnValue = E_NOT_OK;\r
217   }\r
218   else if (ADC_IDLE == ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->groupStatus)\r
219   {\r
220         /* Group status not OK, ADC241 */\r
221         Det_ReportError(MODULE_ID_ADC,0,ADC_STOPGROUPCONVERSION_ID, ADC_E_IDLE );\r
222         returnValue = E_NOT_OK;\r
223   }\r
224   else\r
225   {\r
226         returnValue = E_OK;\r
227   }\r
228 #endif\r
229 \r
230   return (returnValue);\r
231 }\r
232 #endif\r
233 \r
234 Std_ReturnType Adc_CheckInit (Adc_StateType adcState, const Adc_ConfigType *ConfigPtr)\r
235 {\r
236   Std_ReturnType returnValue = E_OK;\r
237 \r
238 #if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
239   if (!(ADC_UNINIT == adcState))\r
240   {\r
241     /* Oops, already initialised. */\r
242     Det_ReportError(MODULE_ID_ADC,0,ADC_INIT_ID, ADC_E_ALREADY_INITIALIZED );\r
243     returnValue = E_NOT_OK;\r
244   }\r
245   else if (ConfigPtr == NULL)\r
246   {\r
247     /* Wrong config! */\r
248     Det_ReportError(MODULE_ID_ADC,0,ADC_INIT_ID, ADC_E_PARAM_CONFIG );\r
249     returnValue = E_NOT_OK;\r
250   }\r
251   else\r
252   {\r
253     /* Looks good!! */\r
254     returnValue = E_OK;\r
255   }\r
256 #endif\r
257   return (returnValue);\r
258 }\r
259 \r
260 #if (ADC_DEINIT_API == STD_ON)\r
261 Std_ReturnType Adc_CheckDeInit (Adc_StateType adcState, const Adc_ConfigType *ConfigPtr)\r
262 {\r
263         Std_ReturnType returnValue = E_OK;\r
264 \r
265 #if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
266         if(ValidateInit(adcState, ADC_DEINIT_ID) == E_OK)\r
267         {\r
268                 for (Adc_GroupType group = (Adc_GroupType)0; group < ConfigPtr->nbrOfGroups; group++)\r
269                 {\r
270                         /*  Check ADC is IDLE or COMPLETE*/\r
271                         if((ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->groupStatus != ADC_IDLE) && (ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->groupStatus != ADC_STREAM_COMPLETED))\r
272                         {\r
273                                 Det_ReportError(MODULE_ID_ADC,0,ADC_DEINIT_ID, ADC_E_BUSY );\r
274                                 returnValue = E_NOT_OK;\r
275                         }\r
276                 }\r
277         }\r
278         else\r
279         {\r
280                 returnValue = E_NOT_OK;\r
281         }\r
282 #endif\r
283         return (returnValue);\r
284 }\r
285 #endif\r
286 \r
287 Std_ReturnType Adc_CheckSetupResultBuffer (Adc_StateType adcState, const Adc_ConfigType *ConfigPtr, Adc_GroupType group)\r
288 {\r
289   Std_ReturnType returnValue = E_OK;\r
290 \r
291 #if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
292   if( (ValidateInit(adcState, ADC_SETUPRESULTBUFFER_ID) == E_NOT_OK) ||\r
293             (ValidateGroup(ConfigPtr, group, ADC_SETUPRESULTBUFFER_ID) == E_NOT_OK))\r
294   {\r
295           returnValue = E_NOT_OK;\r
296   }\r
297 #endif\r
298   return (returnValue);\r
299 }\r
300 \r
301 Std_ReturnType Adc_CheckGetStreamLastPointer (Adc_StateType adcState, const Adc_ConfigType *ConfigPtr, Adc_GroupType group)\r
302 {\r
303   Std_ReturnType returnValue = E_OK;\r
304 \r
305 #if ( ADC_DEV_ERROR_DETECT == STD_ON )\r
306   if( (ValidateInit(adcState, ADC_GETSTREAMLASTPOINTER_ID) == E_NOT_OK) ||\r
307           (ValidateGroup(ConfigPtr, group, ADC_GETSTREAMLASTPOINTER_ID) == E_NOT_OK))\r
308   {\r
309           returnValue = E_NOT_OK;\r
310   }\r
311   else if(ConfigPtr->groupConfigPtr[group%ADC_NOF_GROUP_PER_CONTROLLER].status->groupStatus == ADC_IDLE)\r
312   { /** @req ADC215 Check ADC is not in IDLE */\r
313         Det_ReportError(MODULE_ID_ADC,0,ADC_GETSTREAMLASTPOINTER_ID, ADC_E_IDLE );\r
314         returnValue = E_NOT_OK;\r
315   }\r
316 #endif\r
317   return (returnValue);\r
318 }\r
319 \r
320 \r
321 \r