diff options
author | Nico Huber <nico.h@gmx.de> | 2020-11-08 14:04:39 +0100 |
---|---|---|
committer | Hung-Te Lin <hungte@chromium.org> | 2020-12-23 03:29:16 +0000 |
commit | 0e1d19baa6f1b1d2c11a7d9e548f70f7c1b7a50e (patch) | |
tree | 6a637fceefc16849d9eaf89b432726154d2269bb /payloads/libpayload/drivers/i8042 | |
parent | 683c95e4ab460f349a31379700fb5672991a2722 (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>
Diffstat (limited to 'payloads/libpayload/drivers/i8042')
-rw-r--r-- | payloads/libpayload/drivers/i8042/i8042.c | 52 |
1 files changed, 52 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); +} |