更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
hal_hwi.h 文件参考

浏览源代码.

函数

VOID HalIrqInit (VOID)
 中断控制器本身初始化 更多...
 
VOID HalIrqInitPercpu (VOID)
 中断控制器与CPU之间的关系初始化 更多...
 
VOID HalIrqMask (UINT32 vector)
 屏蔽中断 更多...
 
VOID HalIrqUnmask (UINT32 vector)
 撤销中断屏蔽 更多...
 
VOID HalIrqPending (UINT32 vector)
 
VOID HalIrqClear (UINT32 vector)
 
CHARHalIrqVersion (VOID)
 
UINT32 HalCurIrqGet (VOID)
 获取当前中断号 更多...
 
UINT32 HalIrqSetPrio (UINT32 vector, UINT8 priority)
 
VOID HalIrqSendIpi (UINT32 target, UINT32 ipi)
 
VOID HalIrqSetAffinity (UINT32 vector, UINT32 cpuMask)
 

函数说明

◆ HalCurIrqGet()

UINT32 HalCurIrqGet ( VOID  )

获取当前中断号

在文件 gic_v2.c72 行定义.

73{
74 return g_curIrqNum;
75}
STATIC UINT32 g_curIrqNum
Definition: gic_v2.c:41

◆ HalIrqClear()

VOID HalIrqClear ( UINT32  vector)

在文件 gic_v2.c104 行定义.

105{
106 GIC_REG_32(GICC_EOIR) = vector;
107}
函数调用图:
这是这个函数的调用关系图:

◆ HalIrqInit()

VOID HalIrqInit ( VOID  )

中断控制器本身初始化

在文件 gic_v2.c118 行定义.

119{
120 UINT32 i;
121
122 /* set externel interrupts to be level triggered, active low. | 设置外部中断为电平触发,低电平有效。*/
123 for (i = 32; i < OS_HWI_MAX_NUM; i += 16) {
124 GIC_REG_32(GICD_ICFGR(i / 16)) = 0;
125 }
126
127 /* set externel interrupts to CPU 0 | 将外部中断设置为 CPU 0*/
128 for (i = 32; i < OS_HWI_MAX_NUM; i += 4) {
129 GIC_REG_32(GICD_ITARGETSR(i / 4)) = 0x01010101;
130 }
131
132 /* set priority on all interrupts | 设置所有中断的优先级*/
133 for (i = 0; i < OS_HWI_MAX_NUM; i += 4) {
134 GIC_REG_32(GICD_IPRIORITYR(i / 4)) = GICD_INT_DEF_PRI_X4;
135 }
136
137 /* disable all interrupts. | 禁止所有中断*/
138 for (i = 0; i < OS_HWI_MAX_NUM; i += 32) {
139 GIC_REG_32(GICD_ICENABLER(i / 32)) = ~0;
140 }
141
142 HalIrqInitPercpu();//启动和CPU之间关系
143
144 /* enable gic distributor control */
145 GIC_REG_32(GICD_CTLR) = 1;//使能中断分发寄存器
146
147#ifdef LOSCFG_KERNEL_SMP //多核情况下会出现CPU核间的通讯
148 /* register inter-processor interrupt | 注册核间中断*/
149 (VOID)LOS_HwiCreate(LOS_MP_IPI_WAKEUP, 0xa0, 0, OsMpWakeHandler, 0);//由某CPU去唤醒其他CPU继续工作
150 (VOID)LOS_HwiCreate(LOS_MP_IPI_SCHEDULE, 0xa0, 0, OsMpScheduleHandler, 0);//由某CPU发起对其他CPU的调度
151 (VOID)LOS_HwiCreate(LOS_MP_IPI_HALT, 0xa0, 0, OsMpHaltHandler, 0);//由某CPU去暂停其他CPU的工作
152#ifdef LOSCFG_KERNEL_SMP_CALL
153 (VOID)LOS_HwiCreate(LOS_MP_IPI_FUNC_CALL, 0xa0, 0, OsMpFuncCallHandler, 0);//触发回调函数
154#endif
155#endif
156}
VOID HalIrqInitPercpu(VOID)
中断控制器与CPU之间的关系初始化
Definition: gic_v2.c:109
LITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate(HWI_HANDLE_T hwiNum, HWI_PRIOR_T hwiPrio, HWI_MODE_T hwiMode, HWI_PROC_FUNC hwiHandler, HwiIrqParam *irqParam)
创建一个硬中断 中断创建,注册中断号、中断触发模式、中断优先级、中断处理程序。中断被触发时, handleIrq会调用该中断处理程序
Definition: los_hwi.c:429
VOID OsMpWakeHandler(VOID)
硬中断唤醒处理函数
Definition: los_mp.c:83
VOID OsMpFuncCallHandler(VOID)
OsMpFuncCallHandler 回调向当前CPU注册过的函数
Definition: los_mp.c:182
VOID OsMpScheduleHandler(VOID)
硬中断调度处理函数
Definition: los_mp.c:88
VOID OsMpHaltHandler(VOID)
硬中断暂停处理函数
Definition: los_mp.c:97
@ LOS_MP_IPI_SCHEDULE
!< 唤醒CPU
Definition: los_mp.h:51
@ LOS_MP_IPI_WAKEUP
Definition: los_mp.h:50
@ LOS_MP_IPI_FUNC_CALL
!< 停止CPU
Definition: los_mp.h:54
@ LOS_MP_IPI_HALT
!< 调度CPU
Definition: los_mp.h:52
unsigned int UINT32
Definition: los_typedef.h:57
函数调用图:
这是这个函数的调用关系图:

