diff options
| author | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-09-05 04:19:56 +0200 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-09-05 04:19:56 +0200 |
| commit | 59f86fe8dd237e50c7fea03b506125e3abff0157 (patch) | |
| tree | 83c04c305ebfb3d5f55f600ea48082b42efe1a7e /kernel | |
| parent | 6e9b3275d75e0cdbae1e8f7e4dda8880bb6346bc (diff) | |
serial output
Diffstat (limited to 'kernel')
| -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 |
5 files changed, 59 insertions, 1 deletions
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(); |
