Get working on real HW and expand diagnostics

This commit is contained in:
Juhani Krekelä 2022-01-23 17:28:30 +02:00
parent 7b0cf9f2e7
commit df9d4e1a26
2 changed files with 38 additions and 17 deletions

View File

@ -1,3 +1,5 @@
set timeout=2
menuentry "ps2 kbtest" {
multiboot /boot/ps2-kbtest.kernel
}

View File

@ -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");