diff --git a/kernel/include/keyboard.hpp b/kernel/include/keyboard.hpp index fca1e4a6..4902a872 100644 --- a/kernel/include/keyboard.hpp +++ b/kernel/include/keyboard.hpp @@ -24,6 +24,8 @@ char get_char(); char key_to_ascii(uint8_t key); char shift_key_to_ascii(uint8_t key); +char get_char_blocking(); + } #endif diff --git a/kernel/src/keyboard.cpp b/kernel/src/keyboard.cpp index 219a5715..03268d08 100644 --- a/kernel/src/keyboard.cpp +++ b/kernel/src/keyboard.cpp @@ -8,6 +8,8 @@ #include "keyboard.hpp" #include "interrupts.hpp" #include "kernel_utils.hpp" +#include "semaphore.hpp" +#include "spinlock.hpp" namespace { @@ -95,6 +97,9 @@ char input_buffer[BUFFER_SIZE]; volatile uint8_t start; volatile uint8_t count; +spinlock lock; +semaphore sem; + void keyboard_handler(const interrupt::syscall_regs&){ auto key = static_cast(in_byte(0x60)); @@ -107,15 +112,22 @@ void keyboard_handler(const interrupt::syscall_regs&){ } } -} +} //end of anonymous namespace void keyboard::install_driver(){ interrupt::register_irq_handler(1, keyboard_handler); start = 0; count = 0; + + sem.init(0); } +char blocking::get_char_blocking(){ + //TODO +} + +//TODO Once shell is user mode, can be removed char keyboard::get_char(){ //Wait for the buffer to contains something while(count == 0){ diff --git a/kernel/src/system_calls.cpp b/kernel/src/system_calls.cpp index 9cc074de..dff00313 100644 --- a/kernel/src/system_calls.cpp +++ b/kernel/src/system_calls.cpp @@ -8,6 +8,7 @@ #include "system_calls.hpp" #include "console.hpp" #include "scheduler.hpp" +#include "keyboard.hpp" namespace { @@ -23,6 +24,11 @@ void sc_print_digit(const interrupt::syscall_regs& regs){ k_print(regs.rbx); } +void sc_get_char(const interrupt::syscall_regs& regs){ + auto c = keyboard::get_char_blocking(); + //TODO +} + } //End of anonymous namespace void system_call_entry(const interrupt::syscall_regs& regs){ @@ -41,6 +47,10 @@ void system_call_entry(const interrupt::syscall_regs& regs){ sc_print_digit(regs); break; + case 3: + sc_get_char(regs); + break; + case 0x666: scheduler::kill_current_process(regs); break;