summaryrefslogtreecommitdiff
path: root/kernel/src/arch/i686/drivers
diff options
context:
space:
mode:
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.c50
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);
+ }
+}