diff options
| author | Loïc Guégan <manzerbredes@mailbox.org> | 2025-03-24 09:33:49 +0100 |
|---|---|---|
| committer | Loïc Guégan <manzerbredes@mailbox.org> | 2025-03-24 09:33:49 +0100 |
| commit | 7741f014456df395b655b72d9ebb848af72cc37e (patch) | |
| tree | 5ddae273929780ac7c0af2a26b64ba1a382e4b05 /src/libs/interrupts.c | |
| parent | d3ecfe3498d73d3ba924063bc1001cca3f333170 (diff) | |
Init repository
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 +} |
