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))20void set_cpu_irq_comm(void (*irq_hook)(void)) 21 { 22 cpu_irq_comm_hook = irq_hook; 23 } 24 cpu_irq_comm_do(void)25void 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)39void 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)46void 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)53void 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)66rt_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