diff --git a/src/kernel/boot/debug.c b/src/kernel/boot/debug.c index 3144eb4..79a3410 100644 --- a/src/kernel/boot/debug.c +++ b/src/kernel/boot/debug.c @@ -1,11 +1,10 @@ #include #include #include +#include // TODO: Temporary declarations void vga_write(char c); -void serial_write(int port, char c); -#define PORT_COM1 0 void num2str(char *buf, uint64_t num, uint64_t base) diff --git a/src/kernel/boot/debug.tt b/src/kernel/boot/debug.tt index bb1d00b..47bec7f 100644 --- a/src/kernel/boot/debug.tt +++ b/src/kernel/boot/debug.tt @@ -20,11 +20,11 @@ void vga_write(char c) static int i = 0; vga_recv[i++] = c; } -void serial_write(int port, char c) +void serial_write(uint16_t port, uint8_t c) { (void)port; static int i = 0; - serial_recv[i++] = c; + serial_recv[i++] = (char)c; } TEST(putch_sends_character_to_vga) diff --git a/src/kernel/boot/kmain.c b/src/kernel/boot/kmain.c index 8dda4ce..f631748 100644 --- a/src/kernel/boot/kmain.c +++ b/src/kernel/boot/kmain.c @@ -1,4 +1,6 @@ #include +#include +#include void clear_screen() { @@ -17,10 +19,20 @@ void print_string(char *str) } } +void vga_write(char c) +{ +// TODO: DUMMY + (void)c; +} + void kmain() { clear_screen(); print_string("Hello from c, world!"); + + serial_init(PORT_COM1); + debug_printf("Hello from debug printing function!\n"); + debug_printf("A number:%d\n", 12345); for(;;); } diff --git a/src/kernel/drivers/serial.c b/src/kernel/drivers/serial.c new file mode 100644 index 0000000..1d5ab64 --- /dev/null +++ b/src/kernel/drivers/serial.c @@ -0,0 +1,19 @@ +#include +#include + +void serial_init(uint16_t port) +{ + outb(port + 1, 0x00); + outb(port + 3, 0x80); + outb(port + 0, 0x03); + outb(port + 1, 0x00); + outb(port + 3, 0x03); + outb(port + 2, 0xC7); + outb(port + 4, 0x0B); +} + +void serial_write(uint16_t port, uint8_t c) +{ + while(!(inb(port + 5)&0x20)); + outb(port, c); +} diff --git a/src/kernel/include/ports.h b/src/kernel/include/ports.h new file mode 100644 index 0000000..f500143 --- /dev/null +++ b/src/kernel/include/ports.h @@ -0,0 +1,17 @@ +#pragma once +#include + +static __inline void _outb(uint16_t port, uint8_t value) +{ + asm volatile("outb %1, %0" : : "dN" (port), "a" (value)); +} + +static __inline uint8_t _inb(uint16_t port) +{ + uint8_t ret; + asm volatile("inb %1, %0" : "=a" (ret) : "dN" (port)); + return ret; +} + +#define outb _outb +#define inb _inb diff --git a/src/kernel/include/serial.h b/src/kernel/include/serial.h new file mode 100644 index 0000000..80de89b --- /dev/null +++ b/src/kernel/include/serial.h @@ -0,0 +1,7 @@ +#pragma once +#include + +#define PORT_COM1 0x3F8 + +void serial_init(uint16_t port); +void serial_write(uint16_t port, uint8_t c);