◆ HalIrqInitPercpu()

VOID HalIrqInitPercpu ( VOID  )

中断控制器与CPU之间的关系初始化

在文件 gic_v2.c109 行定义.

110{
111 /* unmask interrupts */
112 GIC_REG_32(GICC_PMR) = 0xFF;//写中断优先级屏蔽寄存器,0xFF代表开放所有中断
113
114 /* enable gic cpu interface */
115 GIC_REG_32(GICC_CTLR) = 1;//使能GICC_CTLR寄存器,意思是打通控制器和CPU之间的链路
116}
函数调用图:
这是这个函数的调用关系图:

◆ HalIrqMask()

VOID HalIrqMask ( UINT32  vector)

屏蔽中断

在文件 gic_v2.c77 行定义.

78{
79 if ((vector > OS_USER_HWI_MAX) || (vector < OS_USER_HWI_MIN)) {
80 return;
81 }
82
83 GIC_REG_32(GICD_ICENABLER(vector / 32)) = 1U << (vector % 32);
84}
函数调用图:
这是这个函数的调用关系图:

◆ HalIrqPending()

VOID HalIrqPending ( UINT32  vector)

在文件 gic_v2.c95 行定义.

96{
97 if ((vector > OS_USER_HWI_MAX) || (vector < OS_USER_HWI_MIN)) {
98 return;
99 }
100
101 GIC_REG_32(GICD_ISPENDR(vector >> 5)) = 1U << (vector % 32);
102}

◆ HalIrqSendIpi()

VOID HalIrqSendIpi ( UINT32  target,
UINT32  ipi 
)

在文件 gic_v2.c58 行定义.

59{
60 GicWriteSgi(ipi, target, 0);
61}
STATIC VOID GicWriteSgi(UINT32 vector, UINT32 cpuMask, UINT32 filter)
Definition: gic_v2.c:50
函数调用图:
这是这个函数的调用关系图:

◆ HalIrqSetAffinity()

VOID HalIrqSetAffinity ( UINT32  vector,
UINT32  cpuMask 
)

在文件 gic_v2.c63 行定义.

64{
65 UINT32 offset = vector / 4;
66 UINT32 index = vector & 0x3;
67
68 GIC_REG_8(GICD_ITARGETSR(offset) + index) = cpuMask;
69}
函数调用图:
这是这个函数的调用关系图:

◆ HalIrqSetPrio()

UINT32 HalIrqSetPrio ( UINT32  vector,
UINT8  priority 
)

在文件 gic_v3.c303 行定义.

304{
305 UINT8 prio = priority;
306
307 if (vector > OS_HWI_MAX_NUM) {
308 PRINT_ERR("Invalid irq value %u, max irq is %u\n", vector, OS_HWI_MAX_NUM);
309 return LOS_NOK;
310 }
311
312 prio = prio & (UINT8)GIC_INTR_PRIO_MASK;
313
314 if (vector >= GIC_MIN_SPI_NUM) {
315 GicdSetPmr(vector, prio);
316 } else {
317 GicrSetPmr(vector, prio);
318 }
319
320 return LOS_OK;
321}
STATIC VOID GicrSetPmr(UINT32 irq, UINT8 priority)
Definition: gic_v3.c:190
STATIC VOID GicdSetPmr(UINT32 irq, UINT8 priority)
Definition: gic_v3.c:178
unsigned char UINT8
Definition: los_typedef.h:55
函数调用图:

◆ HalIrqUnmask()

VOID HalIrqUnmask ( UINT32  vector)

撤销中断屏蔽

在文件 gic_v2.c86 行定义.

87{
88 if ((vector > OS_USER_HWI_MAX) || (vector < OS_USER_HWI_MIN)) {
89 return;
90 }
91
92 GIC_REG_32(GICD_ISENABLER(vector >> 5)) = 1U << (vector % 32);
93}
函数调用图:
这是这个函数的调用关系图:

◆ HalIrqVersion()

CHAR * HalIrqVersion ( VOID  )

在文件 gic_v2.c179 行定义.

180{
181 UINT32 pidr = GIC_REG_32(GICD_PIDR2V2);
182 CHAR *irqVerString = NULL;
183
184 switch (pidr >> GIC_REV_OFFSET) {
185 case GICV1:
186 irqVerString = "GICv1";
187 break;
188 case GICV2:
189 irqVerString = "GICv2";
190 break;
191 default:
192 irqVerString = "unknown";
193 }
194 return irqVerString;
195}
@ GICV1
Definition: gic_common.h:55
@ GICV2
Definition: gic_common.h:56
char CHAR
Definition: los_typedef.h:63
这是这个函数的调用关系图: