diff options
author | Kartik Agaram <vc@akkartik.com> | 2019-09-14 01:42:29 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2019-09-14 01:45:55 -0700 |
commit | 46bb1d3157f9ad575c83a4bfa1e32b0d21bc8546 (patch) | |
tree | 28918f653d7cf970d33d5592047ef663289aca40 /kernel.soso/serial.c | |
parent | ded2b24ce28f4a9df75ce40117f0f06f09574369 (diff) | |
download | mu-46bb1d3157f9ad575c83a4bfa1e32b0d21bc8546.tar.gz |
5650 - support a second OS: soso
https://github.com/ozkl/soso + Much smaller than Linux; builds instantly + Supports graphics - No network support - Doesn't work on a cloud server (yet?)
Diffstat (limited to 'kernel.soso/serial.c')
-rw-r--r-- | kernel.soso/serial.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/kernel.soso/serial.c b/kernel.soso/serial.c new file mode 100644 index 00000000..6615d845 --- /dev/null +++ b/kernel.soso/serial.c @@ -0,0 +1,97 @@ +#include "common.h" +#include "serial.h" + +#define PORT 0x3f8 //COM1 + +void initializeSerial() +{ + outb(PORT + 1, 0x00); // Disable all interrupts + outb(PORT + 3, 0x80); // Enable DLAB (set baud rate divisor) + outb(PORT + 0, 0x03); // Set divisor to 3 (lo byte) 38400 baud + outb(PORT + 1, 0x00); // (hi byte) + outb(PORT + 3, 0x03); // 8 bits, no parity, one stop bit + outb(PORT + 2, 0xC7); // Enable FIFO, clear them, with 14-byte threshold + outb(PORT + 4, 0x0B); // IRQs enabled, RTS/DSR set +} + +int serialReceived() +{ + return inb(PORT + 5) & 1; +} + +char readSerial() +{ + while (serialReceived() == 0); + + return inb(PORT); +} + +int isTransmitEmpty() +{ + return inb(PORT + 5) & 0x20; +} + +void writeSerial(char a) +{ + while (isTransmitEmpty() == 0); + + outb(PORT,a); +} + +void Serial_PrintF(const char *format, ...) +{ + char **arg = (char **) &format; + char c; + char buf[20]; + + //arg++; + __builtin_va_list vl; + __builtin_va_start(vl, format); + + while ((c = *format++) != 0) + { + if (c != '%') + writeSerial(c); + else + { + char *p; + + c = *format++; + switch (c) + { + case 'x': + buf[0] = '0'; + buf[1] = 'x'; + //itoa (buf + 2, c, *((int *) arg++)); + itoa (buf + 2, c, __builtin_va_arg(vl, int)); + p = buf; + goto string; + break; + case 'd': + case 'u': + //itoa (buf, c, *((int *) arg++)); + itoa (buf, c, __builtin_va_arg(vl, int)); + p = buf; + goto string; + break; + + case 's': + //p = *arg++; + p = __builtin_va_arg(vl, char*); + if (! p) + p = "(null)"; + + string: + while (*p) + writeSerial(*p++); + break; + + default: + //writeSerial(*((int *) arg++)); + writeSerial(__builtin_va_arg(vl, int)); + break; + } + } + } + __builtin_va_end(vl); +} |