From 59f86fe8dd237e50c7fea03b506125e3abff0157 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Mon, 5 Sep 2022 04:19:56 +0200 Subject: serial output --- kernel/src/devices/serial.c | 37 +++++++++++++++++++++++++++++++++++++ kernel/src/libk/stdio.c | 5 ++++- kernel/src/main.c | 2 ++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 kernel/src/devices/serial.c (limited to 'kernel/src') 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 +#include + +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 #include - #include #include #include +#include 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 #include #include +#include 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(); -- cgit v1.2.3