[Experimental] [Driver-related] Add device abstraction for cleaner code

This commit is contained in:
hippoz 2020-12-13 02:10:27 +02:00
parent 7df1bb6478
commit 929ac3833f
Signed by untrusted user who does not match committer: hippoz
GPG key ID: 7C52899193467641
6 changed files with 93 additions and 17 deletions

View file

@ -13,7 +13,7 @@ BIN = sysroot/boot/hhhos.bin
ISO = build/HhhOS.iso
OBJS = build/boot.o build/kernel.o build/string.o build/terminal.o build/idt.o \
build/isr.o build/util.o build/keyboard.o build/pic.o
build/isr.o build/util.o build/device.o build/keyboard.o build/pic.o
ARCHDIR = arch/$(ARCH)/

30
arch/i386/device.c Normal file
View file

@ -0,0 +1,30 @@
#include <device.h>
int _device_index = 0;
struct device descriptors[64];
int push_device(struct device device) {
int descriptor = _device_index;
descriptors[descriptor] = device;
_device_index++;
return descriptor;
}
void* read(int descriptor, void* data) {
if (descriptor >= _device_index) return -1;
struct device device = descriptors[descriptor];
return device.read(data);
}
void* write(int descriptor, void* data) {
if (descriptor >= _device_index) return -1;
struct device device = descriptors[descriptor];
return device.write(data);
}

View file

@ -3,6 +3,7 @@
#include <isr.h>
#include <keyboard.h>
#include <pic.h>
#include <device.h>
/* Check if the compiler thinks you are targeting the wrong operating system. */
#if defined(__linux__)
@ -24,7 +25,9 @@ void kmain() {
isr_install();
terminal_writeline("done");
terminal_writestring("Preparing keyboard... ");
keyboard_init();
int keyboard_descriptor = keyboard_init();
terminal_writestring("done, descriptor: ");
terminal_writeline(itoa(keyboard_descriptor));
terminal_writestring("Are interrupts enabled? ");
if (are_interrupts_enabled() == 1) {
@ -39,6 +42,9 @@ void kmain() {
terminal_writeline("no");
}
terminal_writestring("kmain memory address: ");
terminal_writeline(itoa(kmain));
terminal_writeline("----------");
terminal_writeline("hello yes");

View file

@ -1,6 +1,7 @@
#include <pic.h>
#include <keyboard.h>
#include <stdbool.h>
#include <device.h>
unsigned char kbdus[128] = {
0, 27, '1', '2', '3', '4', '5', '6', '7', '8', /* 9 */
@ -44,6 +45,10 @@ unsigned char kbdus[128] = {
uint8_t lastkey = 0;
uint8_t __kbd_enabled = 0;
unsigned char keyboard_get_key_from_scancode(unsigned char scancode) {
return kbdus[scancode];
}
__attribute__((interrupt)) static void keyboard_irq(struct interrupt_frame* frame) {
unsigned char scancode = inportb(0x60);
@ -72,26 +77,39 @@ __attribute__((interrupt)) static void keyboard_irq(struct interrupt_frame* fram
return;
}
if (!special) terminal_putchar(kbdus[scancode]);
if (!special) terminal_putchar(keyboard_get_key_from_scancode(scancode));
terminal_updatecursor();
pic_send_eoi(1);
}
void keyboard_init(void) {
pic_irq_enable(1);
idt_register_handler(33, (uint32_t)keyboard_irq);
__kbd_enabled = 1;
terminal_writeline("haha keyboard go brr");
}
uint8_t keyboard_enabled(void) {
return __kbd_enabled;
}
void keyboard_read_key(void) {
lastkey = 0;
if (inportb(0x64) & 1)
lastkey = inportb(0x60);
void* keyboard_read(void* data) {
if (inportb(0x64) & 1) {
return keyboard_get_key_from_scancode(inportb(0x60));
} else {
return -1;
}
}
void* keyboard_write(void* data) {
return -1;
}
int keyboard_init(void) {
pic_irq_enable(1);
idt_register_handler(33, (uint32_t)keyboard_irq);
__kbd_enabled = 1;
struct device keyboard_device = {
write: &keyboard_write,
read: &keyboard_read
};
int keyboard_descriptor = push_device(keyboard_device);
return keyboard_descriptor;
}

22
include/device.h Normal file
View file

@ -0,0 +1,22 @@
#ifndef _DEVICE_H
#define _DEVICE_H 1
#ifdef __cplusplus
extern "C" {
#endif
struct device {
void* (*write)(void* data);
void* (*read)(void* data);
};
int push_device(struct device device);
void* read(int descriptor, void* data);
void* write(int descriptor, void* data);
#ifdef __cplusplus
}
#endif
#endif /* _DEVICE_H */

View file

@ -10,7 +10,7 @@
extern "C" {
#endif
void keyboard_init(void);
int keyboard_init(void);
uint8_t keyboard_enabled(void);
#ifdef __cplusplus