• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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