diff options
Diffstat (limited to '')
-rw-r--r-- | kernel/src/arch/i686/drivers/ps2ctrl.c (renamed from kernel/src/drivers/ps2ctrl.c) | 8 | ||||
-rw-r--r-- | kernel/src/arch/i686/drivers/ps2kb.c (renamed from kernel/src/drivers/ps2kb.c) | 10 | ||||
-rw-r--r-- | kernel/src/arch/i686/drivers/ps2mouse.c (renamed from kernel/src/drivers/ps2mouse.c) | 12 | ||||
-rw-r--r-- | kernel/src/arch/i686/drivers/rtc.c (renamed from kernel/src/drivers/cmos.c) | 44 | ||||
-rw-r--r-- | kernel/src/arch/i686/drivers/vga.c | 50 |
5 files changed, 90 insertions, 34 deletions
diff --git a/kernel/src/drivers/ps2ctrl.c b/kernel/src/arch/i686/drivers/ps2ctrl.c index 05ef25d..794aabd 100644 --- a/kernel/src/drivers/ps2ctrl.c +++ b/kernel/src/arch/i686/drivers/ps2ctrl.c @@ -1,9 +1,7 @@ #include <panic.h> -#include <sys.h> - -#include "print.h" -#include "ps2ctrl.h" -#include "interrupt/pic.h" +#include <arch/i686/drivers/ps2ctrl.h> +#include <arch/i686/pic.h> +#include <arch/i686/asm.h> #define STATUS_OUT_BUF ((uint8_t)0x01) #define STATUS_IN_BUF ((uint8_t)0x02) diff --git a/kernel/src/drivers/ps2kb.c b/kernel/src/arch/i686/drivers/ps2kb.c index f6fc514..50bdfb6 100644 --- a/kernel/src/drivers/ps2kb.c +++ b/kernel/src/arch/i686/drivers/ps2kb.c @@ -1,10 +1,8 @@ #include <panic.h> -#include <sys.h> - -#include "print.h" -#include "ps2kb.h" -#include "ps2ctrl.h" -#include "interrupt/pic.h" +#include <arch/i686/drivers/ps2ctrl.h> +#include <arch/i686/pic.h> +#include <arch/i686/asm.h> +#include <drivers/ps2kb.h> #define BUFFER_LEN 16 diff --git a/kernel/src/drivers/ps2mouse.c b/kernel/src/arch/i686/drivers/ps2mouse.c index 1616cd6..d1082a1 100644 --- a/kernel/src/drivers/ps2mouse.c +++ b/kernel/src/arch/i686/drivers/ps2mouse.c @@ -1,12 +1,8 @@ #include <panic.h> -#include <stdbool.h> -#include <string.h> -#include <sys.h> - -#include "print.h" -#include "ps2mouse.h" -#include "drivers/ps2ctrl.h" -#include "interrupt/pic.h" +#include <arch/i686/drivers/ps2ctrl.h> +#include <arch/i686/pic.h> +#include <arch/i686/asm.h> +#include <drivers/ps2mouse.h> static bool is_init = false; diff --git a/kernel/src/drivers/cmos.c b/kernel/src/arch/i686/drivers/rtc.c index 5ac12c3..ba69d15 100644 --- a/kernel/src/drivers/cmos.c +++ b/kernel/src/arch/i686/drivers/rtc.c @@ -1,7 +1,8 @@ -#include "print.h" +#include "time.h" #include <stdint.h> #include <sys.h> -#include <time.h> +#include <arch/i686/drivers/rtc.h> +#include <arch/i686/asm.h> #define CMOS_WRITE_PORT 0x70 #define CMOS_READ_PORT 0x71 @@ -15,9 +16,16 @@ #define CMOS_REG_YEAR 0x09 #define CMOS_REG_CEN 0x32 +// Live buffers to work on data static struct Time time; static struct Time localtime; -static int cur_offset = 0; + +// Front buffers so interupts dont request data that is half done +static struct Time cur_time; +static struct Time cur_localtime; + +// Current set Time Zone +static enum Timezone last_timezone = UTC; static uint8_t cmos_read(uint8_t reg) { uint8_t hex, ret; @@ -46,10 +54,12 @@ static void update_localtime(void) { // set localtime localtime = time; - // do we acutally need to do anything - if (cur_offset == 0) return; - localtime.hour += cur_offset; - + // if tz is UTC, we dont need to do anythin + if (last_timezone == UTC) { + cur_localtime = localtime; + return; + } + // check if day rolled over change = localtime.hour < 0 ? -1 : localtime.hour >= 24 ? 1 : 0; if (!change) return; @@ -98,13 +108,11 @@ year: localtime.yday = 0; localtime.year -= 1900; + + cur_localtime = localtime; } -void rtc_set_timezone(int offset) { - cur_offset = offset; -} - void rtc_update(void) { time.sec = cmos_read(CMOS_REG_SEC); time.min = cmos_read(CMOS_REG_MIN); @@ -127,12 +135,18 @@ void rtc_update(void) { time.year -= 1900; update_localtime(); + + cur_time = time; } -struct Time *rtc_utctime(void) { - return &time; +struct Time rtc_utctime(void) { + return cur_time; } -struct Time *rtc_localtime(void) { - return &localtime; +struct Time rtc_localtime(enum Timezone tz) { + if (tz != last_timezone) { + last_timezone = tz; + update_localtime(); + } + return cur_localtime; } diff --git a/kernel/src/arch/i686/drivers/vga.c b/kernel/src/arch/i686/drivers/vga.c new file mode 100644 index 0000000..a41ce54 --- /dev/null +++ b/kernel/src/arch/i686/drivers/vga.c @@ -0,0 +1,50 @@ +#include <arch/i686/asm.h> +#include <drivers/vga.h> +#include <stddef.h> +#include <stdint.h> +#include <string.h> + +static uint16_t *buffer = (uint16_t*) 0xC03FF000; +static uint8_t start, end; + +void vgatext_write(char c, enum vga_color color, uint8_t x, uint8_t y) { + const size_t index = y * VGA_TEXT_W + x; + buffer[index] = c | (uint16_t) color << 8; +} + +void vgatext_write_data(uint16_t data, uint16_t index) { + buffer[index] = data; +} + +void vgatext_write_buf(const uint16_t *src) { + memcpy(buffer, src, VGA_TEXT_W * VGA_TEXT_H * sizeof(uint16_t)); +} + +void vgatext_cur_mov(uint8_t x, uint8_t y) { +; const uint16_t pos = y * VGA_TEXT_W + x; + + outb(0x3D4, 0x0F); + outb(0x3D5, (uint8_t) (pos & 0xFF)); + outb(0x3D4, 0x0E); + outb(0x3D5, (uint8_t) ((pos >> 8) & 0xFF)); +} + +void vgatext_cur_resize(uint8_t s, uint8_t e) { + start = s; + end = e; + + outb(0x3D4, 0x0A); + outb(0x3D5, (inb(0x3D5) & 0xC0) | start); + + outb(0x3D4, 0x0B); + outb(0x3D5, (inb(0x3D5) & 0xE0) | end); +} + +void vgatext_cur_visible(bool visible) { + if (visible) { + vgatext_cur_resize(start, end); + } else { + outb(0x3D4, 0x0A); + outb(0x3D5, 0x20); + } +} |