diff --git a/payloads/libpayload/drivers/keyboard.c b/payloads/libpayload/drivers/keyboard.c index cfb4d0bf49..380f99ce21 100644 --- a/payloads/libpayload/drivers/keyboard.c +++ b/payloads/libpayload/drivers/keyboard.c @@ -33,6 +33,7 @@ #define I8042_CMD_READ_MODE 0x20 #define I8042_CMD_WRITE_MODE 0x60 +#define I8042_CMD_DIS_KB 0xad #define I8042_MODE_XLATE 0x40 @@ -352,3 +353,22 @@ void keyboard_init(void) console_add_input_driver(&cons); } +void keyboard_disconnect(void) +{ + /* If 0x64 returns 0xff, then we have no keyboard + * controller */ + if (inb(0x64) == 0xFF) + return; + + /* Empty keyboard buffer */ + while (keyboard_havechar()) + keyboard_getchar(); + + /* Send keyboard disconnect command */ + outb(I8042_CMD_DIS_KB, 0x64); + keyboard_wait_write(); + + /* Hand off with empty buffer */ + while (keyboard_havechar()) + keyboard_getchar(); +} diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h index 33af971c32..cd06717726 100644 --- a/payloads/libpayload/include/libpayload.h +++ b/payloads/libpayload/include/libpayload.h @@ -150,6 +150,7 @@ int add_reset_handler(void (*new_handler)(void)); * @{ */ void keyboard_init(void); +void keyboard_disconnect(void); int keyboard_havechar(void); unsigned char keyboard_get_scancode(void); int keyboard_getchar(void);