aboutsummaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorMarvin Borner2020-07-22 18:26:56 +0200
committerMarvin Borner2020-07-22 18:26:56 +0200
commit40cc5e32663cd0350b791b8e54825f564489343f (patch)
tree3561c2f379b98ac3c3005f9048bb5535a0d3952d /src/drivers
parentc0a2074864e668b005eea8f50c6719bceb66bf20 (diff)
Imported some things from master
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/cpu.c40
-rw-r--r--src/drivers/serial.c32
2 files changed, 72 insertions, 0 deletions
diff --git a/src/drivers/cpu.c b/src/drivers/cpu.c
new file mode 100644
index 0000000..eb96562
--- /dev/null
+++ b/src/drivers/cpu.c
@@ -0,0 +1,40 @@
+// MIT License, Copyright (c) 2020 Marvin Borner
+// This file is a wrapper around some CPU asm calls
+
+#include <def.h>
+
+u8 inb(u16 port)
+{
+ u8 value;
+ __asm__ volatile("inb %1, %0" : "=a"(value) : "Nd"(port));
+ return value;
+}
+
+u16 inw(u16 port)
+{
+ u16 value;
+ __asm__ volatile("inw %1, %0" : "=a"(value) : "Nd"(port));
+ return value;
+}
+
+u32 inl(u16 port)
+{
+ u32 value;
+ __asm__ volatile("inl %1, %0" : "=a"(value) : "Nd"(port));
+ return value;
+}
+
+void outb(u16 port, u8 data)
+{
+ __asm__ volatile("outb %0, %1" ::"a"(data), "Nd"(port));
+}
+
+void outw(u16 port, u16 data)
+{
+ __asm__ volatile("outw %0, %1" ::"a"(data), "Nd"(port));
+}
+
+void outl(u16 port, u32 data)
+{
+ __asm__ volatile("outl %0, %1" ::"a"(data), "Nd"(port));
+}
diff --git a/src/drivers/serial.c b/src/drivers/serial.c
new file mode 100644
index 0000000..1ef424a
--- /dev/null
+++ b/src/drivers/serial.c
@@ -0,0 +1,32 @@
+#include <cpu.h>
+#include <def.h>
+#include <string.h>
+
+void serial_install()
+{
+ outb(0x3f8 + 1, 0x00);
+ outb(0x3f8 + 3, 0x80);
+ outb(0x3f8 + 0, 0x03);
+ outb(0x3f8 + 1, 0x00);
+ outb(0x3f8 + 3, 0x03);
+ outb(0x3f8 + 2, 0xC7);
+ outb(0x3f8 + 4, 0x0B);
+}
+
+int is_transmit_empty()
+{
+ return inb(0x3f8 + 5) & 0x20;
+}
+
+void serial_put(char ch)
+{
+ while (is_transmit_empty() == 0)
+ ;
+ outb(0x3f8, (u8)ch);
+}
+
+void serial_print(const char *data)
+{
+ for (u32 i = 0; i < strlen(data); i++)
+ serial_put(data[i]);
+}