summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNico Huber <nico.h@gmx.de>2020-11-08 14:04:39 +0100
committerHung-Te Lin <hungte@chromium.org>2020-12-23 03:29:16 +0000
commit0e1d19baa6f1b1d2c11a7d9e548f70f7c1b7a50e (patch)
tree6a637fceefc16849d9eaf89b432726154d2269bb
parent683c95e4ab460f349a31379700fb5672991a2722 (diff)
libpayload/i8042: Add API to get/set kbd translation state
Change-Id: I49aa1c244cb60ea290df102f06f641c765f59fa5 Signed-off-by: Nico Huber <nico.h@gmx.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/47589 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Angel Pons <th3fanbus@gmail.com>
-rw-r--r--payloads/libpayload/drivers/i8042/i8042.c52
-rw-r--r--payloads/libpayload/include/libpayload.h3
2 files changed, 55 insertions, 0 deletions
diff --git a/payloads/libpayload/drivers/i8042/i8042.c b/payloads/libpayload/drivers/i8042/i8042.c
index 84bad55371..476139e2ea 100644
--- a/payloads/libpayload/drivers/i8042/i8042.c
+++ b/payloads/libpayload/drivers/i8042/i8042.c
@@ -28,6 +28,7 @@
#include <libpayload-config.h>
#include <libpayload.h>
+#include <stdbool.h>
#include <stddef.h>
#include "i8042.h"
@@ -319,6 +320,24 @@ void i8042_write_data(u8 data)
}
/**
+ * Send command & data to keyboard controller.
+ *
+ * @param cmd: The command to be sent.
+ * @param data: The data to be sent.
+ * Returns 0 on success, -1 on failure.
+ */
+static int i8042_cmd_with_data(const u8 cmd, const u8 data)
+{
+ const int ret = i8042_cmd(cmd);
+ if (ret != 0)
+ return ret;
+
+ i8042_write_data(data);
+
+ return ret;
+}
+
+/**
* Probe for keyboard controller data and queue it.
*/
static void i8042_data_poll(void)
@@ -408,3 +427,36 @@ int i8042_wait_read_aux(void)
return (retries <= 0) ? -1 : i8042_read_data_aux();
}
+
+/**
+ * Get the keyboard scancode translation state.
+ *
+ * Returns: -1 on timeout, 1 if the controller translates
+ * scancode set #2 to #1, and 0 if not.
+ */
+int i8042_get_kbd_translation(void)
+{
+ const int cfg = i8042_cmd_with_response(I8042_CMD_RD_CMD_BYTE);
+ if (cfg < 0)
+ return cfg;
+
+ return !!(cfg & I8042_CMD_BYTE_XLATE);
+}
+
+/**
+ * Sets the keyboard scancode translation state.
+ *
+ * Returns: -1 on timeout, 0 otherwise.
+ */
+int i8042_set_kbd_translation(const bool xlate)
+{
+ int cfg = i8042_cmd_with_response(I8042_CMD_RD_CMD_BYTE);
+ if (cfg < 0)
+ return cfg;
+
+ if (xlate)
+ cfg |= I8042_CMD_BYTE_XLATE;
+ else
+ cfg &= ~I8042_CMD_BYTE_XLATE;
+ return i8042_cmd_with_data(I8042_CMD_WR_CMD_BYTE, cfg);
+}
diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h
index f206fea2f9..371471ffae 100644
--- a/payloads/libpayload/include/libpayload.h
+++ b/payloads/libpayload/include/libpayload.h
@@ -238,6 +238,9 @@ u8 i8042_read_data_aux(void);
int i8042_wait_read_ps2(void);
int i8042_wait_read_aux(void);
+int i8042_get_kbd_translation(void);
+int i8042_set_kbd_translation(bool xlate);
+
/** @} */
/**