From 3ee59f7b313e41b8379c54f00bba2526f0d0d43b Mon Sep 17 00:00:00 2001 From: Martin Roth Date: Fri, 26 Jul 2013 16:31:21 -0600 Subject: [PATCH] Libpayload: Add keyboard-disable function. Add a function to disable and clear the keyboard controller. Verified Code flow in normal boot/S3 resume with print statements. Verified Keyboard was correctly disabled and flushed by booting to recovery mode screen while pressing keys on the integrated keyboard. Change-Id: I3e1f011c3436fee5ce10993c6c26a3c8597c6fca Signed-off-by: Martin Roth Reviewed-on: https://gerrit.chromium.org/gerrit/63627 Reviewed-by: Shawn Nematbakhsh Reviewed-by: Aaron Durbin Tested-by: Shawn Nematbakhsh Commit-Queue: Shawn Nematbakhsh Reviewed-on: http://review.coreboot.org/4395 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi --- payloads/libpayload/drivers/keyboard.c | 21 +++++++++++++++++++++ payloads/libpayload/include/libpayload.h | 1 + 2 files changed, 22 insertions(+) diff --git a/payloads/libpayload/drivers/keyboard.c b/payloads/libpayload/drivers/keyboard.c index e65f08534a..0175bc74d9 100644 --- a/payloads/libpayload/drivers/keyboard.c +++ b/payloads/libpayload/drivers/keyboard.c @@ -31,6 +31,8 @@ #include #include +#define I8042_CMD_DIS_KB 0xad + struct layout_maps { const char *country; const unsigned short map[4][0x57]; @@ -300,3 +302,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 8e03c0b5b5..10a4505c30 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);