From e5a986e53969260a47678c508403b7d161ce04dd Mon Sep 17 00:00:00 2001 From: Martin Roth Date: Fri, 26 Jul 2013 16:31:21 -0600 Subject: [PATCH] Libpayload: Add keyboard-disble function. Add a function to disable and clear the keyboard controller. BUG=chrome-os-partner:20758 TEST=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. BRANCH=none 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 --- payloads/libpayload/drivers/keyboard.c | 20 ++++++++++++++++++++ payloads/libpayload/include/libpayload.h | 1 + 2 files changed, 21 insertions(+) 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);