[coreboot-gerrit] New patch to review for coreboot: libpayload-x86: Export keyboard modifiers
Patrick Rudolph (siro@das-labor.org)
gerrit at coreboot.org
Mon Mar 6 18:51:58 CET 2017
Patrick Rudolph (siro at das-labor.org) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/18601
-gerrit
commit 53b3e1d746947115714387cd2f892c4e2dacef57
Author: Patrick Rudolph <siro at das-labor.org>
Date: Sun Mar 5 17:29:18 2017 +0100
libpayload-x86: Export keyboard modifiers
Add function to get active keyboard modifiers.
Change-Id: Ifc7bd4aa86f20d67c5b542d0458b966e605c5499
Signed-off-by: Patrick Rudolph <siro at das-labor.org>
---
payloads/libpayload/drivers/i8042/keyboard.c | 64 ++++++++++++++--------------
payloads/libpayload/include/libpayload.h | 8 ++++
2 files changed, 41 insertions(+), 31 deletions(-)
diff --git a/payloads/libpayload/drivers/i8042/keyboard.c b/payloads/libpayload/drivers/i8042/keyboard.c
index a1531d5..2476984 100644
--- a/payloads/libpayload/drivers/i8042/keyboard.c
+++ b/payloads/libpayload/drivers/i8042/keyboard.c
@@ -41,6 +41,7 @@ struct layout_maps {
};
static struct layout_maps *map;
+static int modifier = 0;
static struct layout_maps keyboard_layouts[] = {
#if IS_ENABLED(CONFIG_LP_PC_KEYBOARD_LAYOUT_US)
@@ -158,11 +159,6 @@ static struct layout_maps keyboard_layouts[] = {
#endif
};
-#define MOD_SHIFT (1 << 0)
-#define MOD_CTRL (1 << 1)
-#define MOD_CAPSLOCK (1 << 2)
-#define MOD_ALT (1 << 3)
-
static unsigned char keyboard_cmd(unsigned char cmd)
{
i8042_write_input(cmd);
@@ -177,71 +173,77 @@ int keyboard_havechar(void)
unsigned char keyboard_get_scancode(void)
{
- return i8042_data_get_ps2();
-}
-
-int keyboard_getchar(void)
-{
- static int modifier = 0;
- unsigned char ch;
- int shift;
- int ret = 0;
-
- while (!keyboard_havechar()) ;
-
- ch = keyboard_get_scancode();
+ u8 ch = i8042_data_get_ps2();
switch (ch) {
case 0x36:
case 0x2a:
- modifier |= MOD_SHIFT;
+ modifier |= KB_MOD_SHIFT;
break;
case 0x80 | 0x36:
case 0x80 | 0x2a:
- modifier &= ~MOD_SHIFT;
+ modifier &= ~KB_MOD_SHIFT;
break;
case 0x38:
- modifier |= MOD_ALT;
+ modifier |= KB_MOD_ALT;
break;
case 0x80 | 0x38:
- modifier &= ~MOD_ALT;
+ modifier &= ~KB_MOD_ALT;
break;
case 0x1d:
- modifier |= MOD_CTRL;
+ modifier |= KB_MOD_CTRL;
break;
case 0x80 | 0x1d:
- modifier &= ~MOD_CTRL;
+ modifier &= ~KB_MOD_CTRL;
break;
case 0x3a:
- if (modifier & MOD_CAPSLOCK) {
- modifier &= ~MOD_CAPSLOCK;
+ if (modifier & KB_MOD_CAPSLOCK) {
+ modifier &= ~KB_MOD_CAPSLOCK;
if (keyboard_cmd(0xed))
keyboard_cmd(0 << 2);
} else {
- modifier |= MOD_CAPSLOCK;
+ modifier |= KB_MOD_CAPSLOCK;
if (keyboard_cmd(0xed))
keyboard_cmd(1 << 2);
}
break;
}
+ return ch;
+}
+
+int keyboard_getmodifier(void)
+{
+ return modifier;
+}
+
+int keyboard_getchar(void)
+{
+ unsigned char ch;
+ int shift;
+ int ret = 0;
+
+ while (!keyboard_havechar()) ;
+
+ ch = keyboard_get_scancode();
+
if (!(ch & 0x80) && ch < 0x57) {
shift =
- (modifier & MOD_SHIFT) ^ (modifier & MOD_CAPSLOCK) ? 1 : 0;
+ (modifier & KB_MOD_SHIFT) ^ (modifier & KB_MOD_CAPSLOCK) ? 1 : 0;
- if (modifier & MOD_ALT)
+ if (modifier & KB_MOD_ALT)
shift += 2;
ret = map->map[shift][ch];
- if (modifier & MOD_CTRL) {
+ if (modifier & KB_MOD_CTRL) {
switch (ret) {
case 'a' ... 'z':
ret &= 0x1f;
break;
case KEY_DC:
/* vulcan nerve pinch */
- if ((modifier & MOD_ALT) && reset_handler)
+ if ((modifier & KB_MOD_ALT) && reset_handler)
reset_handler();
default:
ret = 0;
diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h
index 27ec436..4dcc334 100644
--- a/payloads/libpayload/include/libpayload.h
+++ b/payloads/libpayload/include/libpayload.h
@@ -161,6 +161,14 @@ int keyboard_havechar(void);
unsigned char keyboard_get_scancode(void);
int keyboard_getchar(void);
int keyboard_set_layout(char *country);
+int keyboard_getmodifier(void);
+
+enum KEYBOARD_MODIFIERS {
+ KB_MOD_SHIFT = (1 << 0),
+ KB_MOD_ALT = (1 << 1),
+ KB_MOD_CTRL = (1 << 2),
+ KB_MOD_CAPSLOCK = (1 << 3),
+};
/** @} */
/**
More information about the coreboot-gerrit
mailing list