summaryrefslogtreecommitdiff
path: root/src/libs/interrupts.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/interrupts.c')
-rw-r--r--src/libs/interrupts.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/libs/interrupts.c b/src/libs/interrupts.c
new file mode 100644
index 0000000..371a417
--- /dev/null
+++ b/src/libs/interrupts.c
@@ -0,0 +1,67 @@
+#include "interrupts.h"
+#include "addrmap.h"
+#include "bitmap.h"
+#include "utils.h"
+#include "gpio.h"
+#include "usb/cusb.h"
+
+extern u32 cores_systick[];
+
+void isr_unbind(void){}
+
+void isr_systick(void){
+ cores_systick[0]++; // Core 0
+ cores_systick[1]++; // Core 1
+}
+
+void isr_usb(){
+ if(cusb_check_interrupt(BIT_USBCTRL_INTS_SETUP_REQ)){
+ REG_WRITE_BITMAP_CLEAR(USBCTRL_SIE_STATUS, BIT_USBCTRL_SIE_STATUS_SETUP_REC);
+ cusb_handle_setup();
+ }
+ if(cusb_check_interrupt(BIT_USBCTRL_INTS_BUS_RESET)){
+ REG_WRITE_BITMAP_CLEAR(USBCTRL_SIE_STATUS, BIT_USBCTRL_SIE_STATUS_BUS_RESET);
+ cusb_handle_bus_reset();
+ }
+ if(cusb_check_interrupt(BIT_USBCTRL_INTS_BUFFER_STATUS)){
+ cusb_handle_buffer_status();
+ }
+ cusb_eoi();
+}
+
+__attribute__((used,aligned(4),section(".vector_table"))) void (*vtable[])(void) = {
+ (void (*)(void))SRAM_END,
+ // ----- Start of internal (to core) interrupts
+ isr_unbind, // 01-NMI
+ isr_unbind, // 02-HardFault
+ isr_unbind, // 03-Unused
+ isr_unbind, // 04-Unused
+ isr_unbind, // 05-Unused
+ isr_unbind, // 06-Unused
+ isr_unbind, // 07-Unused
+ isr_unbind, // 08-Unused
+ isr_unbind, // 09-Unused
+ isr_unbind, // 10-Unused
+ isr_unbind, // 11-SVCall
+ isr_unbind, // 12-Unused
+ isr_unbind, // 13-Unused
+ isr_unbind, // 14-PendSV
+ isr_systick, // 15-SysTick
+ // ----- Start of external (RP2040 ones) interrupts
+ isr_unbind, // 00-Unused
+ isr_unbind, // 01-Unused
+ isr_unbind, // 02-Unused
+ isr_unbind, // 03-Unused
+ isr_unbind, // 04-Unused
+ isr_usb // 05-Usb Controller
+};
+
+void interrupts_init(){
+ memcpy((void*)SRAM_BASE, (void*)vtable, 4*30);
+ REG_WRITE(PPB_VTOR, SRAM_BASE);
+}
+
+void interrupts_enable(int num){
+ REG_WRITE(PPB_NVIC_ICPR, 1<<num); // Clear pending interrupts
+ REG_WRITE(PPB_NVIC_ISER, 1<<num); // Enable num interrupts
+}