]> rtime.felk.cvut.cz Git - arc.git/blob - system/EcuM/EcuM.c
Merged in from default
[arc.git] / system / EcuM / EcuM.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 //lint -emacro(904,VALIDATE,VALIDATE_RV,VALIDATE_NO_RV) //904 PC-Lint exception to MISRA 14.7 (validate macros).\r
17 \r
18 #include "EcuM.h"\r
19 #include "Modules.h"\r
20 #include <string.h>\r
21 #include "Os.h"\r
22 #include "EcuM_Internals.h"\r
23 #include "EcuM_Cbk.h"\r
24 #include "Mcu.h"\r
25 #include "Det.h"\r
26 #include "irq.h"\r
27 #if defined(USE_NVM)\r
28 #include "Nvm.h"\r
29 #endif\r
30 \r
31 EcuM_GobalType internal_data;\r
32 \r
33 void EcuM_Init( void )\r
34 {\r
35         internal_data.current_state = ECUM_STATE_STARTUP_ONE;\r
36 \r
37         // Initialize drivers that are needed to determine PostBuild configuration\r
38         EcuM_AL_DriverInitZero();\r
39 \r
40         // Initialize the OS\r
41         InitOS();\r
42 \r
43         // Enable interrupts\r
44         Irq_Init();\r
45 \r
46         // Determine PostBuild configuration\r
47         internal_data.config = EcuM_DeterminePbConfiguration();\r
48 \r
49         // Check consistency of PB configuration\r
50         // TODO\r
51 \r
52         // Initialize drivers needed before the OS-starts\r
53         EcuM_AL_DriverInitOne(internal_data.config);\r
54 \r
55         // Determine the reset/wakeup reason\r
56         // TODO Mcu_ResetType type = Mcu_GetResetReason();\r
57 \r
58         // Set default shutdown target\r
59         internal_data.shutdown_target = internal_data.config->EcuMDefaultShutdownTarget;\r
60         internal_data.shutdown_mode = internal_data.config->EcuMDefaultShutdownMode;\r
61 \r
62         // Set default application mode\r
63         internal_data.app_mode = internal_data.config->EcuMDefaultAppMode;\r
64 #if defined(USE_COMM)\r
65         internal_data.run_comm_requests = 0;\r
66 #endif\r
67         internal_data.run_requests = 0;\r
68         internal_data.postrun_requests = 0;\r
69 \r
70         internal_data.initiated = TRUE;\r
71 \r
72         // Start this baby up\r
73         StartOS(internal_data.app_mode);\r
74 }\r
75 \r
76 void EcuM_StartupTwo(void)\r
77 {\r
78 #if defined(USE_NVM)\r
79         extern CounterType Os_Arc_OsTickCounter;\r
80         TickType tickTimerStart, tickTimer, tickTimerElapsed;\r
81         StatusType tickTimerStatus;\r
82         static NvM_RequestResultType readAllResult;\r
83 #endif\r
84 \r
85         internal_data.current_state = ECUM_STATE_STARTUP_TWO;\r
86 \r
87         // Initialize the BSW scheduler\r
88         // TODO SchM_Init();\r
89 \r
90         // Initialize drivers that don't need NVRAM data\r
91         EcuM_AL_DriverInitTwo(internal_data.config);\r
92 \r
93 #if defined(USE_NVM)\r
94         // Start timer to wait for NVM job to complete\r
95         tickTimerStatus = GetCounterValue(Os_Arc_OsTickCounter , &tickTimerStart);\r
96         if (tickTimerStatus != E_OK) {\r
97                 // TODO: Generate error?\r
98         }\r
99 #endif\r
100 \r
101         // Prepare the system to startup RTE\r
102         // TODO EcuM_OnRTEStartup();\r
103 #if defined(USE_RTE)\r
104         Rte_Start();\r
105 #endif\r
106 \r
107 #if defined(USE_NVM)\r
108         // Wait for the NVM job (NvmReadAll) to terminate\r
109         do {\r
110                 NvM_GetErrorStatus(0, &readAllResult);  // Read the multiblock status\r
111                 tickTimer = tickTimerStart;     // Save this because the GetElapsedCounterValue() will destroy it.\r
112                 tickTimerStatus =  GetElapsedCounterValue(Os_Arc_OsTickCounter, &tickTimer, &tickTimerElapsed);\r
113                 if (tickTimerStatus != E_OK) {\r
114                         // TODO: Generate error?\r
115                 }\r
116         } while( (readAllResult == NVM_REQ_PENDING) && (tickTimerElapsed < internal_data.config->EcuMNvramReadAllTimeout) );\r
117 #endif\r
118 \r
119         // Initialize drivers that need NVRAM data\r
120         EcuM_AL_DriverInitThree(internal_data.config);\r
121 \r
122         // Indicate mode change to RTE\r
123         // TODO\r
124 \r
125         // If coming from startup sequence, enter Run mode\r
126 //      if (internal_data.current_state == ECUM_STATE_STARTUP_TWO)\r
127                 EcuM_enter_run_mode();\r
128 \r
129 }\r
130 \r
131 // Typically called from OS shutdown hook\r
132 void EcuM_Shutdown(void)\r
133 {\r
134         internal_data.current_state = ECUM_STATE_GO_OFF_TWO;\r
135 \r
136         // Let the last drivers do a nice shutdown\r
137         EcuM_OnGoOffTwo();\r
138 \r
139         if (internal_data.shutdown_target == ECUM_STATE_OFF)\r
140         {\r
141                 EcuM_AL_SwitchOff();\r
142         }\r
143         else\r
144         {\r
145 #if (MCU_PERFORM_RESET_API == STD_ON)\r
146                 Mcu_PerformReset();\r
147 #else\r
148                 for(;;)\r
149                 {\r
150                   ;\r
151                 }\r
152 #endif\r
153         }\r
154 }\r
155 \r
156 Std_ReturnType EcuM_GetState(EcuM_StateType* state)\r
157 {\r
158         VALIDATE_RV(state != NULL, ECUM_GETSTATE_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
159 \r
160         *state = internal_data.current_state;\r
161 \r
162         return E_OK;\r
163 }\r
164 \r
165 Std_ReturnType EcuM_SelectApplicationMode(AppModeType appMode)\r
166 {\r
167         VALIDATE_RV(internal_data.initiated, ECUM_SELECTAPPMODE_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
168 \r
169         // TODO Save this application mode for next startup\r
170         (void) appMode;\r
171 \r
172         return E_NOT_OK;\r
173 }\r
174 \r
175 Std_ReturnType EcuM_GetApplicationMode(AppModeType* appMode)\r
176 {\r
177         VALIDATE_RV(internal_data.initiated, ECUM_GETAPPMODE_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
178         VALIDATE_RV(appMode != NULL, ECUM_GETAPPMODE_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
179 \r
180         *appMode = internal_data.app_mode;\r
181 \r
182         return E_OK;\r
183 }\r
184 \r
185 Std_ReturnType EcuM_SelectBootTarget(EcuM_BootTargetType target)\r
186 {\r
187         VALIDATE_RV(internal_data.initiated, ECUM_SELECT_BOOTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
188 \r
189         // TODO Do something great here\r
190         (void) target;\r
191 \r
192         return E_NOT_OK;\r
193 }\r
194 \r
195 Std_ReturnType EcuM_GetBootTarget(EcuM_BootTargetType* target)\r
196 {\r
197         VALIDATE_RV(internal_data.initiated, ECUM_GET_BOOTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
198         VALIDATE_RV(target != NULL, ECUM_GET_BOOTARGET_ID, ECUM_E_NULL_POINTER, E_NOT_OK);\r
199 \r
200         // TODO Return selected boot target here\r
201         (void) target;\r
202 \r
203         return E_NOT_OK;\r
204 }\r
205 \r
206 \r
207 Std_ReturnType EcuM_SelectShutdownTarget(EcuM_StateType target, uint8 mode)\r
208 {\r
209         VALIDATE_RV(internal_data.initiated, ECUM_SELECTSHUTDOWNTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
210         VALIDATE_RV((target == ECUM_STATE_OFF) || (target == ECUM_STATE_RESET) || (target == ECUM_STATE_SLEEP), ECUM_SELECTSHUTDOWNTARGET_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
211 \r
212         internal_data.shutdown_target = target;\r
213         internal_data.shutdown_mode = mode;\r
214 \r
215         return E_OK;\r
216 }\r
217 \r
218 \r
219 Std_ReturnType EcuM_GetShutdownTarget(EcuM_StateType *target, uint8 *mode)\r
220 {\r
221         VALIDATE_RV(internal_data.initiated, ECUM_GETSHUTDOWNTARGET_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
222 \r
223         *target = internal_data.shutdown_target;\r
224         *mode = internal_data.shutdown_mode;\r
225 \r
226         return E_OK;\r
227 }\r
228 \r
229 \r
230 Std_ReturnType EcuM_RequestRUN(EcuM_UserType user)\r
231 {\r
232         VALIDATE_RV(internal_data.initiated, ECUM_REQUESTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
233         VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_REQUESTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
234 \r
235         internal_data.run_requests |= (uint32)1 << user;\r
236 \r
237         return E_OK;\r
238 }\r
239 \r
240 Std_ReturnType EcuM_ReleaseRUN(EcuM_UserType user)\r
241 {\r
242         VALIDATE_RV(internal_data.initiated, ECUM_RELEASERUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
243         VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_RELEASERUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
244 \r
245         internal_data.run_requests &= ~((uint32)1 << user);\r
246 \r
247         return E_OK;\r
248 }\r
249 \r
250 #if defined(USE_COMM)\r
251 Std_ReturnType EcuM_ComM_RequestRUN(NetworkHandleType user)\r
252 {\r
253         VALIDATE_RV(internal_data.initiated, ECUM_COMM_REQUESTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
254         VALIDATE_RV(user < 32, ECUM_COMM_REQUESTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
255 \r
256         internal_data.run_comm_requests |= (uint32)1 << user;\r
257 \r
258         return E_OK;\r
259 }\r
260 \r
261 Std_ReturnType EcuM_ComM_ReleaseRUN(NetworkHandleType user)\r
262 {\r
263         VALIDATE_RV(internal_data.initiated, ECUM_COMM_RELEASERUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
264         VALIDATE_RV(user < 32, ECUM_COMM_RELEASERUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
265 \r
266         internal_data.run_comm_requests &= ~((uint32)1 << user);\r
267 \r
268         return E_OK;\r
269 }\r
270 \r
271 boolean EcuM_ComM_HasRequestedRUN(NetworkHandleType user)\r
272 {\r
273         VALIDATE_RV(internal_data.initiated, ECUM_COMM_HASREQUESTEDRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
274         VALIDATE_RV(user < 32, ECUM_COMM_HASREQUESTEDRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
275 \r
276         return (internal_data.run_comm_requests &((uint32)1 << user)) != 0;\r
277 }\r
278 #endif\r
279 \r
280 Std_ReturnType EcuM_RequestPOST_RUN(EcuM_UserType user)\r
281 {\r
282         VALIDATE_RV(internal_data.initiated, ECUM_REQUESTPOSTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
283         VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_REQUESTPOSTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
284 \r
285         internal_data.postrun_requests |= (uint32)1 << user;\r
286 \r
287         return E_OK;\r
288 }\r
289 \r
290 Std_ReturnType EcuM_ReleasePOST_RUN(EcuM_UserType user)\r
291 {\r
292         VALIDATE_RV(internal_data.initiated, ECUM_RELEASEPOSTRUN_ID, ECUM_E_NOT_INITIATED, E_NOT_OK);\r
293         VALIDATE_RV(user < ECUM_USER_ENDMARK, ECUM_RELEASEPOSTRUN_ID, ECUM_E_INVALID_PAR, E_NOT_OK);\r
294 \r
295         internal_data.postrun_requests &= ~((uint32)1 << user);\r
296 \r
297         return E_OK;\r
298 }\r
299 \r