diff --git a/k/Makefile b/k/Makefile index 0eee6ca..4020c65 100644 --- a/k/Makefile +++ b/k/Makefile @@ -35,7 +35,8 @@ OBJS = \ events/idt.o \ events/isr.o \ events/pic/pic.o \ - events/pic/keyboard.o + events/pic/keyboard.o \ + utils/ring_buffer.o DEPS = $(OBJS:.o=.d) diff --git a/k/events/pic/keyboard.c b/k/events/pic/keyboard.c index 47f2c85..8601fc3 100644 --- a/k/events/pic/keyboard.c +++ b/k/events/pic/keyboard.c @@ -1,7 +1,26 @@ #include "keyboard.h" #include "io.h" +#include "utils/ring_buffer.h" + +static struct ring_buffer keyboard_buffer; void keyboard_handler(void) { - inb(KEYBOARD_IO); + u8 scan_code = inb(KEYBOARD_IO); + if (!(scan_code & 0x80)) + ring_buffer_push(&keyboard_buffer, &scan_code); +} + +int getkey(void) +{ + u8 *key = ring_buffer_pop(&keyboard_buffer); + if (!key) + return -1; + + return *key; +} + +void init_keyboard(void) +{ + ring_buffer_init(&keyboard_buffer, sizeof(u8)); } diff --git a/k/events/pic/keyboard.h b/k/events/pic/keyboard.h index 8913deb..9315b81 100644 --- a/k/events/pic/keyboard.h +++ b/k/events/pic/keyboard.h @@ -6,4 +6,8 @@ void keyboard_handler(void); +int getkey(void); + +void init_keyboard(void); + #endif /* !KEYBOARD_H */ diff --git a/k/events/pic/pic.c b/k/events/pic/pic.c index 64d73f1..55ce695 100644 --- a/k/events/pic/pic.c +++ b/k/events/pic/pic.c @@ -2,6 +2,7 @@ #include "io.h" #include "pic.h" #include "stdio.h" +#include "keyboard.h" static void send_icw1(void) { @@ -41,12 +42,12 @@ void init_pic(void) send_icw3(); send_icw4(); mask_irqs(); + init_keyboard(); asm volatile("sti"); } void acknowledge(uint32_t int_vector) { - printf("acknowledging %d\r\n", int_vector); uint8_t ocw2 = 0x20; if (int_vector >= IDT_RESERVED_ENTRIES + 8) outb(SLAVE_PIC_A, ocw2); diff --git a/k/utils/ring_buffer.c b/k/utils/ring_buffer.c new file mode 100644 index 0000000..595853c --- /dev/null +++ b/k/utils/ring_buffer.c @@ -0,0 +1,33 @@ +#include "ring_buffer.h" +#include "string.h" + +void ring_buffer_init(struct ring_buffer *buffer, u32 el_size) +{ + buffer->start = 0; + buffer->end = 0; + buffer->element_size = el_size; + buffer->size = 0; +} + +void ring_buffer_push(struct ring_buffer *buffer, void *el) +{ + if (buffer->size >= RING_BUFFER_SIZE) + return; + + char *dst = buffer->buffer + buffer->start; + memcpy(dst, el, buffer->element_size); + buffer->start = (buffer->start + buffer->element_size) % RING_BUFFER_SIZE; + buffer->size += buffer->element_size; +} + +void *ring_buffer_pop(struct ring_buffer *buffer) +{ + if (buffer->size == 0) + return NULL; + + void *res = buffer->buffer + buffer->end; + buffer->end = (buffer->end + buffer->element_size) % RING_BUFFER_SIZE; + buffer->size -= buffer->element_size; + + return res; +} diff --git a/k/utils/ring_buffer.h b/k/utils/ring_buffer.h new file mode 100644 index 0000000..7a6079b --- /dev/null +++ b/k/utils/ring_buffer.h @@ -0,0 +1,21 @@ +#ifndef RING_BUFFER_H +#define RING_BUFFER_H + +#define RING_BUFFER_SIZE 256 + +#include "k/types.h" + +struct ring_buffer +{ + char buffer[RING_BUFFER_SIZE]; + u32 start; + u32 end; + u32 element_size; + u32 size; +}; + +void ring_buffer_init(struct ring_buffer *buffer, u32 el_size); +void ring_buffer_push(struct ring_buffer *buffer, void *el); +void *ring_buffer_pop(struct ring_buffer *buffer); + +#endif /* !RING_BUFFER_H */ diff --git a/k/utils/utils.h b/k/utils/utils.h new file mode 100644 index 0000000..681caff --- /dev/null +++ b/k/utils/utils.h @@ -0,0 +1,9 @@ +#ifndef UTILS_H +#define UTILS_H + +static void *cast(void *ptr) +{ + return ptr; +} + +#endif /* !UTILS_H */