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