[Experimental] [Driver-related] Add device abstraction for cleaner code
This commit is contained in:
parent
7df1bb6478
commit
929ac3833f
2
Makefile
2
Makefile
|
@ -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
30
arch/i386/device.c
Normal 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);
|
||||
}
|
|
@ -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");
|
||||
|
|
|
@ -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
22
include/device.h
Normal 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 */
|
|
@ -10,7 +10,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
void keyboard_init(void);
|
||||
int keyboard_init(void);
|
||||
uint8_t keyboard_enabled(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
Loading…
Reference in a new issue