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