diff --git a/kernel/include/keyboard.hpp b/kernel/include/keyboard.hpp index 76b7bfc2..8532b6e1 100644 --- a/kernel/include/keyboard.hpp +++ b/kernel/include/keyboard.hpp @@ -3,6 +3,15 @@ #include "types.hpp" +namespace keyboard { + +const char KEY_ENTER = 0x1C; +const char KEY_BACKSPACE = 0x0E; + +void install_driver(); +char get_char(); char key_to_ascii(uint8_t key); +} + #endif diff --git a/kernel/src/kernel.cpp b/kernel/src/kernel.cpp index 71e8f888..6c8b5c22 100644 --- a/kernel/src/kernel.cpp +++ b/kernel/src/kernel.cpp @@ -1,6 +1,7 @@ #include "memory.hpp" #include "timer.hpp" #include "shell.hpp" +#include "keyboard.hpp" extern "C" { @@ -8,6 +9,7 @@ void __attribute__ ((section ("main_section"))) kernel_main(){ load_memory_map(); init_memory_manager(); install_timer(); + keyboard::install_driver(); init_shell(); return; diff --git a/kernel/src/keyboard.cpp b/kernel/src/keyboard.cpp index 586a9031..87ff9a04 100644 --- a/kernel/src/keyboard.cpp +++ b/kernel/src/keyboard.cpp @@ -1,4 +1,5 @@ #include "keyboard.hpp" +#include "kernel_utils.hpp" namespace { @@ -42,8 +43,50 @@ char qwertz[128] = 0, /* All other keys are undefined */ }; +const uint8_t BUFFER_SIZE = 64; + +char input_buffer[BUFFER_SIZE]; +volatile uint8_t start; +volatile uint8_t count; + +void keyboard_handler(){ + auto key = static_cast(in_byte(0x60)); + + if(count == BUFFER_SIZE){ + //The buffer is full, we loose the characters + } else { + auto end = (start + count) % BUFFER_SIZE; + input_buffer[end] = key; + ++count; + } } -char key_to_ascii(uint8_t key){ +} + +void keyboard::install_driver(){ + register_irq_handler<1>(keyboard_handler); + + start = 0; + count = 0; +} + +char keyboard::get_char(){ + //Wait for the buffer to contains something + while(count == 0){ + __asm__ __volatile__ ("nop"); + __asm__ __volatile__ ("nop"); + __asm__ __volatile__ ("nop"); + __asm__ __volatile__ ("nop"); + __asm__ __volatile__ ("nop"); + } + + auto key = input_buffer[start]; + start = (start + 1) % BUFFER_SIZE; + --count; + + return key; +} + +char keyboard::key_to_ascii(uint8_t key){ return qwertz[key]; } diff --git a/kernel/src/shell.cpp b/kernel/src/shell.cpp index fc99ffd0..cf17ad31 100644 --- a/kernel/src/shell.cpp +++ b/kernel/src/shell.cpp @@ -46,45 +46,44 @@ char current_input[50]; void exec_command(); -#define KEY_ENTER 0x1C -#define KEY_BACKSPACE 0x0E +void start_shell(){ + while(true){ + auto key = keyboard::get_char(); -void keyboard_handler(){ - uint8_t key = in_byte(0x60); - - if(key & 0x80){ - //TODO Handle shift - } else { - if(key == KEY_ENTER){ - current_input[current_input_length] = '\0'; - - k_print_line(); - - exec_command(); - - if(get_column() != 0){ - set_column(0); - set_line(get_line() + 1); - } - - current_input_length = 0; - - k_print("thor> "); - } else if(key == KEY_BACKSPACE){ - if(current_input_length > 0){ - set_column(get_column() - 1); - k_print(' '); - set_column(get_column() - 1); - - --current_input_length; - } + if(key & 0x80){ + //TODO Handle shift } else { - auto qwertz_key = key_to_ascii(key); + if(key == keyboard::KEY_ENTER){ + current_input[current_input_length] = '\0'; - if(qwertz_key > 0){ - current_input[current_input_length++] = qwertz_key; - k_print(qwertz_key); - } + k_print_line(); + + exec_command(); + + if(get_column() != 0){ + set_column(0); + set_line(get_line() + 1); + } + + current_input_length = 0; + + k_print("thor> "); + } else if(key == keyboard::KEY_BACKSPACE){ + if(current_input_length > 0){ + set_column(get_column() - 1); + k_print(' '); + set_column(get_column() - 1); + + --current_input_length; + } + } else { + auto qwertz_key = keyboard::key_to_ascii(key); + + if(qwertz_key > 0){ + current_input[current_input_length++] = qwertz_key; + k_print(qwertz_key); + } + } } } } @@ -291,5 +290,5 @@ void init_shell(){ k_print("thor> "); - register_irq_handler<1>(keyboard_handler); + start_shell(); }