summaryrefslogtreecommitdiff
path: root/src/kernel/drivers/serial.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/drivers/serial.c')
-rw-r--r--src/kernel/drivers/serial.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/kernel/drivers/serial.c b/src/kernel/drivers/serial.c
new file mode 100644
index 0000000..25f89ad
--- /dev/null
+++ b/src/kernel/drivers/serial.c
@@ -0,0 +1,39 @@
+#include <stdint.h>
+#include <serial.h>
+static inline void outb(uint16_t port, uint8_t value) {
+ asm volatile(
+ "outb %0, %1" :: "a"(value), "Nd"(port)
+ );
+}
+
+static inline uint8_t inb(uint16_t port) {
+ uint8_t ret;
+ asm volatile(
+ "inb %1, %0" : "=a"(ret) : "Nd"(port)
+ );
+ return(ret);
+}
+
+int init_serial(uint16_t port) {
+ outb(port + 1, 0x00);
+ outb(port + 3, 0x80);
+ outb(port + 0, 0x06);
+ outb(port + 1, 0x00);
+ outb(port + 3, 0x03);
+ outb(port + 2, 0xc7);
+ outb(port + 4, 0x0b);
+ outb(port + 4, 0x1e);
+
+ outb(port + 0, 0xae); // test char
+
+ if(inb(port + 0) != 0xae)
+ return 1;
+
+ outb(port + 4, 0x0f); // dissable interupts
+ return 0;
+}
+
+void _putchar_serial(uint16_t port, char msg) {
+ while(!(inb(port + 5) & 0x20)); //wait for transmit to be done
+ outb(port, msg);
+}