From b0b557d919848e2d585c52f064b3f6918a333533 Mon Sep 17 00:00:00 2001 From: Max Wash Date: Wed, 8 Feb 2023 21:28:14 +0000 Subject: [PATCH] x86_64: add temporary serial driver for printk --- arch/x86_64/include/arch/serial.h | 17 +++++++++++++++++ arch/x86_64/serial.c | 30 ++++++++++++++++++++++++++++++ arch/x86_64/vgacon.c | 3 +++ 3 files changed, 50 insertions(+) create mode 100644 arch/x86_64/include/arch/serial.h create mode 100644 arch/x86_64/serial.c diff --git a/arch/x86_64/include/arch/serial.h b/arch/x86_64/include/arch/serial.h new file mode 100644 index 0000000..f19f226 --- /dev/null +++ b/arch/x86_64/include/arch/serial.h @@ -0,0 +1,17 @@ +#ifndef ARCH_SERIAL_H_ +#define ARCH_SERIAL_H_ + +#define SERIAL_PORT_A 0x3F8 +#define SERIAL_PORT_B 0x2F8 +#define SERIAL_PORT_C 0x3E8 +#define SERIAL_PORT_D 0x2E8 + +extern void serial_putchar(int port, char ch); + +extern void serial_wait(int device); +extern void serial_send_byte(int device, char out); +extern char serial_recv_byte(int device); + +extern int serial_rcvd(int device); + +#endif diff --git a/arch/x86_64/serial.c b/arch/x86_64/serial.c new file mode 100644 index 0000000..0c2d666 --- /dev/null +++ b/arch/x86_64/serial.c @@ -0,0 +1,30 @@ +#include +#include + +static int transmit_empty(int device) +{ + return inportb(device + 5) & 0x20; +} + +void serial_send_byte(int device, char out) +{ + unsigned int _count = 0; + while (!transmit_empty(device)) { + _count++; + } + + outportb(device, out); + + while (!transmit_empty(device)) { + _count++; + } +} + +void serial_putchar(int port, char ch) +{ + if (ch == '\n') { + serial_send_byte(port, '\r'); + } + + serial_send_byte(port, ch); +} diff --git a/arch/x86_64/vgacon.c b/arch/x86_64/vgacon.c index 4b15123..d511540 100644 --- a/arch/x86_64/vgacon.c +++ b/arch/x86_64/vgacon.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -75,6 +76,8 @@ static void handle_ctrl(int c) static void vgacon_putchar(int c) { + serial_putchar(SERIAL_PORT_A, c); + if (iscntrl(c)) { handle_ctrl(c); return;