greatbridf 3 жил өмнө
parent
commit
48978f5f74

+ 2 - 0
CMakeLists.txt

@@ -43,6 +43,7 @@ set(KERNEL_MAIN_SOURCES src/kernel_main.c
                         src/kernel/mem.c
                         src/kernel/vga.c
                         src/kernel/hw/keyboard.cpp
+                        src/kernel/hw/timer.c
                         src/kernel/event/event.cpp
                         src/types/buffer.c
                         include/asm/boot.h
@@ -54,6 +55,7 @@ set(KERNEL_MAIN_SOURCES src/kernel_main.c
                         include/kernel/mem.h
                         include/kernel/vga.h
                         include/kernel/hw/keyboard.h
+                        include/kernel/hw/timer.h
                         include/kernel/input/keycodes.h
                         include/kernel/input/input_event.h
                         include/types/buffer.h

+ 3 - 0
include/asm/port_io.h

@@ -12,6 +12,9 @@
 #define PORT_KEYBOARD_COMMAND (0x64)
 #define PORT_KEYBOARD_DATA (0x60)
 
+#define PORT_PIT_CONTROL (0x43)
+#define PORT_PIT_COUNT (0x40)
+
 #define PORT_KEYDATA 0x0060u
 
 #ifdef __cplusplus

+ 17 - 0
include/kernel/hw/timer.h

@@ -0,0 +1,17 @@
+#pragma once
+
+#include <types/stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void init_pit(void);
+
+void inc_tick(void);
+
+time_t current_ticks(void);
+
+#ifdef __cplusplus
+}
+#endif

+ 3 - 0
include/types/stdint.h

@@ -12,3 +12,6 @@ typedef __UINT64_TYPE__ uint64_t;
 
 typedef uint32_t size_t;
 typedef int32_t ssize_t;
+
+typedef uint32_t time_t;
+typedef int32_t time_diff_t;

+ 25 - 0
src/kernel/hw/timer.c

@@ -0,0 +1,25 @@
+#include <asm/port_io.h>
+#include <kernel/hw/timer.h>
+
+static time_t _current_ticks = 0;
+
+void init_pit(void)
+{
+    // set interval
+    asm_outb(PORT_PIT_CONTROL, 0x34);
+
+    // send interval number
+    // 0x2e9c = 11932 = 100Hz
+    asm_outb(PORT_PIT_COUNT, 0x9c);
+    asm_outb(PORT_PIT_COUNT, 0x2e);
+}
+
+void inc_tick(void)
+{
+    ++_current_ticks;
+}
+
+time_t current_ticks(void)
+{
+    return _current_ticks;
+}

+ 2 - 0
src/kernel/interrupt.c

@@ -2,6 +2,7 @@
 
 #include <asm/port_io.h>
 #include <kernel/hw/keyboard.h>
+#include <kernel/hw/timer.h>
 #include <kernel/interrupt.h>
 #include <kernel/stdio.h>
 #include <kernel/vga.h>
@@ -87,6 +88,7 @@ void int13_handler(
 
 void irq0_handler(void)
 {
+    inc_tick();
     asm_outb(PORT_PIC1_COMMAND, PIC_EOI);
 }
 // keyboard interrupt

+ 3 - 0
src/kernel_main.c

@@ -4,6 +4,7 @@
 #include <asm/port_io.h>
 #include <kernel/event/event.h>
 #include <kernel/hw/keyboard.h>
+#include <kernel/hw/timer.h>
 #include <kernel/interrupt.h>
 #include <kernel/mem.h>
 #include <kernel/stdio.h>
@@ -45,6 +46,8 @@ void kernel_main(void)
     vga_printk("Initializing interrupt descriptor table...\n", 0x0fu);
     init_idt();
 
+    init_pit();
+
     vga_printk("Interrupt descriptor table initialized!\n", 0x0fu);
 
     vga_printk("Initializing heap space\n", 0x0fu);