diff options
Diffstat (limited to 'src/pc80/keyboard.c')
-rw-r--r-- | src/pc80/keyboard.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/pc80/keyboard.c b/src/pc80/keyboard.c new file mode 100644 index 0000000000..9dc56b5698 --- /dev/null +++ b/src/pc80/keyboard.c @@ -0,0 +1,55 @@ +#ifndef lint +static char rcsid[] = "$Id$"; +#endif + +#include <arch/io.h> +#include <subr.h> +/* much better keyboard init courtesy ollie@sis.com.tw + TODO: Typematic Setting, the keyboard is too slow for me */ +void pc_keyboard_init() +{ + volatile unsigned char regval; + + /* send cmd = 0xAA, self test 8042 */ + outb(0xaa, 0x64); + + /* empty input buffer or any other command/data will be lost */ + while ((inb(0x64) & 0x02)) + post_code(0); + /* empty output buffer or any other command/data will be lost */ + while ((inb(0x64) & 0x01) == 0) + post_code(1); + + /* read self-test result, 0x55 should be returned form 0x60 */ + if ((regval = inb(0x60) != 0x55)) + return; + + /* enable keyboard interface */ + outb(0x60, 0x64); + while ((inb(0x64) & 0x02)) + post_code(2); + + /* send cmd: enable IRQ 1 */ + outb(0x61, 0x60); + while ((inb(0x64) & 0x02)) + post_code(3); + + /* reset kerboard and self test (keyboard side) */ + outb(0xff, 0x60); + + /* empty inut bufferm or any other command/data will be lost */ + while ((inb(0x64) & 0x02)) + post_code(4); + /* empty output buffer or any other command/data will be lost */ + while ((inb(0x64) & 0x01) == 0) + post_code(5); + + if ((regval = inb(0x60) != 0xfa)) + return; + + while ((inb(0x64) & 0x01) == 0) + post_code(6); + if ((regval = inb(0x60) != 0xaa)) + return; +} + |