Compare commits
2 commits
766fc0f052
...
df9d4e1a26
Author | SHA1 | Date | |
---|---|---|---|
|
df9d4e1a26 | ||
|
7b0cf9f2e7 |
2 changed files with 39 additions and 18 deletions
2
grub.cfg
2
grub.cfg
|
@ -1,3 +1,5 @@
|
|||
set timeout=2
|
||||
|
||||
menuentry "ps2 kbtest" {
|
||||
multiboot /boot/ps2-kbtest.kernel
|
||||
}
|
||||
|
|
55
kernel.c
55
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;
|
||||
}
|
||||
|
||||
|
@ -304,7 +307,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 A"); break;
|
||||
case KEY_A_MISINTERPRET: terminal_writestring("Set 1 A misinterpreted as set 2 2"); break;
|
||||
default:
|
||||
terminal_writestring("Unknown byte ");
|
||||
terminal_writehex(code);
|
||||
|
@ -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");
|
||||
|
|
Loading…
Reference in a new issue