summaryrefslogtreecommitdiff
path: root/payloads
diff options
context:
space:
mode:
authorThejaswani Putta <thejaswani.putta@intel.corp-partner.google.com>2019-11-05 17:51:58 -0800
committerPatrick Georgi <pgeorgi@google.com>2019-11-16 20:44:34 +0000
commit3557f124586851ee89deccf91c66c9ea50f9ffd4 (patch)
tree4941323fb53a94b5a47761ecf0bf7fe478f8b8bb /payloads
parente477626d821f76fa846b9b7b99cfbcbf21eefc00 (diff)
downloadcoreboot-3557f124586851ee89deccf91c66c9ea50f9ffd4.tar.xz
libpayload: keyboard: Ignore special keys
Some special keys emit a prefix scan code 0xE0. We will ignore all these except for the power button, F12 and cursor keys on drallion. Media key mapping is set in depthcharge and will be sent to libpayload keyboard driver. Whichever board requires this change will update its own media key mapping. BUG:b:139511038 TEST=boot in recovery mode, press F12 to go to diagnostic mode and power button to confirm. Also in recovery mode left arrow, right arrow, up arrow, down arrow changes the language on the firmware screen. Change-Id: I1c11939d18391bebe53ca21cf33a096ba369cd56 Signed-off-by: Thejaswani Putta <thejaswani.putta@intel.corp-partner.google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/36654 Reviewed-by: EricR Lai <ericr_lai@compal.corp-partner.google.com> Reviewed-by: Mathew King <mathewk@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'payloads')
-rw-r--r--payloads/libpayload/drivers/i8042/keyboard.c11
-rw-r--r--payloads/libpayload/include/libpayload.h1
2 files changed, 12 insertions, 0 deletions
diff --git a/payloads/libpayload/drivers/i8042/keyboard.c b/payloads/libpayload/drivers/i8042/keyboard.c
index 48d35a07f7..f9932ed4ed 100644
--- a/payloads/libpayload/drivers/i8042/keyboard.c
+++ b/payloads/libpayload/drivers/i8042/keyboard.c
@@ -35,6 +35,7 @@
#include "i8042.h"
#define POWER_BUTTON 0x90
+#define MEDIA_KEY_PREFIX 0xE0
struct layout_maps {
const char *country;
@@ -43,6 +44,7 @@ struct layout_maps {
static struct layout_maps *map;
static int modifier = 0;
+int (*media_key_mapping_callback)(char ch);
static struct layout_maps keyboard_layouts[] = {
#if CONFIG(LP_PC_KEYBOARD_LAYOUT_US)
@@ -230,6 +232,11 @@ int keyboard_getmodifier(void)
return modifier;
}
+void initialize_keyboard_media_key_mapping_callback(int (*media_key_mapper)(char))
+{
+ media_key_mapping_callback = media_key_mapper;
+}
+
int keyboard_getchar(void)
{
unsigned char ch;
@@ -239,6 +246,10 @@ int keyboard_getchar(void)
while (!keyboard_havechar()) ;
ch = keyboard_get_scancode();
+ if ((media_key_mapping_callback != NULL) && (ch == MEDIA_KEY_PREFIX)) {
+ ch = keyboard_get_scancode();
+ return media_key_mapping_callback(ch);
+ }
if (!(ch & 0x80) && ch < 0x59) {
shift =
diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h
index 80bfaae6bf..bfe9da5f40 100644
--- a/payloads/libpayload/include/libpayload.h
+++ b/payloads/libpayload/include/libpayload.h
@@ -187,6 +187,7 @@ unsigned char keyboard_get_scancode(void);
int keyboard_getchar(void);
int keyboard_set_layout(char *country);
int keyboard_getmodifier(void);
+void initialize_keyboard_media_key_mapping_callback(int (*media_key_mapper)(char));
enum KEYBOARD_MODIFIERS {
KB_MOD_SHIFT = (1 << 0),