diff options
Diffstat (limited to 'src/libs/interrupts.c')
| -rw-r--r-- | src/libs/interrupts.c | 67 |
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 +} |
