summaryrefslogtreecommitdiff
path: root/firmware/2lib/2ui.c
diff options
context:
space:
mode:
authorJoel Kitching <kitching@google.com>2020-05-20 15:17:11 +0800
committerCommit Bot <commit-bot@chromium.org>2020-05-27 06:23:01 +0000
commit155768764b9897447d1159cc7cc6791369ca2fc5 (patch)
tree5f44a98e29217d492ecbb43e59cf3820f9a99d63 /firmware/2lib/2ui.c
parent0b85f4d7a5ec41332a38d7d763d9a7bd38bdbfb6 (diff)
downloadvboot-155768764b9897447d1159cc7cc6791369ca2fc5.tar.gz
vboot/ui: stop centralizing keyboard input actions
BUG=b:146399181 TEST=make clean && make runtests BRANCH=none Change-Id: Ia63537fb13be5f04ae81a6be7e0fac6eaf47cfb7 Signed-off-by: Joel Kitching <kitching@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2210017 Reviewed-by: Hsuan Ting Chen <roccochen@chromium.org> Reviewed-by: Joel Kitching <kitching@chromium.org> Tested-by: Joel Kitching <kitching@chromium.org> Commit-Queue: Yu-Ping Wu <yupingso@chromium.org>
Diffstat (limited to 'firmware/2lib/2ui.c')
-rw-r--r--firmware/2lib/2ui.c145
1 files changed, 60 insertions, 85 deletions
diff --git a/firmware/2lib/2ui.c b/firmware/2lib/2ui.c
index b7a9cad7..c0b527b6 100644
--- a/firmware/2lib/2ui.c
+++ b/firmware/2lib/2ui.c
@@ -71,75 +71,40 @@ vb2_error_t check_shutdown_request(struct vb2_ui_context *ui)
}
/*****************************************************************************/
-/* Menu navigation actions */
+/* Menu navigation functions */
-/**
- * Context-dependent keyboard shortcut Ctrl+D.
- *
- * - Manual recovery mode: Change to dev mode transition screen.
- * - Developer mode: Boot from internal disk.
- */
-vb2_error_t ctrl_d_action(struct vb2_ui_context *ui)
+vb2_error_t menu_navigation_action(struct vb2_ui_context *ui)
{
- if (vb2_allow_recovery(ui->ctx))
- return change_to_dev_screen_action(ui);
- else if (ui->ctx->flags & VB2_CONTEXT_DEVELOPER_MODE)
- return vb2_ui_developer_mode_boot_internal_action(ui);
-
- return VB2_REQUEST_UI_CONTINUE;
-}
+ uint32_t key = ui->key;
+
+ /* Map detachable button presses for simplicity. */
+ if (DETACHABLE) {
+ if (key == VB_BUTTON_VOL_UP_SHORT_PRESS)
+ key = VB_KEY_UP;
+ else if (key == VB_BUTTON_VOL_DOWN_SHORT_PRESS)
+ key = VB_KEY_DOWN;
+ else if (key == VB_BUTTON_POWER_SHORT_PRESS)
+ key = VB_KEY_ENTER;
+ }
-vb2_error_t change_to_dev_screen_action(struct vb2_ui_context *ui)
-{
- if (vb2_allow_recovery(ui->ctx))
- return vb2_ui_change_screen(ui, VB2_SCREEN_RECOVERY_TO_DEV);
+ switch (key) {
+ case VB_KEY_UP:
+ return vb2_ui_menu_prev(ui);
+ case VB_KEY_DOWN:
+ return vb2_ui_menu_next(ui);
+ case VB_KEY_ENTER:
+ return vb2_ui_menu_select(ui);
+ case VB_KEY_ESC:
+ return vb2_ui_change_root(ui);
+ default:
+ if (key != 0)
+ VB2_DEBUG("Pressed key %#x, trusted? %d\n",
+ ui->key, ui->key_trusted);
+ }
return VB2_REQUEST_UI_CONTINUE;
}
-/*****************************************************************************/
-/* Action lookup tables */
-
-static struct input_action action_table[] = {
- /* Common navigation (keyboard) */
- { VB_KEY_UP, vb2_ui_menu_prev },
- { VB_KEY_DOWN, vb2_ui_menu_next },
- { VB_KEY_ENTER, vb2_ui_menu_select },
- { VB_KEY_ESC, vb2_ui_change_root },
-
- /* Common navigation (detachable) */
- { VB_BUTTON_VOL_UP_SHORT_PRESS, vb2_ui_menu_prev },
- { VB_BUTTON_VOL_DOWN_SHORT_PRESS, vb2_ui_menu_next },
- { VB_BUTTON_POWER_SHORT_PRESS, vb2_ui_menu_select },
-
- /* Context-specific: developer and recovery */
- { VB_KEY_CTRL('D'), ctrl_d_action },
-
- /* Context-specific: recovery mode */
- { VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS, change_to_dev_screen_action },
- { ' ', vb2_ui_recovery_to_dev_action },
-
- /* Context-specific: developer mode */
- { VB_KEY_CTRL('U'),
- vb2_ui_developer_mode_boot_external_action },
- { VB_BUTTON_VOL_UP_LONG_PRESS,
- vb2_ui_developer_mode_boot_external_action },
- { VB_BUTTON_VOL_DOWN_LONG_PRESS,
- vb2_ui_developer_mode_boot_internal_action },
-};
-
-vb2_error_t (*input_action_lookup(int key))(struct vb2_ui_context *ui)
-{
- int i;
- for (i = 0; i < ARRAY_SIZE(action_table); i++)
- if (action_table[i].key == key)
- return action_table[i].action;
- return NULL;
-}
-
-/*****************************************************************************/
-/* Menu navigation functions */
-
vb2_error_t vb2_ui_menu_prev(struct vb2_ui_context *ui)
{
int item;
@@ -243,7 +208,6 @@ vb2_error_t ui_loop(struct vb2_context *ctx, enum vb2_screen root_screen_id,
struct vb2_ui_context ui;
struct vb2_screen_state prev_state;
uint32_t key_flags;
- vb2_error_t (*action)(struct vb2_ui_context *ui);
vb2_error_t rv;
memset(&ui, 0, sizeof(ui));
@@ -272,37 +236,28 @@ vb2_error_t ui_loop(struct vb2_context *ctx, enum vb2_screen root_screen_id,
ui.state.disabled_item_mask);
}
- /* Run screen action. */
- if (ui.state.screen->action) {
- rv = ui.state.screen->action(&ui);
- if (rv != VB2_REQUEST_UI_CONTINUE)
- return rv;
- }
-
/* Grab new keyboard input. */
ui.key = VbExKeyboardReadWithFlags(&key_flags);
ui.key_trusted = !!(key_flags & VB_KEY_FLAG_TRUSTED_KEYBOARD);
/* Check for shutdown request. */
- if (check_shutdown_request(&ui) == VB2_REQUEST_SHUTDOWN) {
+ rv = check_shutdown_request(&ui);
+ if (rv != VB2_REQUEST_UI_CONTINUE) {
VB2_DEBUG("Shutdown requested!\n");
- return VB2_REQUEST_SHUTDOWN;
+ return rv;
}
- /* Run input action function if found. */
- action = input_action_lookup(ui.key);
- if (action) {
- rv = action(&ui);
+ /* Run screen action. */
+ if (ui.state.screen->action) {
+ rv = ui.state.screen->action(&ui);
if (rv != VB2_REQUEST_UI_CONTINUE)
return rv;
- } else if (ui.key) {
- VB2_DEBUG("Pressed key %#x, trusted? %d\n",
- ui.key, ui.key_trusted);
}
- /* Reset keyboard input. */
- ui.key = 0;
- ui.key_trusted = 0;
+ /* Run menu navigation action. */
+ rv = menu_navigation_action(&ui);
+ if (rv != VB2_REQUEST_UI_CONTINUE)
+ return rv;
/* Run global action function if available. */
if (global_action) {
@@ -323,7 +278,20 @@ vb2_error_t ui_loop(struct vb2_context *ctx, enum vb2_screen root_screen_id,
vb2_error_t vb2_developer_menu(struct vb2_context *ctx)
{
- return ui_loop(ctx, VB2_SCREEN_DEVELOPER_MODE, NULL);
+ return ui_loop(ctx, VB2_SCREEN_DEVELOPER_MODE, developer_action);
+}
+
+vb2_error_t developer_action(struct vb2_ui_context *ui)
+{
+ /* Developer mode keyboard shortcuts */
+ if (ui->key == VB_KEY_CTRL('U') ||
+ (DETACHABLE && ui->key == VB_BUTTON_VOL_UP_LONG_PRESS))
+ return vb2_ui_developer_mode_boot_external_action(ui);
+ if (ui->key == VB_KEY_CTRL('D') ||
+ (DETACHABLE && ui->key == VB_BUTTON_VOL_DOWN_LONG_PRESS))
+ return vb2_ui_developer_mode_boot_internal_action(ui);
+
+ return VB2_REQUEST_UI_CONTINUE;
}
/*****************************************************************************/
@@ -339,10 +307,10 @@ vb2_error_t vb2_broken_recovery_menu(struct vb2_context *ctx)
vb2_error_t vb2_manual_recovery_menu(struct vb2_context *ctx)
{
- return ui_loop(ctx, VB2_SCREEN_RECOVERY_SELECT, try_recovery_action);
+ return ui_loop(ctx, VB2_SCREEN_RECOVERY_SELECT, manual_recovery_action);
}
-vb2_error_t try_recovery_action(struct vb2_ui_context *ui)
+vb2_error_t manual_recovery_action(struct vb2_ui_context *ui)
{
/* See if we have a recovery kernel available yet. */
vb2_error_t rv = VbTryLoadKernel(ui->ctx, VB_DISK_FLAG_REMOVABLE);
@@ -351,6 +319,8 @@ vb2_error_t try_recovery_action(struct vb2_ui_context *ui)
/* If disk validity state changed, switch to appropriate screen. */
if (ui->recovery_rv != rv) {
+ VB2_DEBUG("Recovery VbTryLoadKernel %#x --> %#x\n",
+ ui->recovery_rv, rv);
ui->recovery_rv = rv;
return vb2_ui_change_screen(ui,
rv == VB2_ERROR_LK_NO_DISK_FOUND ?
@@ -358,5 +328,10 @@ vb2_error_t try_recovery_action(struct vb2_ui_context *ui)
VB2_SCREEN_RECOVERY_INVALID);
}
+ /* Manual recovery keyboard shortcuts */
+ if (ui->key == VB_KEY_CTRL('D') ||
+ (DETACHABLE && ui->key == VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS))
+ return vb2_ui_change_screen(ui, VB2_SCREEN_RECOVERY_TO_DEV);
+
return VB2_REQUEST_UI_CONTINUE;
}