From df9d4e1a269721b30c02a2ce789bc6dd732793d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juhani=20Krekel=C3=A4?= Date: Sun, 23 Jan 2022 17:28:30 +0200 Subject: [PATCH] Get working on real HW and expand diagnostics --- grub.cfg | 2 ++ kernel.c | 53 ++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/grub.cfg b/grub.cfg index 94cd89a..b250464 100644 --- a/grub.cfg +++ b/grub.cfg @@ -1,3 +1,5 @@ +set timeout=2 + menuentry "ps2 kbtest" { multiboot /boot/ps2-kbtest.kernel } diff --git a/kernel.c b/kernel.c index a978d4c..3c4e690 100644 --- a/kernel.c +++ b/kernel.c @@ -178,14 +178,18 @@ void write_config_8042(uint8_t config) { write_8042(config); } +void flush_buffer() { + while (status_8042() & (1<<0)) + (void) read_8042(); +} + void init_8042(void) { // Disable devices command_8042(0xad); command_8042(0xa7); // Flush output buffer - while (status_8042() & (1<<0)) - (void) read_8042(); + flush_buffer(); // Read configuration uint8_t config = read_config_8042(); @@ -262,37 +266,36 @@ uint8_t read_keyboard(void) { } void enable_scanning(void) { + flush_buffer(); write_8042(0xf4); if (read_keyboard() != 0xfa) terminal_writestring("Enabling scanning failed\n"); - while (status_8042() & (1<<0)) - (void) read_8042(); } void disable_scanning(void) { + flush_buffer(); write_8042(0xf5); if (read_keyboard() != 0xfa) terminal_writestring("Disabling scanning failed\n"); - while (status_8042() & (1<<0)) - (void) read_8042(); } void set_scancode_set(uint8_t set) { + flush_buffer(); write_8042(0xf0); write_8042(set); if (read_keyboard() != 0xfa) terminal_writestring("Setting scancode set failed\n"); - while (status_8042() & (1<<0)) - (void) read_8042(); + flush_buffer(); } uint8_t get_scancode_set(void) { + flush_buffer(); write_8042(0xf0); write_8042(0); if (read_keyboard() != 0xfa) terminal_writestring("Getting scancode set failed\n"); uint8_t set; - while ( (set = read_keyboard()) == 0xfa ); + while ((set = read_keyboard()) == 0xfa); return set; } @@ -315,6 +318,7 @@ void print_key(uint8_t code) { void key_prompt(uint8_t expect) { enable_scanning(); terminal_writestring("Press A... "); + flush_buffer(); uint8_t code = read_keyboard(); if ( code == expect ) terminal_setcolor(vga_entry_color(VGA_COLOR_GREEN, VGA_COLOR_BLACK)); @@ -338,39 +342,54 @@ void kernel_main(void) init_8042(); terminal_writestring("Assuming keyboard is channel 1\n"); + terminal_setcolor(vga_entry_color(VGA_COLOR_BROWN, VGA_COLOR_BLACK)); + terminal_writestring("\nNOTE: "); + terminal_setcolor(vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK)); + terminal_writestring("If getting scancode set seems to hang, tap the 'A' key.\n"); + terminal_writestring("\nTranslation initially "); if (translation_initially) - terminal_writestring("on\n"); + terminal_writestring("on, scancode set initially set to... "); else - terminal_writestring("off\n"); + terminal_writestring("off, scancode set initially set to... "); + terminal_writehex(get_scancode_set()); + terminal_writestring("\n"); key_prompt(translation_initially ? KEY_A_SET1 : KEY_A_SET2); disable_translation(); - terminal_writestring("\nTranslation off, scancode set initially "); + terminal_writestring("\nTranslation off, scancode set initially set to... "); uint8_t initial_scancode = get_scancode_set(); terminal_writehex(initial_scancode); terminal_writestring("\n"); key_prompt(initial_scancode == 1 ? KEY_A_SET1 : KEY_A_SET2); + terminal_writestring("Translation off, trying set 1... "); set_scancode_set(1); - terminal_writestring("Translation off, trying set 1... scancode set set to "); + terminal_writestring("scancode set set to... "); terminal_writehex(get_scancode_set()); terminal_writestring("\n"); key_prompt(KEY_A_SET1); + terminal_writestring("Translation off, trying set 2... "); set_scancode_set(2); - terminal_writestring("Translation off, trying set 2... scancode set set to "); + terminal_writestring("scancode set set to... "); terminal_writehex(get_scancode_set()); terminal_writestring("\n"); key_prompt(KEY_A_SET2); - set_scancode_set(1); enable_translation(); - terminal_writestring("\nTranslation on, trying set 1\n"); + terminal_writestring("\nTranslation on, trying set 1... "); + set_scancode_set(1); + terminal_writestring("scancode set set to... "); + terminal_writehex(get_scancode_set()); + terminal_writestring("\n"); key_prompt(KEY_A_MISINTERPRET); + terminal_writestring("Translation on, trying set 2... "); set_scancode_set(2); - terminal_writestring("Translation on, trying set 2\n"); + terminal_writestring("scancode set set to... "); + terminal_writehex(get_scancode_set()); + terminal_writestring("\n"); key_prompt(KEY_A_SET1); terminal_writestring("\nHanging\n");