summaryrefslogtreecommitdiff
path: root/kernel/src/devices
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/devices')
-rw-r--r--kernel/src/devices/timer.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/kernel/src/devices/timer.c b/kernel/src/devices/timer.c
index 1291219..09ed21c 100644
--- a/kernel/src/devices/timer.c
+++ b/kernel/src/devices/timer.c
@@ -1,21 +1,52 @@
#include <timer.h>
#include <libk/stdio.h>
+#include <heap.h>
+#include <libk/list.h>
#include <io.h>
uint32_t tick = 0;
uint32_t seconds = 0;
+struct wait_queue {
+ int64_t ticks;
+ list_t list;
+};
+typedef struct wait_queue wait_queue;
+
+wait_queue timer_queue;
+
void timer_handler()
{
+ wait_queue* pos;
+ list_for_each_entry(pos, (&timer_queue.list), list) {
+ pos->ticks--;
+ }
+
tick++;
- if (tick > TICKS_PER_SECOND) {
+ if (tick >= TICKS_PER_SECOND) {
tick = 0;
seconds++;
}
}
+void wait(uint64_t ms)
+{
+ __asm__ volatile ("cli;");
+ wait_queue* queue = (wait_queue*)kalloc(sizeof(wait_queue));
+ queue->ticks = (int64_t)ms;
+ add_to_list(&queue->list, &timer_queue.list, timer_queue.list.next);
+ __asm__ volatile ("sti;");
+
+ while (queue->ticks > 0) ;
+
+ kfree(queue);
+ free_node(&queue->list);
+}
+
void init_timer(uint32_t frequency)
{
+ INIT_LIST(timer_queue.list);
+
uint32_t divisor = 1193180 / frequency;
outb(0x43, 0x36);