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