summaryrefslogtreecommitdiff
path: root/src/libs/interrupts.c
blob: 371a4175d1c2869fb106f30330930dae41cf3fab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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
}