summaryrefslogtreecommitdiff
path: root/src/kernel/arch/i386/tty
diff options
context:
space:
mode:
authordzwdz2022-04-07 21:13:00 +0200
committerdzwdz2022-04-07 21:13:00 +0200
commitda2bbef4e4f586ecf13cd5ffe9a62df3114a3483 (patch)
treec65b48e250f803938c82239a0919b8a92ee0b826 /src/kernel/arch/i386/tty
parentdf2c9dbc694fb4718fc4905b9af3331dbf73bfb2 (diff)
kernel: add a /com1 device
Diffstat (limited to 'src/kernel/arch/i386/tty')
-rw-r--r--src/kernel/arch/i386/tty/serial.c46
-rw-r--r--src/kernel/arch/i386/tty/serial.h7
-rw-r--r--src/kernel/arch/i386/tty/tty.c12
3 files changed, 2 insertions, 63 deletions
diff --git a/src/kernel/arch/i386/tty/serial.c b/src/kernel/arch/i386/tty/serial.c
deleted file mode 100644
index 054f956..0000000
--- a/src/kernel/arch/i386/tty/serial.c
+++ /dev/null
@@ -1,46 +0,0 @@
-#include <kernel/arch/i386/port_io.h>
-#include <kernel/arch/i386/tty/serial.h>
-#include <kernel/panic.h>
-#include <stdint.h>
-
-static const int COM1 = 0x3f8;
-
-static void serial_selftest(void) {
- char b = 0x69;
- port_out8(COM1 + 4, 0b00011110); // enable loopback mode
- port_out8(COM1, b);
- assert(port_in8(COM1) == b);
-}
-
-void serial_init(void) {
- // see https://www.sci.muni.cz/docs/pc/serport.txt
- // set baud rate divisor
- port_out8(COM1 + 3, 0b10000000); // enable DLAB
- port_out8(COM1 + 0, 0x01); // divisor = 1 (low byte)
- port_out8(COM1 + 1, 0x00); // (high byte)
-
- port_out8(COM1 + 3, 0b00000011); // 8 bits, no parity, one stop bit
- port_out8(COM1 + 1, 0x01); // enable the Data Ready IRQ
- port_out8(COM1 + 2, 0b11000111); // enable FIFO with 14-bit trigger level (???)
-
- serial_selftest();
-
- port_out8(COM1 + 4, 0b00001111); // enable everything in the MCR
-}
-
-static void serial_putchar(char c) {
- while ((port_in8(COM1 + 5) & 0x20) == 0); // wait for THRE
- port_out8(COM1, c);
-}
-
-bool serial_poll_read(char *c) {
- if ((port_in8(COM1 + 5) & 0x01) == 0) // needs DR
- return false;
- *c = port_in8(COM1);
- return true;
-}
-
-void serial_write(const char *buf, size_t len) {
- for (size_t i = 0; i < len; i++)
- serial_putchar(buf[i]);
-}
diff --git a/src/kernel/arch/i386/tty/serial.h b/src/kernel/arch/i386/tty/serial.h
deleted file mode 100644
index 808f1aa..0000000
--- a/src/kernel/arch/i386/tty/serial.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#pragma once
-#include <stdbool.h>
-#include <stddef.h>
-
-bool serial_poll_read(char *c);
-void serial_write(const char *buf, size_t len);
-void serial_init(void);
diff --git a/src/kernel/arch/i386/tty/tty.c b/src/kernel/arch/i386/tty/tty.c
index ebe0fd3..ab15aba 100644
--- a/src/kernel/arch/i386/tty/tty.c
+++ b/src/kernel/arch/i386/tty/tty.c
@@ -1,5 +1,4 @@
-#include <kernel/arch/i386/interrupts/irq.h>
-#include <kernel/arch/i386/tty/serial.h>
+#include <kernel/arch/i386/driver/serial.h>
#include <kernel/arch/i386/tty/vga.h>
#include <kernel/arch/io.h>
@@ -13,14 +12,7 @@ void tty_init(void) {
}
void tty_read(char *buf, size_t len) {
- irq_interrupt_flag(true);
- for (size_t i = 0; i < len; i++) {
- for (;;) {
- if (serial_poll_read(&buf[i])) break;
- asm("hlt" ::: "memory");
- }
- }
- irq_interrupt_flag(false);
+ serial_read(buf, len);
}
void tty_write(const char *buf, size_t len) {