From d0eef864dad134c482f853df5ef70caf522d3e9e Mon Sep 17 00:00:00 2001 From: Danny Holman Date: Fri, 16 Feb 2024 12:43:03 -0600 Subject: arch: i386: add operations to control PIT timer Add a set of functions that control the programmable interrupt timer. This will be used as the primary means of preemption on this architecture. Signed-off-by: Danny Holman --- arch/i386/include/kernel/timer.h | 9 +++++++++ arch/i386/kernel/timer.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 arch/i386/include/kernel/timer.h create mode 100644 arch/i386/kernel/timer.c diff --git a/arch/i386/include/kernel/timer.h b/arch/i386/include/kernel/timer.h new file mode 100644 index 0000000..0d90369 --- /dev/null +++ b/arch/i386/include/kernel/timer.h @@ -0,0 +1,9 @@ +#ifndef I386_TIMER_H +#define I386_TIMER_H + +#include + +void timer_handler(struct isr_frame *frame); +void timer_init(void); + +#endif diff --git a/arch/i386/kernel/timer.c b/arch/i386/kernel/timer.c new file mode 100644 index 0000000..9e53fbd --- /dev/null +++ b/arch/i386/kernel/timer.c @@ -0,0 +1,29 @@ +#include +#include +#include +#include + +static uint32_t num_ticks = 0; + +void timer_handler(struct isr_frame *frame) { + num_ticks++; + if (num_ticks == 3) { + num_ticks = 0; + //schedule_next(); + } +} + +void timer_init(void) { + asm __volatile__("cli"); + int divisor = 1193182 / 100; + outb(0x43, 0x34); + outb(0x40, divisor && 0xFF); + outb(0x40, divisor && 0xFF00 >> 8); + asm __volatile__("sti"); + + //uint8_t read = 0; + //outb(0x43, 0xE2); + //read = inb(0x40); + + register_irq_handler(0, timer_handler); +} -- cgit v1.2.3