diff options
author | Brett Weiland <brett_weiland@bpcspace.com> | 2021-03-24 15:42:20 -0500 |
---|---|---|
committer | Brett Weiland <brett_weiland@bpcspace.com> | 2021-03-24 15:42:20 -0500 |
commit | f90c075d5061b3a89316d6bf3d5b190d49049ccd (patch) | |
tree | 36265da568b852ca5c0a8b4affe706cda80c4a9d /src/kernel/drivers/serial.c | |
parent | 14b109ea24dc5cb1db948de57a2a44c80ef4622e (diff) |
renamed: kernel/include/acpi.h -> include/acpi.h
renamed: kernel/include/libc.h -> include/libc.h
renamed: kernel/include/paging.h -> include/paging.h
renamed: kernel/include/printf.h -> include/printf.h
renamed: kernel/include/serial.h -> include/serial.h
renamed: kernel/include/video.h -> include/video.h
new file: indigo_os
renamed: kernel/libs/acpi.c -> kernel/acpi.c
renamed: kernel/libs/drivers/serial.c -> kernel/drivers/serial.c
renamed: kernel/libs/drivers/video.c -> kernel/drivers/video.c
renamed: kernel/libs/libc.c -> kernel/libc.c
renamed: kernel/libs/page.c -> kernel/page.c
renamed: kernel/libs/printf.c -> kernel/printf.c
renamed: kernel/libs/printf.h -> kernel/printf.h
modified: makefile
Diffstat (limited to 'src/kernel/drivers/serial.c')
-rw-r--r-- | src/kernel/drivers/serial.c | 39 |
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); +} |