Provide a unit test for the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Signed-off-by: Alexander Graf <agraf@suse.de>lime2-spi
parent
55fbdf9982
commit
3394f20021
@ -0,0 +1,139 @@ |
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* efi_selftest_textinput |
||||
* |
||||
* Copyright (c) 2018 Heinrich Schuchardt <xypron.glpk@gmx.de> |
||||
* |
||||
* Provides a unit test for the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL. |
||||
* The unicode character and the scan code are printed for text |
||||
* input. To run the test: |
||||
* |
||||
* setenv efi_selftest extended text input |
||||
* bootefi selftest |
||||
*/ |
||||
|
||||
#include <efi_selftest.h> |
||||
|
||||
static const efi_guid_t text_input_ex_protocol_guid = |
||||
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID; |
||||
|
||||
static struct efi_simple_text_input_ex_protocol *con_in_ex; |
||||
|
||||
static struct efi_boot_services *boottime; |
||||
|
||||
/*
|
||||
* Setup unit test. |
||||
* |
||||
* @handle: handle of the loaded image |
||||
* @systable: system table |
||||
* @return: EFI_ST_SUCCESS for success |
||||
*/ |
||||
static int setup(const efi_handle_t handle, |
||||
const struct efi_system_table *systable) |
||||
{ |
||||
efi_status_t ret; |
||||
|
||||
boottime = systable->boottime; |
||||
|
||||
ret = boottime->locate_protocol(&text_input_ex_protocol_guid, NULL, |
||||
(void **)&con_in_ex); |
||||
if (ret != EFI_SUCCESS) { |
||||
con_in_ex = NULL; |
||||
efi_st_error |
||||
("Extended text input protocol is not available.\n"); |
||||
return EFI_ST_FAILURE; |
||||
} |
||||
|
||||
return EFI_ST_SUCCESS; |
||||
} |
||||
|
||||
/*
|
||||
* Execute unit test. |
||||
* |
||||
* @return: EFI_ST_SUCCESS for success |
||||
*/ |
||||
static int execute(void) |
||||
{ |
||||
struct efi_key_data input_key = {0,}; |
||||
efi_status_t ret; |
||||
efi_uintn_t index; |
||||
|
||||
if (!con_in_ex) { |
||||
efi_st_printf("Setup failed\n"); |
||||
return EFI_ST_FAILURE; |
||||
} |
||||
|
||||
/* Drain the console input */ |
||||
ret = con_in_ex->reset(con_in_ex, true); |
||||
if (ret != EFI_SUCCESS) { |
||||
efi_st_error("Reset failed\n"); |
||||
return EFI_ST_FAILURE; |
||||
} |
||||
ret = con_in_ex->read_key_stroke_ex(con_in_ex, &input_key); |
||||
if (ret != EFI_NOT_READY) { |
||||
efi_st_error("Empty buffer not reported\n"); |
||||
return EFI_ST_FAILURE; |
||||
} |
||||
|
||||
efi_st_printf("Waiting for your input\n"); |
||||
efi_st_printf("To terminate type 'x'\n"); |
||||
|
||||
for (;;) { |
||||
/* Wait for next key */ |
||||
ret = boottime->wait_for_event(1, &con_in_ex->wait_for_key_ex, |
||||
&index); |
||||
if (ret != EFI_ST_SUCCESS) { |
||||
efi_st_error("WaitForEvent failed\n"); |
||||
return EFI_ST_FAILURE; |
||||
} |
||||
ret = con_in_ex->read_key_stroke_ex(con_in_ex, &input_key); |
||||
if (ret != EFI_SUCCESS) { |
||||
efi_st_error("ReadKeyStroke failed\n"); |
||||
return EFI_ST_FAILURE; |
||||
} |
||||
|
||||
/* Allow 5 minutes until time out */ |
||||
boottime->set_watchdog_timer(300, 0, 0, NULL); |
||||
|
||||
efi_st_printf("Unicode char %u (%ps), scan code %u (", |
||||
(unsigned int)input_key.key.unicode_char, |
||||
efi_st_translate_char(input_key.key.unicode_char), |
||||
(unsigned int)input_key.key.scan_code); |
||||
if (input_key.key_state.key_shift_state & |
||||
EFI_SHIFT_STATE_VALID) { |
||||
if (input_key.key_state.key_shift_state & |
||||
(EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED)) |
||||
efi_st_printf("SHIFT+"); |
||||
if (input_key.key_state.key_shift_state & |
||||
(EFI_LEFT_ALT_PRESSED | EFI_RIGHT_ALT_PRESSED)) |
||||
efi_st_printf("ALT+"); |
||||
if (input_key.key_state.key_shift_state & |
||||
(EFI_LEFT_CONTROL_PRESSED | |
||||
EFI_RIGHT_CONTROL_PRESSED)) |
||||
efi_st_printf("CTRL+"); |
||||
if (input_key.key_state.key_shift_state & |
||||
(EFI_LEFT_LOGO_PRESSED | EFI_RIGHT_LOGO_PRESSED)) |
||||
efi_st_printf("META+"); |
||||
if (input_key.key_state.key_shift_state == |
||||
EFI_SHIFT_STATE_VALID) |
||||
efi_st_printf("+"); |
||||
} |
||||
|
||||
efi_st_printf("%ps)\n", |
||||
efi_st_translate_code(input_key.key.scan_code)); |
||||
|
||||
switch (input_key.key.unicode_char) { |
||||
case 'x': |
||||
case 'X': |
||||
return EFI_ST_SUCCESS; |
||||
} |
||||
} |
||||
} |
||||
|
||||
EFI_UNIT_TEST(textinputex) = { |
||||
.name = "extended text input", |
||||
.phase = EFI_EXECUTE_BEFORE_BOOTTIME_EXIT, |
||||
.setup = setup, |
||||
.execute = execute, |
||||
.on_request = true, |
||||
}; |
Loading…
Reference in new issue