[pc] Use cbuf lib instead of custom queue.
The facilities to manage a key buffer with non-busy waiting already
exist, so use the existing lib in the keyboard driver instead of the
custom circular queue and wait queue.
diff --git a/platform/pc/keyboard.c b/platform/pc/keyboard.c
index e0f6a7e..27e3d3c 100644
--- a/platform/pc/keyboard.c
+++ b/platform/pc/keyboard.c
@@ -32,6 +32,7 @@
#include <platform/pc.h>
#include "platform_p.h"
#include <arch/x86.h>
+#include <lib/cbuf.h>
static inline int i8042_read_data(void)
{
@@ -162,52 +163,7 @@
static bool key_lshift;
static bool key_rshift;
-/*
- * key buffer
- */
-#define KEY_BUFFER_LEN 10
-
-static uint8_t key_buffer[KEY_BUFFER_LEN];
-static int key_buffer_in_ptr, key_buffer_out_ptr;
-
-static wait_queue_t key_buffer_wq;
-
-static int inq(uint8_t data) {
- int temp;
-
- temp = key_buffer_in_ptr + 1;
- if (temp >= KEY_BUFFER_LEN) {
- temp = 0;
- }
-
- // if in_ptr reaches out_ptr, the queue is full
- if (temp == key_buffer_out_ptr) {
- return -1;
- }
-
- key_buffer[key_buffer_in_ptr] = data;
- key_buffer_in_ptr = temp;
-
- return 0;
-}
-
-static int deq(void) {
- int rv;
-
- // if out_ptr reaches in_ptr, the queue is empty
- if (key_buffer_out_ptr == key_buffer_in_ptr) {
- return -1;
- }
-
- rv = key_buffer[key_buffer_out_ptr];
- key_buffer_out_ptr++;
-
- if (key_buffer_out_ptr >= KEY_BUFFER_LEN) {
- key_buffer_out_ptr = 0;
- }
-
- return rv;
-}
+static cbuf_t key_buf;
static void i8042_process_scode(uint8_t scode, unsigned int flags)
{
@@ -240,11 +196,8 @@
key_rshift ? 'R' : ' ');*/
if (keyCode != -1 && !keyUpBit) {
- if (!inq(keyCode)) {
- enter_critical_section();
- wait_queue_wake_one(&key_buffer_wq, 1, 0);
- exit_critical_section();
- }
+ char c = (char) keyCode;
+ cbuf_write(&key_buf, &c, 1, false);
}
// update the last received code
@@ -350,34 +303,18 @@
int platform_read_key(char *c)
{
- int data;
-
- do {
- enter_critical_section();
- data = deq();
+ ssize_t len;
- if (data != -1) {
- *c = (char) data;
- } else {
- wait_queue_block(&key_buffer_wq, INFINITE_TIME);
- exit_critical_section();
- continue;
- }
- exit_critical_section();
- } while(0);
-
- return data; //data == -1 ? -1 : 0;
+ len = cbuf_read(&key_buf, c, 1, true);
+ return len;
}
void platform_init_keyboard(void)
{
uint8_t ctr;
- // clear in case of reinit
- key_buffer_in_ptr = key_buffer_out_ptr = 0;
+ cbuf_initialize(&key_buf, 32);
- wait_queue_init(&key_buffer_wq);
-
i8042_flush();
if (i8042_command(&ctr, I8042_CMD_CTL_RCTR)) {