diff options
Diffstat (limited to 'bsp/bluetrum/libcpu')
| -rw-r--r-- | bsp/bluetrum/libcpu/cpu/context_gcc.S | 8 | ||||
| -rw-r--r-- | bsp/bluetrum/libcpu/cpu/cpuport.c | 2 | ||||
| -rw-r--r-- | bsp/bluetrum/libcpu/cpu/interrupt.c | 21 | ||||
| -rw-r--r-- | bsp/bluetrum/libcpu/cpu/interrupt.h | 7 |
4 files changed, 32 insertions, 6 deletions
diff --git a/bsp/bluetrum/libcpu/cpu/context_gcc.S b/bsp/bluetrum/libcpu/cpu/context_gcc.S index 9139657eaa..e9a6cc28e3 100644 --- a/bsp/bluetrum/libcpu/cpu/context_gcc.S +++ b/bsp/bluetrum/libcpu/cpu/context_gcc.S @@ -44,7 +44,7 @@ enable_int_ret: /* Macro for saving task context */ .macro save_context - addi sp, sp, -120 + addi sp, sp, -124 /* Save Context */ sw x1, 0(sp) @@ -79,6 +79,8 @@ enable_int_ret: lw a5, EPC(zero) //Saves current program counter (EPC) as task program counter sw a5, 116(sp) + lw a5, EPICCON(zero) + sw a5, 120(sp) sw sp, rt_cur_thread_sp, a4 //store sp in preempted tasks tcb .endm @@ -93,6 +95,8 @@ enable_int_ret: /* Load task program counter EPC*/ lw a5, 116(sp) sw a5, EPC(zero) + lw a5, 120(sp) + sw a5, EPICCON(zero) /* Restore registers, Skip global pointer because that does not change */ @@ -126,7 +130,7 @@ enable_int_ret: lw x30, 108(sp) lw x31, 112(sp) - addi sp, sp, 120 + addi sp, sp, 124 mret .endm diff --git a/bsp/bluetrum/libcpu/cpu/cpuport.c b/bsp/bluetrum/libcpu/cpu/cpuport.c index 576401421a..7689018a51 100644 --- a/bsp/bluetrum/libcpu/cpu/cpuport.c +++ b/bsp/bluetrum/libcpu/cpu/cpuport.c @@ -40,6 +40,8 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, stk = (rt_uint32_t *)stack_addr; stk--; + *stk = (rt_uint32_t)0x10003; /* Start address */ + stk--; *stk = (rt_uint32_t)tentry; /* Start address */ stk -= 22; *stk = (rt_uint32_t)parameter; /* Register a0 parameter*/ diff --git a/bsp/bluetrum/libcpu/cpu/interrupt.c b/bsp/bluetrum/libcpu/cpu/interrupt.c index 1903ec25ce..3e7dbdb553 100644 --- a/bsp/bluetrum/libcpu/cpu/interrupt.c +++ b/bsp/bluetrum/libcpu/cpu/interrupt.c @@ -13,8 +13,8 @@ #include <rthw.h> #include "ab32vgx.h" -uint32_t irq_mask AT(.bss.irq_tbl); -void *tbl_irq_vector[IRQ_TOTAL_NUM] AT(.bss.irq_tbl); +uint32_t irq_mask; +void *tbl_irq_vector[IRQ_TOTAL_NUM]; void (*cpu_irq_comm_hook)(void); void set_cpu_irq_comm(void (*irq_hook)(void)) @@ -22,7 +22,6 @@ void set_cpu_irq_comm(void (*irq_hook)(void)) cpu_irq_comm_hook = irq_hook; } -AT(.com_text.irq) void cpu_irq_comm_do(void) { void (*pfnct)(void); @@ -37,6 +36,20 @@ void cpu_irq_comm_do(void) } } +void rt_hw_irq_enable(int vector) +{ + if (vector < IRQ_TOTAL_NUM) { + PICEN |= BIT(vector); + } +} + +void rt_hw_irq_disable(int vector) +{ + if (vector < IRQ_TOTAL_NUM) { + PICEN &= ~BIT(vector); + } +} + void rt_hw_interrupt_init(void) { } @@ -58,7 +71,7 @@ rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t old_handler = RT_NULL; if (vector < IRQ_TOTAL_NUM) { - uint32_t cpu_ie = PICCON&BIT(0); + uint32_t cpu_ie = PICCON & BIT(0); PICCON &= ~BIT(0); old_handler = tbl_irq_vector[vector]; tbl_irq_vector[vector] = handler; diff --git a/bsp/bluetrum/libcpu/cpu/interrupt.h b/bsp/bluetrum/libcpu/cpu/interrupt.h new file mode 100644 index 0000000000..d950f1f9b4 --- /dev/null +++ b/bsp/bluetrum/libcpu/cpu/interrupt.h @@ -0,0 +1,7 @@ +#ifndef INTERRUPT_H__ +#define INTERRUPT_H__ + +void rt_hw_irq_enable(int vector); +void rt_hw_irq_disable(int vector); + +#endif |
