From c0df0ee6437aa2786b1a92bc6af1284958d104c7 Mon Sep 17 00:00:00 2001 From: Franklin Wei Date: Sat, 7 Feb 2015 11:03:48 -0500 Subject: new rng, some rework of I/O --- kernel/include/log.h | 4 ++-- kernel/include/timer.h | 9 +++++++-- kernel/log.c | 6 ++---- kernel/main.c | 11 ++++++++--- kernel/timer.c | 24 +++++++++++++++++++++--- 5 files changed, 40 insertions(+), 14 deletions(-) (limited to 'kernel') 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 -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 #include +#include #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 +#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 = ¤t_tick_data; +volatile const uint64_t *current_tick = ¤t_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); } -- cgit v1.1