summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Makefile6
-rw-r--r--kernel/Makefile1
-rw-r--r--kernel/include/serial.h15
-rw-r--r--kernel/src/devices/serial.c37
-rw-r--r--kernel/src/libk/stdio.c5
-rw-r--r--kernel/src/main.c2
7 files changed, 64 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore
index 4e18914..5209157 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ kernel.iso
isodir
xbochs.log
bx_enh_dbg.ini
+serial.log
diff --git a/Makefile b/Makefile
index 4f5c382..761a4a2 100644
--- a/Makefile
+++ b/Makefile
@@ -52,10 +52,12 @@ QEMU = qemu-system-x86_64
BOCHS = bochs -q
qemu: kernel.iso
- $(QEMU) -cdrom kernel.iso
+ @$(QEMU) -cdrom kernel.iso -serial file:serial.log
+ @cat serial.log
bochs: kernel.iso
- $(BOCHS) -qf .bochsrc
+ @$(BOCHS) -qf .bochsrc
+ @cat serial.log
mount: isodir
ifeq ("$(wildcard /mnt/ext2/lost+found/)","")
diff --git a/kernel/Makefile b/kernel/Makefile
index 54a2838..cff4fa2 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -14,6 +14,7 @@ OBJS = \
src/cpu/tss.o \
src/devices/disc.o \
src/devices/keyboard.o \
+ src/devices/serial.o \
src/devices/timer.o \
src/fs/ext2.o \
src/libk/list.o \
diff --git a/kernel/include/serial.h b/kernel/include/serial.h
new file mode 100644
index 0000000..bff5581
--- /dev/null
+++ b/kernel/include/serial.h
@@ -0,0 +1,15 @@
+#ifndef SERIAL_H
+#define SERIAL_H
+
+#define COM1 0x3F8
+#define PORT COM1
+
+#include <types.h>
+
+void init_serial(void);
+uint8_t serial_received(void);
+char read_serial(void);
+uint8_t is_transmit_empty(void);
+void write_serial(char c);
+
+#endif
diff --git a/kernel/src/devices/serial.c b/kernel/src/devices/serial.c
new file mode 100644
index 0000000..76bc71a
--- /dev/null
+++ b/kernel/src/devices/serial.c
@@ -0,0 +1,37 @@
+#include <io.h>
+#include <serial.h>
+
+void init_serial()
+{
+ outb(PORT + 1, 0x00); // Disable all interrupts
+ outb(PORT + 3, 0x80); // Enable DLAB (set baud rate divisor)
+ outb(PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud
+ outb(PORT + 1, 0x00); // (hi byte)
+ outb(PORT + 3, 0x03); // 8 bits, no parity, one stop bit
+ outb(PORT + 2, 0xC7); // Enable FIFO, clear them, with 14-byte threshold
+ outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set
+}
+
+uint8_t serial_received()
+{
+ return inb(PORT + 5) & 1;
+}
+
+char read_serial()
+{
+ while (serial_received() == 0);
+
+ return (char)inb(PORT);
+}
+
+uint8_t is_transmit_empty()
+{
+ return inb(PORT + 5) & 0x20;
+}
+
+void write_serial(char c)
+{
+ while (is_transmit_empty() == 0);
+
+ outb(PORT, (uint8_t)c);
+}
diff --git a/kernel/src/libk/stdio.c b/kernel/src/libk/stdio.c
index da5d839..61681f0 100644
--- a/kernel/src/libk/stdio.c
+++ b/kernel/src/libk/stdio.c
@@ -1,9 +1,9 @@
#include <types.h>
#include <libk/stdio.h>
-
#include <stdarg.h>
#include <libk/string.h>
#include <graphics.h>
+#include <serial.h>
uint32_t curr_x;
uint32_t curr_y;
@@ -19,6 +19,7 @@ inline void print_char(char c)
curr_y = 0;
}
if (c == '\n') {
+ write_serial('\n');
curr_x = 0;
curr_y++;
return;
@@ -31,6 +32,8 @@ inline void print_char(char c)
}
fb_draw_character(main_fb, c, (int32_t)curr_x * 8, (int32_t)curr_y * 16, WHITE, BLACK);
curr_x++;
+
+ write_serial(c);
}
inline void print_string(const char* s)
diff --git a/kernel/src/main.c b/kernel/src/main.c
index 45d2eeb..dce9c05 100644
--- a/kernel/src/main.c
+++ b/kernel/src/main.c
@@ -14,10 +14,12 @@
#include <gdt.h>
#include <userspace.h>
#include <tss.h>
+#include <serial.h>
int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic);
int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
{
+ init_serial();
init_gdt();
init_paging();
init_idt();