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: 系统模块的对外头文件。
14 */
15 #ifndef PRT_SYS_H
16 #define PRT_SYS_H
17
18 #include "prt_module.h"
19 #include "prt_errno.h"
20
21 #ifdef __cplusplus
22 #if __cplusplus
23 extern "C" {
24 #endif /* __cpluscplus */
25 #endif /* __cpluscplus */
26
27 /*
28 * 系统基本功能错误码:指针参数为空。
29 *
30 * 值: 0x02000001
31 *
32 * 解决方案: 请检查入参是否为空
33 */
34 #define OS_ERRNO_SYS_PTR_NULL OS_ERRNO_BUILD_ERROR(OS_MID_SYS, 0x01)
35
36 /*
37 * 系统基本功能错误码:系统主频配置非法。
38 *
39 * 值: 0x02000002
40 *
41 * 解决方案: 在prt_config.h中配置合理的系统主频。
42 */
43 #define OS_ERRNO_SYS_CLOCK_INVALID OS_ERRNO_BUILD_ERROR(OS_MID_SYS, 0x02)
44
45 /*
46 * 系统基本功能错误码:CPUP告警被裁减
47 *
48 * 值: 0x02000003
49 *
50 * 解决方案:排除config项是否正确,该平台不支持CPUP告警
51 *
52 */
53 #define OS_ERRNO_SYS_NO_CPUP_WARN OS_ERRNO_BUILD_ERROR(OS_MID_SYS, 0x03)
54
55 /*
56 * 系统基本功能错误码:设置RND值的时候入参非法。
57 *
58 * 值: 0x02000004
59 *
60 * 解决方案: 请确保设置RND值时入参合法。
61 */
62 #define OS_ERRNO_SYS_RND_PARA_INVALID OS_ERRNO_BUILD_ERROR(OS_MID_SYS, 0x04)
63
64 /*
65 * 系统基本功能错误码:注册获取系统时间函数重复注册了
66 *
67 * 值: 0x02000005
68 *
69 * 解决方案:获取系统时间函数不允许重复注册
70 *
71 */
72 #define OS_ERRNO_SYS_TIME_HOOK_REGISTER_REPEATED OS_ERRNO_BUILD_ERROR(OS_MID_SYS, 0x05)
73
74 /*
75 * 硬中断错误码:配置的中断个数不正确
76 *
77 * 值: 0x02000806
78 *
79 * 解决方案: 检查配置的中断个数是否为0或者超过了硬件范围
80 */
81 #define OS_ERRNO_SYS_HWI_MAX_NUM_CONFIG_INVALID OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x06)
82
83 /*
84 * 系统初始化阶段状态
85 */
86 /*
87 * 表示初始态。
88 *
89 */
90 #define OS_DEFAULT_PHASE 0x00
91
92 /*
93 * 表示进入PRT_HardBootInit。
94 *
95 */
96 #define OS_BOOT_PHASE 0x03
97
98 /*
99 * 表示进入BSS段初始化。
100 *
101 */
102 #define OS_BSSINIT_PHASE 0x06
103
104 /*
105 * 表示进入C lib库初始化。
106 *
107 */
108 #define OS_LIBCINIT_PHASE 0x08
109
110 /*
111 * 表示系统在进行OS模块注册阶段,匹配MOUDLE_ID之后,标记进入MODULE_ID的注册。
112 *
113 */
114 #define OS_REGISTER_PHASE 0x09
115
116 /*
117 * 表示系统在进行OS模块初始化阶段,匹配MOUDLE_ID之后,标记进入MODULE_ID的初始化。
118 *
119 */
120 #define OS_INITIALIZE_PHASE 0x0a
121
122 /*
123 * 表示系统在进行产品驱动初始化阶段,匹配MOUDLE_ID之后,标记进入MODULE_ID的初始化。
124 *
125 */
126 #define OS_DEVDRVINIT_PHASE 0x0b
127
128 /*
129 * 表示系统在进行OS启动阶段,匹配MOUDLE_ID之后,标记进入MODULE_ID的启动。
130 *
131 */
132 #define OS_START_PHASE 0x0c
133
134 /*
135 * 每秒毫秒数
136 */
137 #define OS_SYS_MS_PER_SECOND 1000
138
139 /*
140 * 每秒微秒数
141 */
142 #define OS_SYS_US_PER_SECOND 1000000
143
144 /*
145 * 每秒纳秒数
146 */
147 #define OS_SYS_NS_PER_SECOND 1000000000
148
149 /*
150 * OS版本号
151 */
152 #define OS_SYS_OS_VER_LEN 48
153
154 /*
155 * 产品版本号
156 */
157 #define OS_SYS_APP_VER_LEN 64
158
159 /*
160 * 系统模块线程类型获取枚举结构定义
161 *
162 * 系统模块线程类型获取
163 */
164 enum SysThreadType {
165 SYS_HWI, /* 当前线程类型属于硬中断 */
166 SYS_TASK, /* 当前线程类型属于任务 */
167 SYS_KERNEL, /* 当前线程类型属于内核 */
168 SYS_BUTT
169 };
170
171 /*
172 * @brief 计算系统绝对时间钩子函数的类型定义。
173 *
174 * @par 描述
175 * 由于OS没有接管硬件定时器,需要用户提供计算系统时间的钩子函数。
176 *
177 * @attention 获取的是64bit cycles 数据。
178 *
179 * @param 无。
180 *
181 * @retval 系统绝对时间
182 * @par 依赖
183 * <ul><li>prt_sys.h:该接口声明所在的头文件。</li></ul>
184 * @see 无。
185 */
186 typedef U64 (*SysTimeFunc)(void);
187
188 /*
189 * 系统模块配置信息的结构体定义。
190 *
191 * 保存系统模块的配置项信息。
192 */
193 struct SysModInfo {
194 /* CPU主频,时钟周期 */
195 U32 systemClock;
196 /* 用户注册的获取系统时间函数 */
197 SysTimeFunc sysTimeHook;
198 /* CPU type */
199 U32 cpuType;
200 #if defined(OS_OPTION_HWI_MAX_NUM_CONFIG)
201 U32 hwiMaxNum;
202 #endif
203 };
204
205 enum SysRndNumType {
206 OS_SYS_RND_STACK_PROTECT, /* 栈保护的RND值 */
207 OS_SYS_RND_BUTT /* 非法类型 */
208 };
209
210 /*
211 * @brief 获取OS的版本号。
212 *
213 * @par 描述
214 * 获取OS的版本号。版本编号格式为UniProton xx.xx VERSIONID(XXX)。
215 *
216 * @attention 无
217 *
218 * @param 无。
219 *
220 * @retval 指向OS版本号的字符串指针。
221 * @par 依赖
222 * <ul><li>prt_sys.h:该接口声明所在的头文件。</li></ul>
223 * @see 无
224 */
225 extern char *PRT_SysGetOsVersion(void);
226
227 /*
228 * @brief 业务给OS传递RND值,用作后续相关功能模块的保护。
229 *
230 * @par 描述: 业务传递RND值给OS,OS用于运行时必要的保护。
231 *
232 * @attention
233 * <ul>
234 * <li>栈保护随机值设置必须在PRT_HardBootInit中调用。</li>
235 * </ul>
236 *
237 * @param type [IN] 类型#enum SysRndNumType,设置的目标RND值的类型。
238 * @param rndNum [IN] 类型#U32,传递的RND值。
239 *
240 * @retval #OS_OK 0x00000000,操作成功。
241 * @retval #其它值,操作失败。
242 *
243 * @par 依赖
244 * <ul><li>prt_sys.h:该接口声明所在的头文件。</li></ul>
245 */
246 extern U32 PRT_SysSetRndNum(enum SysRndNumType type, U32 rndNum);
247
248 /*
249 * @brief 复位单板。
250 *
251 * @par 描述
252 * 复位单板,程序重新加载执行。
253 *
254 * @attention
255 * <ul>
256 * <li>并非直接复位单板,而是关中断,等待看门狗复位。</li>
257 * <li>用户可以通过配置项OS_SYS_REBOOT_HOOK挂接复位函数。</li>
258 * </ul>
259 *
260 * @param 无。
261 *
262 * @retval 无
263 * @par 依赖
264 * <ul><li>prt_sys.h:该接口声明所在的头文件。</li></ul>
265 * @see 无
266 */
267 extern void PRT_SysReboot(void);
268
269 /*
270 * @brief 获取当前核ID。
271 *
272 * @par 描述
273 * 获取当前核ID。
274 *
275 * @attention
276 * <ul>
277 * <li>获取的核ID为硬件寄存器中的ID号。</li>
278 * </ul>
279 *
280 * @param 无。
281 *
282 * @retval 物理核ID。
283 * @par 依赖
284 * <ul><li>prt_sys.h:该接口声明所在的头文件。</li></ul>
285 * @see 无
286 */
PRT_SysGetCoreId(void)287 OS_SEC_ALW_INLINE INLINE U32 PRT_SysGetCoreId(void)
288 {
289 return 0;
290 }
291
292 #ifdef __cplusplus
293 #if __cplusplus
294 }
295 #endif /* __cpluscplus */
296 #endif /* __cpluscplus */
297
298 #endif /* PRT_SYS_H */
299