From 46a5f1ee4db70a037af5038deaa1d64ad0f7862c Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Fri, 12 Feb 2021 17:55:31 +0200 Subject: Add serial0 console output --- drivers/ports.h | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'drivers/ports.h') diff --git a/drivers/ports.h b/drivers/ports.h index 338c3b8..8671f19 100644 --- a/drivers/ports.h +++ b/drivers/ports.h @@ -6,34 +6,36 @@ concept port_data_t = (is_same::value || is_same::value template class Port { public: - [[nodiscard]] T read() { + [[nodiscard]] T read(uint16_t offset = 0) { + const uint16_t port = port_num + offset; T result; switch (sizeof(T)) { case 1: - asm volatile("inb %1, %0" : "=a"(result) : "Nd"(port_num)); + asm volatile("inb %1, %0" : "=a"(result) : "Nd"(port)); break; case 2: - asm volatile("inw %1, %0" : "=a"(result) : "Nd"(port_num)); + asm volatile("inw %1, %0" : "=a"(result) : "Nd"(port)); break; case 4: - asm volatile("inl %1, %0" : "=a"(result) : "Nd"(port_num)); + asm volatile("inl %1, %0" : "=a"(result) : "Nd"(port)); break; } return result; } - void write(T data) { + void write(T data, uint16_t offset = 0) { + const uint16_t port = port_num + offset; switch (sizeof(T)) { case 1: - asm volatile("outb %0, %1" : : "a"(data), "Nd"(port_num)); + asm volatile("outb %0, %1" : : "a"(data), "Nd"(port)); break; case 2: - asm volatile("outw %0, %1" : : "a"(data), "Nd"(port_num)); + asm volatile("outw %0, %1" : : "a"(data), "Nd"(port)); break; case 4: - asm volatile("outl %0, %1" : : "a"(data), "Nd"(port_num)); + asm volatile("outl %0, %1" : : "a"(data), "Nd"(port)); break; } } @@ -45,3 +47,9 @@ typedef Port<0x3d5, uint8_t> cga_dat_port; // 0x3d8 : mode select register // 0x3d8 : color control register // 0x3da : status register + +/* Serial ports */ +typedef Port<0x3f8, uint8_t> com1_port_t; +typedef Port<0x2f8, uint8_t> com2_port_t; +typedef Port<0x3e8, uint8_t> com3_port_t; +typedef Port<0x2e8, uint8_t> com4_port_t; -- cgit v1.2.1