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
}
|