From 9e304e21a1792033c6244e677dbe48c743c6be29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20Kala=C5=A1=20=28Floxen=29?= Date: Sun, 12 Jul 2026 12:17:49 +0200 Subject: [PATCH] =?UTF-8?q?P=C5=99id=C3=A1n=20ovlada=C4=8D=20COM1:=20inici?= =?UTF-8?q?alizace=20UART=20a=20odes=C3=ADl=C3=A1n=C3=AD=20znak=C5=AF=20p?= =?UTF-8?q?=C5=99es=20s=C3=A9riov=C3=BD=20port?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/serial.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 drivers/serial.c diff --git a/drivers/serial.c b/drivers/serial.c new file mode 100644 index 0000000..a2933eb --- /dev/null +++ b/drivers/serial.c @@ -0,0 +1,74 @@ +/* + * AsterOS Kernel + * COM1 serial driver for robust debugging output. + */ + +#include "serial.h" + +#define COM1_PORT 0x3F8 + +static int g_serial_ready = 0; + +static inline void outb(u16 port, u8 value) { + __asm__ volatile ("outb %0, %1" : : "a"(value), "Nd"(port)); +} + +static inline u8 inb(u16 port) { + u8 value; + __asm__ volatile ("inb %1, %0" : "=a"(value) : "Nd"(port)); + return value; +} + +int serial_is_ready(void) { + return g_serial_ready; +} + +void serial_init(void) { + g_serial_ready = 0; + + outb(COM1_PORT + 1, 0x00); + outb(COM1_PORT + 3, 0x80); + outb(COM1_PORT + 0, 0x03); + outb(COM1_PORT + 1, 0x00); + outb(COM1_PORT + 3, 0x03); + outb(COM1_PORT + 2, 0xC7); + outb(COM1_PORT + 4, 0x0B); + + outb(COM1_PORT + 4, 0x1E); + outb(COM1_PORT + 0, 0xAE); + if (inb(COM1_PORT + 0) != 0xAE) { + return; + } + + outb(COM1_PORT + 4, 0x0F); + g_serial_ready = 1; +} + +void serial_write_char(char c) { + u32 spin; + + if (!g_serial_ready) { + return; + } + + if (c == '\n') { + serial_write_char('\r'); + } + + for (spin = 0; spin < 100000U; ++spin) { + if ((inb(COM1_PORT + 5) & 0x20U) != 0U) { + outb(COM1_PORT + 0, (u8)c); + return; + } + } +} + +void serial_write_string(const char *text) { + if (!text) { + return; + } + + while (*text) { + serial_write_char(*text++); + } +}