diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | Makefile | 6 | ||||
| -rw-r--r-- | kernel/Makefile | 1 | ||||
| -rw-r--r-- | kernel/include/serial.h | 15 | ||||
| -rw-r--r-- | kernel/src/devices/serial.c | 37 | ||||
| -rw-r--r-- | kernel/src/libk/stdio.c | 5 | ||||
| -rw-r--r-- | kernel/src/main.c | 2 |
7 files changed, 64 insertions, 3 deletions
@@ -5,3 +5,4 @@ kernel.iso isodir xbochs.log bx_enh_dbg.ini +serial.log @@ -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(); |
