mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-02 07:28:21 +00:00
keyboard: stub
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
#include <arch/hpet.h>
|
#include <arch/hpet.h>
|
||||||
#include <arch/smp.h>
|
#include <arch/smp.h>
|
||||||
#include <kernel/timer.h>
|
#include <kernel/timer.h>
|
||||||
|
#include <kernel/keyboard.h>
|
||||||
|
|
||||||
void kmain(){
|
void kmain(){
|
||||||
|
|
||||||
@@ -70,6 +71,8 @@ void kmain(){
|
|||||||
|
|
||||||
smp_init();
|
smp_init();
|
||||||
|
|
||||||
|
keyboard_init();
|
||||||
|
|
||||||
sched_runinit();
|
sched_runinit();
|
||||||
|
|
||||||
_panic("End of kmain()", 0);
|
_panic("End of kmain()", 0);
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
#ifndef _KEYBOARD_H_INCLUDE
|
||||||
|
#define _KEYBOARD_H_INCLUDE
|
||||||
|
|
||||||
|
#include <ringbuffer.h>
|
||||||
|
#include <kernel/event.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
ringbuffer_t buffer;
|
||||||
|
event_t event;
|
||||||
|
int flags;
|
||||||
|
} keyboard_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char ascii;
|
||||||
|
uintmax_t keycode;
|
||||||
|
int flags;
|
||||||
|
} kbpacket_t;
|
||||||
|
|
||||||
|
void keyboard_init();
|
||||||
|
int keyboard_getnew();
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
#include <kernel/keyboard.h>
|
||||||
|
#include <arch/panic.h>
|
||||||
|
#include <arch/interrupt.h>
|
||||||
|
|
||||||
|
#define MAX_KEYBOARD_COUNT 32
|
||||||
|
|
||||||
|
static uint32_t kblist;
|
||||||
|
static keyboard_t keyboards[MAX_KEYBOARD_COUNT];
|
||||||
|
|
||||||
|
void keyboard_packet(int kb, kbpacket_t packet){
|
||||||
|
ringbuffer_write(&keyboards[kb].buffer, &packet, sizeof(kbpacket_t));
|
||||||
|
event_signal(&keyboards[kb].event, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
int keyboard_getandwait(int kb, kbpacket_t* buff){
|
||||||
|
for(;;){
|
||||||
|
|
||||||
|
arch_interrupt_disable();
|
||||||
|
|
||||||
|
size_t readc = ringbuffer_read(&keyboards[kb].buffer, buff, sizeof(kbpacket_t));
|
||||||
|
|
||||||
|
arch_interrupt_enable();
|
||||||
|
|
||||||
|
if(readc)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// interruptible wait
|
||||||
|
|
||||||
|
int ret = event_wait(&keyboards[kb].event, true);
|
||||||
|
if(ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int keyboard_get(int kb, kbpacket_t* buff){
|
||||||
|
|
||||||
|
arch_interrupt_disable();
|
||||||
|
|
||||||
|
int readc = ringbuffer_read(&keyboards[kb].buffer, buff, sizeof(kbpacket_t));
|
||||||
|
|
||||||
|
arch_interrupt_enable();
|
||||||
|
|
||||||
|
return readc == 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int keyboard_getnew(){
|
||||||
|
|
||||||
|
for(size_t i = 0; i < MAX_KEYBOARD_COUNT; ++i){
|
||||||
|
if((kblist & (1 << i)) == 0){
|
||||||
|
kblist |= 1 << i;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void keyboard_init(){
|
||||||
|
|
||||||
|
for(size_t i = 0; i < MAX_KEYBOARD_COUNT; ++i){
|
||||||
|
if(ringbuffer_init(&keyboards[i].buffer, sizeof(kbpacket_t)*50))
|
||||||
|
_panic("Out of memory", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user