Files
my-os-project2/kernel/hal/x86_64/serial.c
2025-08-13 23:28:25 +02:00

52 lines
1.1 KiB
C

#include <stdint.h>
#include <stdbool.h>
#include "io.h"
#include "putchar.h"
#define SERIAL_PORT 0x3f8
static int serial_received(void) {
return io_inb(SERIAL_PORT + 5) & 1;
}
static uint8_t serial_read(void) {
while (serial_received() == 0);
return io_inb(SERIAL_PORT);
}
static int serial_trans_empty(void) {
return io_inb(SERIAL_PORT + 5) & 0x20;
}
static void serial_write(uint8_t value) {
while (!serial_trans_empty());
io_outb(SERIAL_PORT, value);
}
// REFERENCE: https://wiki.osdev.org/Serial_Ports
bool serial_init(void) {
io_outb(SERIAL_PORT + 1, 0x00);
io_outb(SERIAL_PORT + 3, 0x80);
io_outb(SERIAL_PORT + 0, 0x03);
io_outb(SERIAL_PORT + 1, 0x00);
io_outb(SERIAL_PORT + 3, 0x03);
io_outb(SERIAL_PORT + 2, 0xc7);
io_outb(SERIAL_PORT + 4, 0x0b);
io_outb(SERIAL_PORT + 4, 0x1e);
io_outb(SERIAL_PORT + 0, 0xae);
if (io_inb(SERIAL_PORT + 0) != 0xae) {
return false;
}
io_outb(SERIAL_PORT + 4, 0x0f);
return true;
}
#if PUTCHAR_ == PUTCHAR_SERIAL
// For printf library
void putchar_(char c) {
serial_write(c);
}
#endif