xref: /nrf52832-nimble/rt-thread/libcpu/risc-v/rv32m1/interrupt.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2018/10/01     Bernard      The first version
9*10465441SEvalZero  */
10*10465441SEvalZero 
11*10465441SEvalZero #include <rthw.h>
12*10465441SEvalZero 
13*10465441SEvalZero #include <board.h>
14*10465441SEvalZero #include <RV32M1_ri5cy.h>
15*10465441SEvalZero 
16*10465441SEvalZero typedef void (*irq_handler_t)(void);
17*10465441SEvalZero extern const irq_handler_t isrTable[];
18*10465441SEvalZero 
SystemIrqHandler(uint32_t mcause)19*10465441SEvalZero void SystemIrqHandler(uint32_t mcause)
20*10465441SEvalZero {
21*10465441SEvalZero     uint32_t intNum;
22*10465441SEvalZero 
23*10465441SEvalZero     if (mcause & 0x80000000) /* For external interrupt. */
24*10465441SEvalZero     {
25*10465441SEvalZero         intNum = mcause & 0x1FUL;
26*10465441SEvalZero 
27*10465441SEvalZero         /* Clear pending flag in EVENT unit .*/
28*10465441SEvalZero         EVENT_UNIT->INTPTPENDCLEAR = (1U << intNum);
29*10465441SEvalZero 
30*10465441SEvalZero         /* Now call the real irq handler for intNum */
31*10465441SEvalZero         isrTable[intNum]();
32*10465441SEvalZero     }
33*10465441SEvalZero }
34