• 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: 硬中断模块的对外头文件。
14  */
15 #ifndef PRT_HWI_H
16 #define PRT_HWI_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  * 值: 0x02000801
31  *
32  * 解决方案:确保中断号合法,中断号请查看硬件手册。
33  */
34 #define OS_ERRNO_HWI_NUM_INVALID OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x01)
35 
36 /*
37  * 硬中断错误码:优先级非法。
38  *
39  * 值: 0x02000802
40  *
41  * 解决方案:确保优先级合法。
42  */
43 #define OS_ERRNO_HWI_PRI_ERROR OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x02)
44 
45 /*
46  * 硬中断错误码:硬中断已被创建或相应中断向量号已被其它中断占用。
47  *
48  * 值: 0x02000803
49  *
50  * 解决方案:更换中断号
51  */
52 #define OS_ERRNO_HWI_ALREADY_CREATED OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x03)
53 
54 /*
55  * 硬中断错误码:硬中断处理函数为空。
56  *
57  * 值: 0x02000804
58  *
59  * 解决方案:传入非空的有效处理函数
60  */
61 #define OS_ERRNO_HWI_PROC_FUNC_NULL OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x04)
62 
63 /*
64  * 硬中断错误码:未创建的硬中断被响应。
65  *
66  * 值: 0x03000805
67  *
68  * 解决方案:先创建硬中断,然后使能并触发该中断使其得到响应
69  */
70 #define OS_ERRNO_HWI_UNCREATED OS_ERRNO_BUILD_FATAL(OS_MID_HWI, 0x05)
71 
72 /*
73  * 硬中断错误码:设置硬中断属性时,属性设置与之前设置值不一致
74  *
75  * 值: 0x02000806
76  *
77  * 解决方案:确认当前设置属性值与之前是否一致。如果确需修改属性,请先删除该硬中断。
78  */
79 #define OS_ERRNO_HWI_ATTR_CONFLICTED OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x06)
80 
81 /*
82  * 硬中断错误码:组合型中断创建失败,为组合型中断节点申请系统默认私有FSC内存失败,或申请中断描述信息失败。
83  *
84  * 值: 0x02000807
85  *
86  * 解决方案: 增大系统默认私有FSC分区大小
87  */
88 #define OS_ERRNO_HWI_MEMORY_ALLOC_FAILED OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x07)
89 
90 /*
91  * 硬中断错误码:组合型中断函数注册失败,该组合型中断已创建了相同的中断处理函数。
92  *
93  * 值: 0x02000808
94  *
95  * 解决方案: 更换中断处理函数
96  */
97 #define OS_ERRNO_HWI_COMBINEHOOK_ALREADY_CREATED OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x08)
98 
99 /*
100  * 硬中断错误码:创建的中断函数即不是独立型,也不是组合型
101  *
102  * 值: 0x02000809
103  *
104  * 解决方案: 硬中断模式只能设置为独立型或组合型
105  */
106 #define OS_ERRNO_HWI_MODE_ERROR OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x09)
107 
108 /*
109  * 硬中断错误码:删除未创建或者已经被删除的硬中断。
110  *
111  * 值: 0x0200080a
112  *
113  * 解决方案: 删除已创建并且未被删除的硬中断
114  */
115 #define OS_ERRNO_HWI_DELETED OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x0a)
116 
117 /*
118  * 硬中断错误码:未进行硬中断模式设置。
119  *
120  * 值: 0x0200080b
121  *
122  * 解决方案: 调用中断创建函数前,需要先调用中断模式设置函数,进行模式参数设置
123  */
124 #define OS_ERRNO_HWI_MODE_UNSET OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x0b)
125 
126 /*
127  * 硬中断错误码:硬中断触发接口入参错误,输入无效的核号。
128  *
129  * 值: 0x0200080c
130  *
131  * 解决方案: 输入本核核号
132  */
133 #define OS_ERRNO_HWI_CORE_ID_INVALID OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x0c)
134 
135 /*
136  * 系统基本功能错误码:注册不可删除的中断失败
137  *
138  * 值: 0x0300141c
139  *
140  * 解决方案: 请确保传是独立型中断,或者修改OS_HWI_INTERNAL_NUM值
141  */
142 #define OS_ERROR_HWI_INT_REGISTER_FAILED OS_ERRNO_BUILD_FATAL(OS_MID_HWI, 0x1c)
143 
144 /*
145  * 硬中断错误码:中断内存资源申请失败
146  *
147  * 值: 0x0200080d
148  *
149  * 解决方案: 检查默认分区大小配置是否正确
150  */
151 #define OS_ERRNO_HWI_RESOURCE_ALLOC_FAILED OS_ERRNO_BUILD_ERROR(OS_MID_HWI, 0x0d)
152 
153 /*
154  * 硬中断优先级的类型定义。
155  */
156 typedef U16 HwiPrior;
157 
158 /*
159  * 硬中断模式配置信息的类型定义。
160  */
161 typedef U16 HwiMode;
162 
163 /*
164  * 硬中断处理函数的参数类型定义。
165  */
166 typedef uintptr_t HwiArg;
167 
168 /*
169  * 硬中断号的类型定义。
170  */
171 typedef U32 HwiHandle;
172 
173 /*
174  * 组合型硬中断。
175  */
176 #define OS_HWI_MODE_COMBINE 0x8000
177 
178 /*
179  * 独立型硬中断。
180  */
181 #define OS_HWI_MODE_ENGROSS 0x4000
182 
183 /*
184  * 缺省硬中断模式。
185  */
186 #define OS_HWI_MODE_DEFAULT OS_HWI_MODE_ENGROSS
187 
188 /*
189  * 普通硬中断。
190  */
191 #define OS_HWI_TYPE_NORMAL 0x00
192 
193 /*
194  * 中断属性组装宏(共8bit)。
195  */
196 #define OS_HWI_ATTR(mode, type) (HwiMode)((HwiMode)(mode) | (HwiMode)(type))
197 
198 /*
199  * @brief 硬中断处理函数的类型定义。
200  *
201  * @par 描述
202  * 通过硬中断处理函数的类型定义硬中断处理函数,在硬中断触发时调用该中断处理函数。
203  *
204  * @attention 无。
205  *
206  * @param  param1 [IN] 类型#HwiArg,硬中断处理函数的参数。
207  *
208  * @retval 无。
209  * @par 依赖
210  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
211  * @see 无。
212  */
213 typedef void (*HwiProcFunc)(HwiArg);
214 
215 /*
216  * @brief 硬中断调用处理函数钩子函数类型定义。
217  *
218  * @par 描述
219  * 用户通过硬中断调用钩子处理函数类型定义硬中断调用处理函数钩子,在硬中断调用处理函数时,调用该钩子。
220  * @attention 无。
221  *
222  * @param hwiNum [IN]  类型#U32,硬中断号。
223  *
224  * @retval 无。
225  * @par 依赖
226  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
227  */
228 typedef void (*HwiEntryHook)(U32 hwiNum);
229 
230 /*
231  * @brief 硬中断退出处理函数钩子函数类型定义。
232  *
233  * @par 描述
234  * 用户通过硬中断退出钩子处理函数类型定义硬中断退出处理函数钩子,在硬中断退出处理函数时,调用该钩子。
235  * @attention 无。
236  *
237  * @param hwiNum [IN]  类型#U32,硬中断号。
238  *
239  * @retval 无。
240  * @par 依赖
241  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
242  */
243 typedef void (*HwiExitHook)(U32 hwiNum);
244 
245 /*
246  * @brief 设置硬中断属性接口。
247  *
248  * @par 描述
249  * 在创建硬中断前,必须要配置好硬中断的优先级和模式,包括独立型(#OS_HWI_MODE_ENGROSS)和
250  * 组合型(#OS_HWI_MODE_COMBINE)两种配置模式。
251  *
252  * @attention
253  * <ul>
254  * <li>OS已经占用的不能被使用</li>
255  * </ul>
256  *
257  * @param hwiNum  [IN]  类型#HwiHandle,硬中断号。
258  * @param hwiPrio [IN]  类型#HwiPrior,硬中断优先级。
259  * @param mode    [IN]  类型#HwiMode,设置的中断模式,为独立型(#OS_HWI_MODE_ENGROSS)或者组合型(#OS_HWI_MODE_COMBINE)。
260  *
261  * @retval #OS_OK  0x00000000,硬中断属性设置成功。
262  * @retval #其它值,属性设置失败。
263  * @par 依赖
264  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
265  * @see PRT_HwiCreate
266  */
267 extern U32 PRT_HwiSetAttr(HwiHandle hwiNum, HwiPrior hwiPrio, HwiMode mode);
268 
269 /*
270  * @brief 创建硬中断函数。
271  *
272  * @par 描述
273  * 注册硬中断的处理函数。
274  *
275  * @attention
276  * <ul>
277  * <li>在调用该函数之前,请先确保已经设置了中断属性。</li>
278  * <li>硬中断创建成功后,并不使能相应向量的中断,需要显式调用#PRT_HwiEnable单独使能。</li>
279  * </ul>
280  *
281  * @param hwiNum  [IN]  类型#HwiHandle,硬中断号。
282  * @param handler [IN]  类型#HwiProcFunc,硬中断触发时的处理函数。
283  * @param arg     [IN]  类型#HwiArg,调用硬中断处理函数时传递的参数。
284  *
285  * @retval #OS_OK  0x00000000,硬中断创建成功。
286  * @retval #其它值,创建失败。
287  * @par 依赖
288  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
289  * @see PRT_HwiDelete
290  */
291 extern U32 PRT_HwiCreate(HwiHandle hwiNum, HwiProcFunc handler, HwiArg arg);
292 
293 /*
294  * @brief 删除硬中断函数。
295  *
296  * @par 描述
297  * 屏蔽相应硬中断或事件,取消硬中断处理函数的注册。
298  *
299  * @attention
300  * <ul>
301  * <li>不能删除OS占用的中断号。</li>
302  * </ul>
303  *
304  * @param hwiNum [IN]  类型#HwiHandle,硬中断号。
305  *
306  * @retval #OS_OK  0x00000000,硬中断删除成功。
307  * @retval #其它值,删除失败。
308  * @par 依赖
309  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
310  * @see PRT_HwiCreate
311  */
312 extern U32 PRT_HwiDelete(HwiHandle hwiNum);
313 
314 /*
315  * @brief 激活指定核号内的硬中断。
316  *
317  * @par 描述
318  * 激活指定核号内的软件可触发的硬中断
319  *
320  * @attention
321  *
322  * @param dstCore [IN]  类型#U32,目标核号。目前只支持指定为本核。
323  * @param hwiNum  [IN]  类型#HwiHandle,硬中断号,只支持软件可触发的中断号。
324  *
325  * @retval #OS_OK  0x00000000,硬中断激活成功。
326  * @retval #其它值,激活失败。
327  * @par 依赖
328  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
329  */
330 extern U32 PRT_HwiTrigger(U32 dstCore, HwiHandle hwiNum);
331 
332 /*
333  * @brief 清空中断请求位。
334  *
335  * @par 描述
336  * 清除所有的中断请求位。即放弃当前已触发中断的的响应。
337  *
338  * @attention
339  * <ul>
340  * 清除所有的中断请求位(对于NMI中断无效)。
341  * </ul>
342  *
343  * @param 无。
344  *
345  * @retval 无。
346  * @par 依赖
347  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
348  * @see PRT_HwiClearPendingBit
349  */
350 extern void PRT_HwiClearAllPending(void);
351 
352 /*
353  * @brief 清除硬中断的Pending位。
354  *
355  * @par 描述
356  * 显式清除硬中断或事件的请求位,因为有的硬件响应中断后不会自动清Pending位。
357  *
358  * @attention
359  *
360  * @param hwiNum [IN]  类型#HwiHandle,硬中断号。
361  *
362  * @retval #OS_OK  0x00000000,硬中断请求位清除成功。
363  * @retval #其它值,清除失败。
364  * @par 依赖
365  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
366  * @see PRT_HwiCreate
367  */
368 extern U32 PRT_HwiClearPendingBit(HwiHandle hwiNum);
369 
370 /*
371  * @brief 屏蔽指定的硬中断。
372  *
373  * @par 描述
374  * 禁止核响应指定硬中断的请求。
375  *
376  * @attention
377  *
378  * @param hwiNum [IN]  类型#HwiHandle,依据不同的芯片,硬中断号或中断向量号,见注意事项。
379  *
380  * @retval #OS_OK  0x00000000,硬中断去使能成功。
381  * @retval #其它值,硬中断去使能失败。
382  * @par 依赖
383  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
384  * @see PRT_HwiEnable
385  */
386 extern U32 PRT_HwiDisable(HwiHandle hwiNum);
387 
388 /*
389  * @brief 使能指定的硬中断。
390  *
391  * @par 描述
392  * 允许核响应指定硬中断的请求。
393  *
394  * @attention
395  * <ul>
396  * <li>对于不同芯片,此返回值代表的意义有所差异,差异细节见下面返回值说明</li>
397  * </ul>
398  *
399  * @param hwiNum [IN]  类型#HwiHandle,依据不同的芯片,硬中断号或中断向量号,见注意事项。
400  *
401  * @retval #OS_OK  0x00000000,硬中断使能成功。
402  * @retval #其它值,硬中断使能失败。
403  * @par 依赖
404  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
405  * @see PRT_HwiDisable
406  */
407 extern U32 PRT_HwiEnable(HwiHandle hwiNum);
408 
409 /*
410  * @brief 添加硬中断进入钩子
411  *
412  * @par 描述
413  * 添加硬中断进入钩子。该钩子函数在进入硬中断ISR前被调用。
414  *
415  * @attention
416  * <ul>
417  * <li>不同钩子函数间执行的先后顺序,不应当存在依赖关系。</li>
418  * <li>不应在钩子函数里调用可能引起线程调度或阻塞的OS接口。</li>
419  * <li>最大支持钩子数需静态配置</li>
420  * </ul>
421  *
422  * @param hook [IN]  类型#HwiEntryHook,中断进入钩子函数。
423  *
424  * @par 依赖
425  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
426  * @see PRT_HwiDelEntryHook | PRT_HookAdd | PRT_HwiAddExitHook
427  */
428 extern U32 PRT_HwiAddEntryHook(HwiEntryHook hook);
429 
430 /*
431  * @brief 删除硬中断进入钩子
432  *
433  * @par 描述
434  * 删除硬中断进入钩子。该钩子函数将停止在进入硬中断ISR前的调用。
435  *
436  * @attention
437  * <ul>
438  * <li>不同钩子函数间执行的先后顺序,不应当存在依赖关系。</li>
439  * <li>不应在钩子函数里调用可能引起线程调度或阻塞的OS接口。</li>
440  * <li>最大支持钩子数需静态配置</li>
441  * </ul>
442  *
443  * @param hook [IN]  类型#HwiEntryHook,中断进入钩子函数。
444  *
445  * @par 依赖
446  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
447  * @see PRT_HwiAddEntryHook | PRT_HookDel
448  */
449 extern U32 PRT_HwiDelEntryHook(HwiEntryHook hook);
450 
451 /*
452  * @brief 添加硬中断退出钩子
453  *
454  * @par 描述
455  * 添加硬中断退出钩子。该钩子函数在退出硬中断ISR后被调用。
456  *
457  * @attention
458  * <ul>
459  * <li>不同钩子函数间执行的先后顺序,不应当存在依赖关系。</li>
460  * <li>不应在钩子函数里调用可能引起线程调度或阻塞的OS接口。</li>
461  * <li>最大支持钩子数需静态配置</li>
462  * </ul>
463  *
464  * @param hook [IN]  类型#HwiExitHook,中断退出钩子函数。
465  *
466  * @par 依赖
467  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
468  * @see PRT_HwiDelExitHook | PRT_HookAdd | PRT_HwiAddEntryHook
469  */
470 extern U32 PRT_HwiAddExitHook(HwiExitHook hook);
471 
472 /*
473  * @brief 删除硬中断退出钩子
474  *
475  * @par 描述
476  * 删除硬中断退出钩子。该钩子函数将停止在退出硬中断ISR后的调用。
477  *
478  * @attention
479  * <ul>
480  * <li>不同钩子函数间执行的先后顺序,不应当存在依赖关系。</li>
481  * <li>不应在钩子函数里调用可能引起线程调度或阻塞的OS接口。</li>
482  * <li>最大支持钩子数需静态配置</li>
483  * </ul>
484  *
485  * @param hook [IN]  类型#HwiExitHook,中断退出钩子函数。
486  *
487  * @par 依赖
488  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
489  * @see PRT_HwiAddExitHook | PRT_HookDel
490  */
491 extern U32 PRT_HwiDelExitHook(HwiExitHook hook);
492 
493 /*
494  * @brief 开中断。
495  *
496  * @par 描述
497  * 开启全局可屏蔽中断。
498  *
499  * @attention 中断服务函数里慎用该接口,会引起中断优先级反转
500  *
501  * @param 无。
502  *
503  * @retval 开启全局中断前的中断状态值。
504  * @par 依赖
505  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
506  * @see PRT_HwiLock | PRT_HwiRestore
507  */
508 extern uintptr_t PRT_HwiUnLock(void);
509 
510 /*
511  * @brief 关中断。
512  *
513  * @par 描述
514  * 关闭全局可屏蔽中断。
515  *
516  * @attention 在关全局中断后,禁止调用引起内核调度的相关接口,如PRT_TaskDelay接口
517  *
518  * @param 无。
519  *
520  * @retval 关闭全局中断前的中断状态值。
521  * @par 依赖
522  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
523  * @see PRT_HwiUnLock | PRT_HwiRestore
524  */
525 extern uintptr_t PRT_HwiLock(void);
526 
527 /*
528  * @brief 恢复中断状态接口。
529  *
530  * @par 描述
531  * 恢复原中断状态寄存器。
532  *
533  * @attention
534  * <ul>
535  * <li>该接口必须和关闭全局中断或者是开启全局中断接口成对使用,以关全局中断或者开全局中断操作的返回值为入参</li>
536  * <li>以保证中断可以恢复到关全局中断或者开全局中断操作前的状态</li>
537  * </ul>
538  * @param intSave [IN]  类型#uintptr_t,关全局中断PRT_HwiLock和开全局中断PRT_HwiUnLock的返回值。
539  *
540  * @retval 无
541  * @par 依赖
542  * <ul><li>prt_hwi.h:该接口声明所在的头文件。</li></ul>
543  * @see PRT_HwiUnLock | PRT_HwiLock
544  */
545 extern void PRT_HwiRestore(uintptr_t intSave);
546 
547 #ifdef __cplusplus
548 #if __cplusplus
549 }
550 #endif /* __cpluscplus */
551 #endif /* __cpluscplus */
552 
553 #endif /* PRT_HWI_H */
554