1 /*
2 * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved.
3 *
4 * UniProton is licensed under Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 * http://license.coscl.org.cn/MulanPSL2
8 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
9 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
10 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11 * See the Mulan PSL v2 for more details.
12 * Create: 2009-12-22
13 * Description: UniProton的初始化C文件。
14 */
15 #include "prt_config_internal.h"
16
OsConfigAddrSizeGet(uintptr_t addr,uintptr_t size,uintptr_t * destAddr,uintptr_t * destSize)17 OS_SEC_ALW_INLINE INLINE void OsConfigAddrSizeGet(uintptr_t addr, uintptr_t size,
18 uintptr_t *destAddr, uintptr_t *destSize)
19 {
20 *destAddr = addr;
21 *destSize = size;
22 }
23
OsMemConfigReg(void)24 U32 OsMemConfigReg(void)
25 {
26 U32 ret;
27
28 ret = OsFscMemInit(OS_MEM_FSC_PT_ADDR, OS_MEM_FSC_PT_SIZE);
29 if (ret != OS_OK) {
30 return ret;
31 }
32
33 return OS_OK;
34 }
35
OsMemDefPtInit(void)36 U32 OsMemDefPtInit(void)
37 {
38 return OS_OK;
39 }
40
OsMemConfigInit(void)41 U32 OsMemConfigInit(void)
42 {
43 /* 系统默认FSC内存分区初始化 */
44 return OsMemDefPtInit();
45 }
46
OsSystemReg(void)47 U32 OsSystemReg(void)
48 {
49 struct SysModInfo sysModInfo;
50
51 sysModInfo.systemClock = OS_SYS_CLOCK;
52 sysModInfo.cpuType = OS_CPU_TYPE;
53 sysModInfo.sysTimeHook = OS_SYS_TIME_HOOK;
54 #if defined(OS_OPTION_HWI_MAX_NUM_CONFIG)
55 sysModInfo.hwiMaxNum = OS_HWI_MAX_NUM_CONFIG;
56 #endif
57
58 return OsSysRegister(&sysModInfo);
59 }
60
61 #if (OS_INCLUDE_SEM == YES)
OsSemConfigReg(void)62 U32 OsSemConfigReg(void)
63 {
64 struct SemModInfo semModInfo;
65
66 semModInfo.maxNum = OS_SEM_MAX_SUPPORT_NUM;
67 return OsSemRegister(&semModInfo);
68
69 }
70 #endif
71
72 #if (OS_INCLUDE_TASK == YES)
OsTaskInfoSet(struct TskModInfo * taskModInfo)73 void OsTaskInfoSet(struct TskModInfo *taskModInfo)
74 {
75 taskModInfo->maxNum = OS_TSK_MAX_SUPPORT_NUM;
76 taskModInfo->defaultSize = OS_TSK_DEFAULT_STACK_SIZE;
77 taskModInfo->idleStackSize = OS_TSK_IDLE_STACK_SIZE;
78 taskModInfo->magicWord = WORD_PACK((U32)OS_TSK_STACK_MAGIC_WORD);
79 }
80 #else
81 #error "OS_INCLUDE_TASK MUST BE YES! The SWI has been cut out,the task can not cut out."
82 #endif
83
OsHookConfigReg(void)84 U32 OsHookConfigReg(void)
85 {
86 struct HookModInfo hookModInfo;
87
88 hookModInfo.maxNum[OS_HOOK_HWI_ENTRY] = OS_HOOK_HWI_ENTRY_NUM;
89 hookModInfo.maxNum[OS_HOOK_HWI_EXIT] = OS_HOOK_HWI_EXIT_NUM;
90 hookModInfo.maxNum[OS_HOOK_TSK_SWITCH] = OS_HOOK_TSK_SWITCH_NUM;
91 hookModInfo.maxNum[OS_HOOK_IDLE_PERIOD] = OS_HOOK_IDLE_NUM;
92
93 return OsHookRegister(&hookModInfo);
94 }
95
OsSysConfigReg(void)96 U32 OsSysConfigReg(void)
97 {
98 U32 ret;
99
100 ret = OsSystemReg();
101 if (ret != OS_OK) {
102 return ret;
103 }
104 return OS_OK;
105 }
106
107 #if (OS_INCLUDE_TICK == YES)
OsTickConfigReg(void)108 U32 OsTickConfigReg(void)
109 {
110 struct TickModInfo tickModInfo;
111
112 tickModInfo.tickPerSecond = OS_TICK_PER_SECOND;
113 tickModInfo.tickPriority = 0;
114
115 return OsTickRegister(&tickModInfo);
116 }
117 #endif
118
119 #if (OS_INCLUDE_TASK == YES)
OsTskConfigReg(void)120 U32 OsTskConfigReg(void)
121 {
122 struct TskModInfo taskModInfo;
123 OsTaskInfoSet(&taskModInfo);
124 return OsTskRegister(&taskModInfo);
125 }
126 #endif
127
128 #if (OS_INCLUDE_QUEUE == YES)
OsQueueConfigReg(void)129 U32 OsQueueConfigReg(void)
130 {
131 return OsQueueRegister(OS_QUEUE_MAX_SUPPORT_NUM);
132 }
133 #endif
134
135 #if (OS_INCLUDE_CPUP == YES)
OsCpupConfigReg(void)136 U32 OsCpupConfigReg(void)
137 {
138 struct CpupModInfo cpupModInfo;
139
140 cpupModInfo.cpupWarnFlag = (bool)OS_CONFIG_CPUP_WARN;
141 cpupModInfo.sampleTime = OS_CPUP_SAMPLE_INTERVAL;
142 cpupModInfo.warn = OS_CPUP_SHORT_WARN;
143 cpupModInfo.resume = OS_CPUP_SHORT_RESUME;
144
145 return OsCpupRegister(&cpupModInfo);
146 }
147 #endif
148
149 #if (OS_INCLUDE_TICK_SWTMER == YES)
OsSwTmrConfigInit(void)150 U32 OsSwTmrConfigInit(void)
151 {
152 return OsSwTmrInit(OS_TICK_SWITIMER_MAX_NUM);
153 }
154 #endif
155
156 #if (OS_INCLUDE_CPUP == YES)
157 #if (OS_INCLUDE_TICK == NO)
158 #error "OS_INCLUDE_CPUP depend on OS_INCLUDE_TICK!"
159 #endif
OsCpupConfigInit(void)160 U32 OsCpupConfigInit(void)
161 {
162 U32 ret;
163
164 ret = OsCpupInit();
165 if (ret != OS_OK) {
166 return ret;
167 }
168
169 if (OS_CONFIG_CPUP_WARN == YES) {
170 #if defined(OS_OPTION_CPUP_WARN)
171 OsCpupWarnInit();
172 #else
173 return OS_ERRNO_SYS_NO_CPUP_WARN;
174 #endif
175 }
176 return OS_OK;
177 }
178 #endif
179
180 #if (OS_INCLUDE_SEM == YES)
OsSemConfigInit(void)181 U32 OsSemConfigInit(void)
182 {
183 return OsSemInit();
184 }
185 #endif
186
187 #if (OS_INCLUDE_TASK == YES)
OsTskConfigInit(void)188 U32 OsTskConfigInit(void)
189 {
190 return OsTskInit();
191 }
192 #endif
193
OsHwiConfigReg(void)194 static U32 OsHwiConfigReg(void)
195 {
196 #if (OS_INCLUDE_GIC_BASE_ADDR_CONFIG == YES)
197 U32 ret;
198 ret = OsGicConfigRegister((uintptr_t)OS_GIC_BASE_ADDR, (uintptr_t)OS_GICR_OFFSET, (uintptr_t)OS_GICR_STRIDE);
199 if (ret != OS_OK) {
200 return ret;
201 }
202 #endif
203 return OS_OK;
204 }
205
206 /* 系统初始化注册表 */
207 struct OsModuleConfigInfo g_moduleConfigTab[] = {
208 /* {模块号, 模块注册函数, 模块初始化函数} */
209 {OS_MID_SYS, {OsSysConfigReg, NULL}},
210 {OS_MID_MEM, {OsMemConfigReg, OsMemConfigInit}},
211 {OS_MID_HWI, {OsHwiConfigReg, OsHwiConfigInit}},
212 {OS_MID_HARDDRV, {NULL, PRT_HardDrvInit}},
213 {OS_MID_HOOK, {OsHookConfigReg, OsHookConfigInit}},
214 {OS_MID_EXC, {NULL, OsExcConfigInit}},
215 #if (OS_INCLUDE_TASK == YES)
216 {OS_MID_TSK, {OsTskConfigReg, OsTskConfigInit}},
217 #endif
218 #if (OS_INCLUDE_TICK == YES)
219 {OS_MID_TICK, {OsTickConfigReg, OsTickConfigInit}},
220 #endif
221
222 #if (OS_INCLUDE_TICK_SWTMER == YES)
223 {OS_MID_SWTMR, {NULL, OsSwTmrConfigInit}},
224 #endif
225
226 #if (OS_INCLUDE_CPUP == YES)
227 {OS_MID_CPUP, {OsCpupConfigReg, OsCpupConfigInit}},
228 #endif
229 #if (OS_INCLUDE_SEM == YES)
230 {OS_MID_SEM, {OsSemConfigReg, OsSemConfigInit}},
231 #endif
232 #if (OS_INCLUDE_QUEUE == YES)
233 {OS_MID_QUEUE, {OsQueueConfigReg, OsQueueConfigInit}},
234 #endif
235 {OS_MID_APP, {NULL, PRT_AppInit}},
236
237 {OS_MID_BUTT, {NULL, NULL}},
238 };
239
240 /*
241 * 描述:OS模块注册、初始化运行函数
242 */
OsModuleConfigRun(enum OsinitPhaseId initPhaseId,U32 initPhase)243 U32 OsModuleConfigRun(enum OsinitPhaseId initPhaseId, U32 initPhase)
244 {
245 U32 idx = 0;
246 U32 ret = OS_OK;
247 while (g_moduleConfigTab[idx].moudleId != OS_MID_BUTT) {
248 if (g_moduleConfigTab[idx].moudleConfigFunc[initPhaseId] == NULL) {
249 idx++;
250 continue;
251 }
252 ret = g_moduleConfigTab[idx].moudleConfigFunc[initPhaseId]();
253 if (ret != OS_OK) {
254 break;
255 }
256 idx++;
257 }
258 return ret;
259 }
OsRegister(void)260 U32 OsRegister(void)
261 {
262 return OsModuleConfigRun(OS_REGISTER_ID, OS_REGISTER_PHASE);
263 }
264
265 /*
266 * 描述:OsInitialize阶段
267 */
OsInitialize(void)268 U32 OsInitialize(void)
269 {
270 return OsModuleConfigRun(OS_INIT_ID, OS_INITIALIZE_PHASE);
271 }
272
273 /*
274 * 描述:OsStart阶段
275 */
OsStart(void)276 U32 OsStart(void)
277 {
278 U32 ret;
279
280 #if (OS_INCLUDE_TICK == YES)
281 /* 表示系统在进行启动阶段,匹配MOUDLE_ID之后,标记进入TICK模块的启动 */
282 ret = OsTickStart();
283 if (ret != OS_OK) {
284 return ret;
285 }
286 #endif
287
288 #if (OS_INCLUDE_TASK == YES)
289 /* 表示系统在进行启动阶段,匹配MOUDLE_ID之后,标记进入任务模块的启动 */
290 ret = OsActivate();
291 #else
292 ret = OS_OK;
293 #endif
294
295 return ret;
296 }
297
OsConfigStart(void)298 S32 OsConfigStart(void)
299 {
300 U32 ret;
301
302 OsHwInit();
303
304 /* OS模块注册 */
305 ret = OsRegister();
306 if (ret != OS_OK) {
307 return (S32)ret;
308 }
309
310 /* OS模块初始化 */
311 ret = OsInitialize();
312 if (ret != OS_OK) {
313 return (S32)ret;
314 }
315
316 /* OS启动调度 */
317 ret = OsStart();
318 if (ret != OS_OK) {
319 return (S32)ret;
320 }
321
322 /* Execution should not reach this point */
323 return (S32)OS_ERROR;
324 }
325