summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/cpu/idt.c10
-rw-r--r--kernel/drivers.c2
-rw-r--r--kernel/drivers/pit.c23
-rw-r--r--kernel/include/comus/drivers/pit.h21
4 files changed, 48 insertions, 8 deletions
diff --git a/kernel/cpu/idt.c b/kernel/cpu/idt.c
index 8b4465f..42cf651 100644
--- a/kernel/cpu/idt.c
+++ b/kernel/cpu/idt.c
@@ -2,6 +2,7 @@
#include <comus/memory.h>
#include <comus/asm.h>
#include <comus/cpu.h>
+#include <comus/drivers/pit.h>
#include "idt.h"
#include "pic.h"
@@ -153,14 +154,7 @@ int counter = 0;
void idt_pic_timer(void)
{
- // print a message once we know the timer works
- // but avoid spamming the logs
- if (counter == 3) {
- //kputs("pic timer!\n");
- }
- if (counter <= 3) {
- counter++;
- }
+ ticks++;
}
void idt_pic_keyboard(void)
diff --git a/kernel/drivers.c b/kernel/drivers.c
index 04145db..15de4df 100644
--- a/kernel/drivers.c
+++ b/kernel/drivers.c
@@ -3,10 +3,12 @@
#include <comus/drivers/uart.h>
#include <comus/drivers/pci.h>
#include <comus/drivers/gpu.h>
+#include <comus/drivers/pit.h>
#include <comus/mboot.h>
void drivers_init(void)
{
+ pit_set_divider(100); // 1ms
uart_init();
pci_init();
acpi_init(mboot_get_rsdp());
diff --git a/kernel/drivers/pit.c b/kernel/drivers/pit.c
new file mode 100644
index 0000000..cb3c091
--- /dev/null
+++ b/kernel/drivers/pit.c
@@ -0,0 +1,23 @@
+#include <comus/asm.h>
+#include <comus/drivers/pit.h>
+
+#define CHAN_0 0x40
+#define CHAN_1 0x41
+#define CHAN_2 0x42
+#define CMD 0x43
+
+uint64_t ticks = 0;
+
+uint16_t pit_read_divider(void) {
+ uint16_t count = 0;
+ cli();
+ outb(CMD, 0); // clear bits
+ count = inb(CHAN_0); // low byte
+ count |= inb(CHAN_0)<<8; // highbyte
+ return count;
+}
+
+void pit_set_divider(uint16_t count) {
+ outb(CHAN_0, count & 0xFF); // low byte
+ outb(CHAN_0, (count & 0xFF00) >> 8); // high byte
+}
diff --git a/kernel/include/comus/drivers/pit.h b/kernel/include/comus/drivers/pit.h
new file mode 100644
index 0000000..a7a111d
--- /dev/null
+++ b/kernel/include/comus/drivers/pit.h
@@ -0,0 +1,21 @@
+/**
+ * @file pit.h
+ *
+ * @author Freya Murphy <freya@freyacat.org>
+ *
+ * Programmable Interrupt Timer
+ */
+
+#ifndef PIT_H_
+#define PIT_H_
+
+#include <stdint.h>
+
+// how many time the pit has ticked
+// not accurate time, good for spinning though
+extern uint64_t ticks;
+
+uint16_t pit_read_divider(void);
+void pit_set_divider(uint16_t count);
+
+#endif