From 1c6cd8e1ea53275cc44b2a0ee5a8448cbc4a3f0d Mon Sep 17 00:00:00 2001 From: Christian Cunningham Date: Sat, 4 Dec 2021 17:09:22 -0700 Subject: Restructured project --- src/cpu/irq.c | 38 ++++++++++++++++++++++++++++++++++++++ src/cpu/irq.h | 6 ++++++ 2 files changed, 44 insertions(+) create mode 100644 src/cpu/irq.c create mode 100644 src/cpu/irq.h (limited to 'src/cpu') diff --git a/src/cpu/irq.c b/src/cpu/irq.c new file mode 100644 index 0000000..26883a2 --- /dev/null +++ b/src/cpu/irq.c @@ -0,0 +1,38 @@ +#include "../cpu/irq.h" +#include "../sys/core.h" +#include "../drivers/uart.a.h" +#include "../util/time.h" + +extern void disable_irq(void); +extern void enable_irq(void); + +void c_irq_handler(void) { + disable_irq(); + unsigned long source = load32(CORE0_IRQ_SOURCE); + if (source & (1 << 8)) { + if(load32(IRQ_PENDING2) & (1 << 25)) { + if(load32(UART0_MIS) & (1<<4)) { + unsigned long data = load32(UART0_DR); + if(data == 0x74) { + unsigned long timer_status; + asm volatile("mrc p15, 0, %0, c14, c3, 1" : "=r"(timer_status)); + if(timer_status == 0) { + cntfrq = read_cntfrq(); + write_cntv_tval(cntfrq); + enable_cntv(); + } else { + disable_cntv(); + } + } + uart_char((unsigned char)data); + //uart_string((char*)" c_irq_handler\n"); + enable_irq(); + return; + } + } + } else if (source & (1 << 3)) { + c_timer(); + enable_irq(); + } + return; +} diff --git a/src/cpu/irq.h b/src/cpu/irq.h new file mode 100644 index 0000000..f0a2656 --- /dev/null +++ b/src/cpu/irq.h @@ -0,0 +1,6 @@ +#ifndef IRQ_H +#define IRQ_H + +void c_irq_handler(void); + +#endif -- cgit v1.2.1