summaryrefslogtreecommitdiff
path: root/bsp/bluetrum/libcpu
diff options
context:
space:
mode:
Diffstat (limited to 'bsp/bluetrum/libcpu')
-rw-r--r--bsp/bluetrum/libcpu/cpu/context_gcc.S8
-rw-r--r--bsp/bluetrum/libcpu/cpu/cpuport.c2
-rw-r--r--bsp/bluetrum/libcpu/cpu/interrupt.c21
-rw-r--r--bsp/bluetrum/libcpu/cpu/interrupt.h7
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