aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/include/log.h4
-rw-r--r--kernel/include/timer.h9
-rw-r--r--kernel/log.c6
-rw-r--r--kernel/main.c11
-rw-r--r--kernel/timer.c24
5 files changed, 40 insertions, 14 deletions
diff --git a/kernel/include/log.h b/kernel/include/log.h
index fb29dd3..6953bee 100644
--- a/kernel/include/log.h
+++ b/kernel/include/log.h
@@ -1,3 +1,3 @@
-int log_putchar(char);
-int log_puts(const char*);
+void log_putchar(char);
+void log_puts(const char*);
void log(const char*, ...);
diff --git a/kernel/include/timer.h b/kernel/include/timer.h
index a7459a6..bf2eddd 100644
--- a/kernel/include/timer.h
+++ b/kernel/include/timer.h
@@ -1,7 +1,12 @@
#include <stdint.h>
-extern const uint64_t *current_tick;
+#define HZ 100
+#define PIT_FREQ 1193182
+
+extern volatile const uint64_t *current_tick;
struct regs_t;
-void timer_init(void);
+void timer_init(uint32_t freq);
+
+void timer_delay(uint64_t ticks);
diff --git a/kernel/log.c b/kernel/log.c
index 3f509c5..efc945d 100644
--- a/kernel/log.c
+++ b/kernel/log.c
@@ -5,17 +5,15 @@
#define BOCHS_PUTCHAR(ch) (outb(0xe9, ch))
-int log_putchar(int ch)
+void log_putchar(int ch)
{
BOCHS_PUTCHAR(ch);
- return 0;
}
-int log_puts(const char* str)
+void log_puts(const char* str)
{
while(*str)
log_putchar(*str++);
- return 0;
}
static char hex_table[16] = { '0', '1', '2', '3', '4', '5', '6', '7',
diff --git a/kernel/main.c b/kernel/main.c
index 9082859..d791da1 100644
--- a/kernel/main.c
+++ b/kernel/main.c
@@ -1,11 +1,13 @@
#include <stdint.h>
#include <stdio.h>
+#include <stdlib.h>
#include "gdt.h"
#include "idt.h"
#include "isr.h"
#include "irq.h"
#include "log.h"
#include "multiboot.h"
+#include "panic.h"
#include "pcspkr.h"
#include "ps2.h"
#include "timer.h"
@@ -36,15 +38,18 @@ void main(struct multiboot_info_t *hdr, uint32_t magic)
irq_init();
/* initialize other drivers */
- timer_init();
+ timer_init(HZ);
ps2_init();
asm("sti");
printf("Boot finished.\n");
- for(int i=0;i<50;++i)
- vga_drawpixel(i, i, VGA_RGBPACK(255, 0, 0));
+ printf("Testing RNG...\n");
+ srand(*current_tick);
+
+ for(int i=0;i>=0;++i)
+ vga_drawpixel(rand() % *vga_width, rand() % *vga_height, rand() % 0xFFFFFF);
printf("Testing keyboard LED's...\n");
diff --git a/kernel/timer.c b/kernel/timer.c
index 571fcbe..2fbd8eb 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -1,10 +1,11 @@
#include <stdint.h>
+#include "io.h"
#include "isr.h"
#include "timer.h"
-uint64_t current_tick_data = 0;
+volatile uint64_t current_tick_data = 0;
-const uint64_t *current_tick = &current_tick_data;
+volatile const uint64_t *current_tick = &current_tick_data;
static void timer_callback(struct regs_t regs)
{
@@ -12,7 +13,24 @@ static void timer_callback(struct regs_t regs)
++current_tick_data;
}
-void timer_init(void)
+void timer_init(uint32_t freq)
{
set_interrupt_handler(IRQ(0), timer_callback);
+
+ current_tick_data = 0;
+
+ uint32_t divisor = PIT_FREQ / freq;
+
+ uint8_t hi = (divisor >> 8) & 0xFF;
+ uint8_t lo = (divisor >> 0) & 0xFF;
+
+ outb(0x43, 0x36);
+ outb(0x40, lo);
+ outb(0x40, hi);
+}
+
+void timer_delay(uint64_t ticks)
+{
+ uint64_t end = *current_tick + ticks;
+ while(*current_tick <= end);
}