From 95f823c2c3ada5f175dc5735886703387263b6f4 Mon Sep 17 00:00:00 2001 From: Arnau478 Date: Mon, 20 Jun 2022 18:05:28 +0200 Subject: [PATCH] PS/2 keyboard lowercase support --- src/kernel/drivers/keyboard.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/kernel/drivers/keyboard.c b/src/kernel/drivers/keyboard.c index 3a52a06..570de1d 100644 --- a/src/kernel/drivers/keyboard.c +++ b/src/kernel/drivers/keyboard.c @@ -1,3 +1,4 @@ +#include #include "../lib/string.h" #include "keyboard.h" #include "../arch/i686/isr.h" @@ -6,16 +7,19 @@ #include "../lib/stdio.h" #include "../shell.h" +static bool g_caps_lock = false; +static bool g_shift = false; + static char g_key_buffer[256]; static const char g_sc_ascii[128] = { '?', '?', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '?', '?', - 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', - 'O', 'P', '[', ']', '?', '?', 'A', 'S', - 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', - '\'', '`', '?', '\\', 'Z', 'X', 'C', 'V', - 'B', 'N', 'M', ',', '.', '/', '?', '?', + 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', + 'o', 'p', '[', ']', '?', '?', 'a', 's', + 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', + '\'', '`', '?', '\\', 'z', 'x', 'c', 'v', + 'b', 'n', 'm', ',', '.', '/', '?', '?', '?', ' ' }; @@ -25,8 +29,10 @@ static void user_input(char *str){ static void keyboard_callback(){ uint8_t scancode = i686_inb(0x60); - //printf("KEYBOARD (%i)!\n", scancode); - if(scancode < 128){ // If it's a "pressed" event, not "released" + if(scancode == 0x2A) g_shift = true; // Shift pressed + else if(scancode == 0x2A + 128) g_shift = false; // Shift released + else if(scancode == 0x3A) g_caps_lock = !g_caps_lock; // Caps lock pressed + else if(scancode < 128){ // If it's a "pressed" event, not "released" if(scancode == 0x0E){ // Backspace putc('\b'); g_key_buffer[strlen(g_key_buffer)-1] = '\0'; @@ -37,13 +43,15 @@ static void keyboard_callback(){ g_key_buffer[0] = '\0'; } else{ - putc(g_sc_ascii[scancode]); + char c = g_sc_ascii[scancode]; + if(c >= 'a' && c <= 'z' && g_shift != g_caps_lock) c += 'A' - 'a'; + putc(c); // strlen() works here because char[] is the same as // char*, and both are null-terminated, so they are // exactly the same int len = strlen(g_key_buffer); - g_key_buffer[len] = g_sc_ascii[scancode]; + g_key_buffer[len] = c; g_key_buffer[len+1] = '\0'; } }