summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorJake Mannens <jake72360@gmail.com>2018-07-25 17:18:18 +1000
committerJake Mannens <jake72360@gmail.com>2018-07-25 17:18:18 +1000
commit9400716f56057d9f2fcd7f7ad033dfcb131105a2 (patch)
treeaf0e8a7fecf0231e8bd77e7470ad0d934b519778 /kernel
parent45819c035d0b92275de68e559f066cbe50996926 (diff)
Added missing prototype for puts() in stdio.h.
Implemented a basic serial interface using COM0 which can be accessed with the system call sys_puts as well as the library functions rsputs() and rsprintf(). Renamed puts() in con.c to con_puts() and made the function static to avoid interference with the library function puts().
Diffstat (limited to 'kernel')
-rw-r--r--kernel/boot.s4
-rw-r--r--kernel/con.c6
-rw-r--r--kernel/kmain.c3
-rw-r--r--kernel/serial.c52
4 files changed, 58 insertions, 7 deletions
diff --git a/kernel/boot.s b/kernel/boot.s
index 21b248c..db846c9 100644
--- a/kernel/boot.s
+++ b/kernel/boot.s
@@ -7,6 +7,7 @@ extern hd_init
extern kmain
extern paging_init
extern printk
+extern serial_init
extern syscall_init
extern timer_init
extern traps_init
@@ -39,7 +40,8 @@ kboot:
push .msg
call printk
add esp, 4
- ; initialize the disk interface
+ ; initialize secondary subsystems
+ call serial_init
call hd_init
; last minute setup, then transfer to kmain
call timer_init
diff --git a/kernel/con.c b/kernel/con.c
index c8be80b..2000fbc 100644
--- a/kernel/con.c
+++ b/kernel/con.c
@@ -1,7 +1,7 @@
/*
* con.c
*
- * Basic VGA text console. Implements printk() and puts().
+ * Basic VGA text console. Implements printk().
*/
#include <asm/io.h>
@@ -64,7 +64,7 @@ void con_init(void) {
}
/* write a zero-terminated string to console */
-static int puts(char *s) {
+static int con_puts(char *s) {
uint8_t *p = &vram[pos];
while(*s) {
@@ -100,6 +100,6 @@ int printk(char *fmt, ...) {
ret = vsprintf(buf, fmt, ap);
va_end(ap);
- puts(buf);
+ con_puts(buf);
return ret;
}
diff --git a/kernel/kmain.c b/kernel/kmain.c
index 7c8a72d..e9430ba 100644
--- a/kernel/kmain.c
+++ b/kernel/kmain.c
@@ -4,9 +4,6 @@
#include <stdint.h>
void kmain(void) {
- int i;
- int ret;
-
printk("Kernel booted!\n\n");
sched_init();
diff --git a/kernel/serial.c b/kernel/serial.c
new file mode 100644
index 0000000..7f23298
--- /dev/null
+++ b/kernel/serial.c
@@ -0,0 +1,52 @@
+#include <asm/io.h>
+#include <kernel/con.h>
+
+/* 115200 baud */
+#define DIVISOR 1
+
+#define RSBASE 0x3F8
+
+#define RSDATA RSBASE
+#define RSINTEN (RSBASE + 1)
+#define RSFIFOC (RSBASE + 2)
+#define RSLINEC (RSBASE + 3)
+#define RSMODEMC (RSBASE + 4)
+#define RSLINES (RSBASE + 5)
+#define RSMODEMS (RSBASE + 6)
+#define RSSCRATCH (RSBASE + 7)
+
+static int rsputs(char *s) {
+ while(*s) {
+ while((inb(RSLINES) & 0x20) == 0);
+ outb(RSDATA, *s++);
+ }
+
+ return 0;
+}
+
+void serial_init(void) {
+ outb(RSSCRATCH, 0x00);
+ outb(RSSCRATCH, 0xAA);
+ if(inb(RSSCRATCH) != 0xAA) {
+ printk("[rs] COM0 not detected!\n");
+ return;
+ }
+
+ /* enable access to the divisor */
+ outb(RSLINEC, inb(RSLINEC) | 0x80);
+ /* write the divisor */
+ outb(RSBASE, DIVISOR);
+ outb(RSBASE + 1, DIVISOR >> 8);
+ /* restore access to the divisor */
+ outb(RSLINEC, inb(RSLINEC) & 0x7F);
+ /* configure port parameters */
+ outb(RSLINEC, 0x03);
+ outb(RSINTEN, 0x00);
+
+ rsputs("[kernel] Serial monitor initialized!\n\r");
+ printk("[rs] Serial port COM0 initialized!\n");
+}
+
+int sys_rsputs(char *s) {
+ return rsputs(s);
+}