1 /*
2  * Copyright (c) 2020-2020, Bluetrum Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2020/11/18     greedyhao    Bluetrum RISC-V porting code.
9  */
10 
11 #include <rtthread.h>
12 #include <stdbool.h>
13 #include <rthw.h>
14 #include "ab32vgx.h"
15 
16 uint32_t irq_mask;
17 void *tbl_irq_vector[IRQ_TOTAL_NUM];
18 void (*cpu_irq_comm_hook)(void);
19 
set_cpu_irq_comm(void (* irq_hook)(void))20 void set_cpu_irq_comm(void (*irq_hook)(void))
21 {
22     cpu_irq_comm_hook = irq_hook;
23 }
24 
cpu_irq_comm_do(void)25 void cpu_irq_comm_do(void)
26 {
27     void (*pfnct)(void);
28     uint32_t irq_pend = PICPND & irq_mask;
29     for (int i = 0; i < IRQ_TOTAL_NUM; i++) {
30         if (irq_pend & BIT(i)) {
31             pfnct = tbl_irq_vector[i];
32             if (pfnct) {
33                 pfnct();                /* call ISR */
34             }
35         }
36     }
37 }
38 
rt_hw_irq_enable(int vector)39 void rt_hw_irq_enable(int vector)
40 {
41     if (vector < IRQ_TOTAL_NUM) {
42         PICEN |= BIT(vector);
43     }
44 }
45 
rt_hw_irq_disable(int vector)46 void rt_hw_irq_disable(int vector)
47 {
48     if (vector < IRQ_TOTAL_NUM) {
49         PICEN &= ~BIT(vector);
50     }
51 }
52 
rt_hw_interrupt_init(void)53 void rt_hw_interrupt_init(void)
54 {
55 }
56 
57 /**
58  * @brief This function will install a interrupt service routine to a interrupt.
59  *
60  * @param vector
61  * @param handler
62  * @param param
63  * @param name
64  * @return rt_isr_handler_t
65  */
rt_hw_interrupt_install(int vector,rt_isr_handler_t handler,void * param,const char * name)66 rt_isr_handler_t rt_hw_interrupt_install(int              vector,
67                                          rt_isr_handler_t handler,
68                                          void            *param,
69                                          const char      *name)
70 {
71     rt_isr_handler_t old_handler = RT_NULL;
72 
73     if (vector < IRQ_TOTAL_NUM) {
74         uint32_t cpu_ie = PICCON & BIT(0);
75         PICCON &= ~BIT(0);
76         old_handler = tbl_irq_vector[vector];
77         tbl_irq_vector[vector] = handler;
78         irq_mask |= BIT(vector);
79         PICCON |= cpu_ie;
80         PICPR &= ~BIT(vector);
81         PICEN |= BIT(vector);
82     }
83     return old_handler;
84 }
85