Compare commits

..

No commits in common. "master" and "766fc0f052c2050b13fee6b39e79d82b8a3b8988" have entirely different histories.

2 changed files with 18 additions and 39 deletions

View File

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

View File

@ -178,18 +178,14 @@ 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
flush_buffer();
while (status_8042() & (1<<0))
(void) read_8042();
// Read configuration
uint8_t config = read_config_8042();
@ -266,36 +262,37 @@ 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");
flush_buffer();
while (status_8042() & (1<<0))
(void) read_8042();
}
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;
}
@ -307,7 +304,7 @@ void print_key(uint8_t code) {
switch (code) {
case KEY_A_SET1: terminal_writestring("Set 1 A"); break;
case KEY_A_SET2: terminal_writestring("Set 2 A"); break;
case KEY_A_MISINTERPRET: terminal_writestring("Set 1 A misinterpreted as set 2 2"); break;
case KEY_A_MISINTERPRET: terminal_writestring("Set 1 A misinterpreted as set 2 A"); break;
default:
terminal_writestring("Unknown byte ");
terminal_writehex(code);
@ -318,7 +315,6 @@ 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));
@ -342,54 +338,39 @@ 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, scancode set initially set to... ");
terminal_writestring("on\n");
else
terminal_writestring("off, scancode set initially set to... ");
terminal_writehex(get_scancode_set());
terminal_writestring("\n");
terminal_writestring("off\n");
key_prompt(translation_initially ? KEY_A_SET1 : KEY_A_SET2);
disable_translation();
terminal_writestring("\nTranslation off, scancode set initially set to... ");
terminal_writestring("\nTranslation off, scancode set initially ");
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("scancode set set to... ");
terminal_writestring("Translation off, trying set 1... 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("scancode set set to... ");
terminal_writestring("Translation off, trying set 2... scancode set set to ");
terminal_writehex(get_scancode_set());
terminal_writestring("\n");
key_prompt(KEY_A_SET2);
enable_translation();
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");
enable_translation();
terminal_writestring("\nTranslation on, trying set 1\n");
key_prompt(KEY_A_MISINTERPRET);
terminal_writestring("Translation on, trying set 2... ");
set_scancode_set(2);
terminal_writestring("scancode set set to... ");
terminal_writehex(get_scancode_set());
terminal_writestring("\n");
terminal_writestring("Translation on, trying set 2\n");
key_prompt(KEY_A_SET1);
terminal_writestring("\nHanging\n");