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