adds a queue library, work for keyb driver

This commit is contained in:
2025-06-02 10:35:57 -04:00
parent 0fc2e6a199
commit ca77157344
5 changed files with 97 additions and 1 deletions

View File

@ -31,6 +31,7 @@ void exception_handler(unsigned int i)
//kinfo("Sending EOI instruction to KEYB");
#endif
unsigned char in = inb(0x60);
char to_print = decode_key_enum(decode_scancode(in));
if (to_print != '\0')
printf("%c", to_print);

View File

@ -1,4 +1,5 @@
#include <stdbool.h>
#include <stdint.h>
#include <kernel/x86/keyb.h>

View File

@ -3,6 +3,20 @@
#ifndef ARCH_KEYB_H
#define ARCH_KEYB_H
#define KEYB_DATA_PORT (0x60)
#define KEYB_STATUS_PORT (0x64)
#define KEYB_COMMAND_PORT (0x64)
#define KEYB_RESP_ERR (0x00)
#define KEYB_RESP_SELF_TEST_PASSED (0xAA)
#define KEYB_RESP_ECHO (0xEE)
#define KEYB_RESP_ACK (0xFA)
#define KEYB_RESP_SELF_TEST_FAILED (0xFC)
#define KEYB_RESP_SELF_TEST_FAILED_TWO (0xFD)
#define KEYB_RESP_RESEND (0xFE)
#define KEYB_RESP_ERR_TWO (0xFF)
typedef enum {
KEY_ESC = 0x01,
KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0,
@ -58,8 +72,10 @@ typedef enum {
KEY_F12_R,
} kb_key_press_t;
kb_key_press_t decode_scancode(uint8_t scancode);
kb_key_press_t decode_scancode(uint8_t scancode);
char decode_key_enum(kb_key_press_t keycode);
#endif

25
libc/include/queue.h Normal file
View File

@ -0,0 +1,25 @@
#include <stdint.h>
#ifndef QUEUE_H
#define QUEUE_H
#define MAX_QUEUE_SIZE 100
typedef struct {
uint8_t items[MAX_QUEUE_SIZE];
short front;
short rear;
} queue;
void init_queue(queue* q);
bool queue_is_empty(queue* q);
bool queue_is_full(queue* q);
void enqueue(queue* q, uint8_t val);
void dequeue(queue* q);
uint8_t queue_peek(queue* q);
#endif

53
libc/queue/queue.c Normal file
View File

@ -0,0 +1,53 @@
#ifdef __TESTING__
#include <kernel/_kernel.h>
#endif
#include <stdint.h>
#include <stdbool.h>
#include <queue.h>
void init_queue(queue *q)
{
q->front = -1;
q->rear = 0;
}
bool queue_is_empty(queue *q)
{return (q->front == q->rear - 1);} ; // TODO: if this returns true, shouldn't we just be re-init-ing because we have the space to take up that used array
bool queue_is_full(queue *q)
{return (q->rear == MAX_QUEUE_SIZE);} // TODO: this is an error for SURE
void enqueue(queue *q, uint8_t val)
{
if (queue_is_full(q)) {
#ifdef __TESTING__
kwarn("Queue being added to is full!!"); // TODO add a way to print like code lines and addresses to stack trace this
#endif
return;
}
q->items[q->rear++] = val;
}
void dequeue(queue* q)
{
if (queue_is_empty(q)) {
#ifdef __TESTING__
kwarn("Queue thats already empty is trying to be removed from!!!"); // TODO same as above
#endif
return;
}
q->front++;
}
uint8_t peek(queue* q)
{
if (queue_is_empty(q)) {
#ifdef __TESTING__
kwarn("Peeking an empty queue!");
#endif
return -1;
}
return q->items[q->front + 1];
}