diff options
author | edisonhello <edisonhello@google.com> | 2021-09-02 17:55:15 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-09-14 08:03:19 +0000 |
commit | 1a7c57ce7fa5aa1c8cdc6bffffbfe3f8dbece664 (patch) | |
tree | d1597cec0e288f2ca31f9f3d8588d8bdb23c7e72 /firmware | |
parent | 3852f05c1cf9a0178ec5d16352d213e6ec2ab422 (diff) | |
download | vboot-1a7c57ce7fa5aa1c8cdc6bffffbfe3f8dbece664.tar.gz |
vboot/ui: Remove 2ui, 2ui_screens, and vb2_ui*_testsstabilize-rust-14225.Bstabilize-rust-14224.Bstabilize-rust-14220.B
Since all the screens and tests are already moved to depthcharge
in previous CLs, remove all internal UI functions and tests from
vboot.
BUG=b:172339016
TEST=DEBUG=1 make -j test_setup && make -j runtests
BRANCH=none
Signed-off-by: edisonhello <edisonhello@google.com>
Change-Id: Ifbd005a5761e5c354e010fc70487a63cd17cf4b3
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/3139540
Reviewed-by: Julius Werner <jwerner@chromium.org>
Reviewed-by: Yu-Ping Wu <yupingso@chromium.org>
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/2lib/2ui.c | 414 | ||||
-rw-r--r-- | firmware/2lib/2ui_screens.c | 523 | ||||
-rw-r--r-- | firmware/2lib/include/2ui.h | 231 | ||||
-rw-r--r-- | firmware/2lib/include/2ui_private.h | 43 |
4 files changed, 0 insertions, 1211 deletions
diff --git a/firmware/2lib/2ui.c b/firmware/2lib/2ui.c deleted file mode 100644 index 64680220..00000000 --- a/firmware/2lib/2ui.c +++ /dev/null @@ -1,414 +0,0 @@ -/* Copyright 2020 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - * - * User interfaces for developer and recovery mode menus. - */ - -#include "2api.h" -#include "2common.h" -#include "2misc.h" -#include "2nvstorage.h" -#include "2return_codes.h" -#include "2ui.h" -#include "2ui_private.h" -#include "vboot_api.h" /* For VB_SHUTDOWN_REQUEST_POWER_BUTTON */ - -/*****************************************************************************/ -/* Utility functions */ - -/** - * Check GBB flags against VbExIsShutdownRequested() shutdown request, - * and check for VB_BUTTON_POWER_SHORT_PRESS key, to determine if a - * shutdown is required. - * - * @param ui UI context pointer - * @return VB2_REQUEST_SHUTDOWN if shutdown needed, or VB2_SUCCESS - */ -vb2_error_t vb2_check_shutdown_request(struct vb2_ui_context *ui) -{ - uint32_t shutdown_request = VbExIsShutdownRequested(); - - /* - * Ignore power button push until after we have seen it released. - * This avoids shutting down immediately if the power button is still - * being held on startup. After we've recognized a valid power button - * push then don't report the event until after the button is released. - */ - if (shutdown_request & VB_SHUTDOWN_REQUEST_POWER_BUTTON) { - shutdown_request &= ~VB_SHUTDOWN_REQUEST_POWER_BUTTON; - if (ui->power_button == VB2_POWER_BUTTON_RELEASED) - ui->power_button = VB2_POWER_BUTTON_PRESSED; - } else { - if (ui->power_button == VB2_POWER_BUTTON_PRESSED) - shutdown_request |= VB_SHUTDOWN_REQUEST_POWER_BUTTON; - ui->power_button = VB2_POWER_BUTTON_RELEASED; - } - - if (ui->key == VB_BUTTON_POWER_SHORT_PRESS) - shutdown_request |= VB_SHUTDOWN_REQUEST_POWER_BUTTON; - - /* If desired, ignore shutdown request due to lid closure. */ - if (vb2api_gbb_get_flags(ui->ctx) & VB2_GBB_FLAG_DISABLE_LID_SHUTDOWN) - shutdown_request &= ~VB_SHUTDOWN_REQUEST_LID_CLOSED; - - /* - * In detachables, disable shutdown due to power button. - * It is used for menu selection instead. - */ - if (DETACHABLE) - shutdown_request &= ~VB_SHUTDOWN_REQUEST_POWER_BUTTON; - - if (shutdown_request) - return VB2_REQUEST_SHUTDOWN; - - return VB2_SUCCESS; -} - -/*****************************************************************************/ -/* Error action functions */ - -vb2_error_t vb2_error_exit_action(struct vb2_ui_context *ui) -{ - /* - * If an error message is currently shown on the screen, any - * key press clears that error. Unset the key so that it is - * not processed by other action functions. - */ - if (ui->key && ui->error_code) { - ui->error_code = VB2_UI_ERROR_NONE; - ui->key = 0; - } - return VB2_SUCCESS; -} - -/*****************************************************************************/ -/* Menu navigation functions */ - -const struct vb2_menu *vb2_get_menu(struct vb2_ui_context *ui) -{ - const struct vb2_menu *menu; - static const struct vb2_menu empty_menu = { - .num_items = 0, - .items = NULL, - }; - if (ui->state->screen->get_menu) { - menu = ui->state->screen->get_menu(ui); - return menu ? menu : &empty_menu; - } else { - return &ui->state->screen->menu; - } -} - -vb2_error_t vb2_menu_navigation_action(struct vb2_ui_context *ui) -{ - 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; - } - - 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_screen_back(ui); - default: - if (key != 0) - VB2_DEBUG("Pressed key %#x, trusted? %d\n", - ui->key, ui->key_trusted); - } - - return VB2_SUCCESS; -} - -vb2_error_t vb2_ui_menu_prev(struct vb2_ui_context *ui) -{ - int item; - - if (!DETACHABLE && ui->key == VB_BUTTON_VOL_UP_SHORT_PRESS) - return VB2_SUCCESS; - - item = ui->state->selected_item - 1; - while (item >= 0 && VB2_GET_BIT(ui->state->hidden_item_mask, item)) - item--; - /* Only update if item is valid */ - if (item >= 0) - ui->state->selected_item = item; - - return VB2_SUCCESS; -} - -vb2_error_t vb2_ui_menu_next(struct vb2_ui_context *ui) -{ - int item; - const struct vb2_menu *menu; - - if (!DETACHABLE && ui->key == VB_BUTTON_VOL_DOWN_SHORT_PRESS) - return VB2_SUCCESS; - - menu = vb2_get_menu(ui); - item = ui->state->selected_item + 1; - while (item < menu->num_items && - VB2_GET_BIT(ui->state->hidden_item_mask, item)) - item++; - /* Only update if item is valid */ - if (item < menu->num_items) - ui->state->selected_item = item; - - return VB2_SUCCESS; -} - -vb2_error_t vb2_ui_menu_select(struct vb2_ui_context *ui) -{ - const struct vb2_menu *menu; - const struct vb2_menu_item *menu_item; - - if (!DETACHABLE && ui->key == VB_BUTTON_POWER_SHORT_PRESS) - return VB2_SUCCESS; - - menu = vb2_get_menu(ui); - if (menu->num_items == 0) - return VB2_SUCCESS; - - menu_item = &menu->items[ui->state->selected_item]; - - /* Cannot select a disabled menu item */ - if (VB2_GET_BIT(ui->state->disabled_item_mask, - ui->state->selected_item)) { - VB2_DEBUG("Menu item <%s> disabled; ignoring\n", - menu_item->text); - return VB2_SUCCESS; - } - - if (menu_item->action) { - VB2_DEBUG("Menu item <%s> run action\n", menu_item->text); - return menu_item->action(ui); - } else if (menu_item->target) { - VB2_DEBUG("Menu item <%s> to target screen %#x\n", - menu_item->text, menu_item->target); - return vb2_ui_screen_change(ui, menu_item->target); - } - - VB2_DEBUG("Menu item <%s> no action or target screen\n", - menu_item->text); - return VB2_SUCCESS; -} - -/*****************************************************************************/ -/* Screen navigation functions */ - -vb2_error_t vb2_ui_screen_back(struct vb2_ui_context *ui) -{ - struct vb2_screen_state *tmp; - - if (ui->state && ui->state->prev) { - tmp = ui->state->prev; - free(ui->state); - ui->state = tmp; - if (ui->state->screen->reinit) - VB2_TRY(ui->state->screen->reinit(ui)); - } else { - VB2_DEBUG("ERROR: No previous screen; ignoring\n"); - } - - return VB2_REQUEST_UI_CONTINUE; -} - -static vb2_error_t default_screen_init(struct vb2_ui_context *ui) -{ - const struct vb2_menu *menu = vb2_get_menu(ui); - ui->state->selected_item = 0; - if (menu->num_items > 1 && menu->items[0].is_language_select) - ui->state->selected_item = 1; - return VB2_SUCCESS; -} - -vb2_error_t vb2_ui_screen_change(struct vb2_ui_context *ui, enum vb2_screen id) -{ - const struct vb2_screen_info *new_screen_info; - struct vb2_screen_state *cur_state; - int state_exists = 0; - - new_screen_info = vb2_get_screen_info(id); - if (new_screen_info == NULL) { - VB2_DEBUG("ERROR: Screen entry %#x not found; ignoring\n", id); - return VB2_REQUEST_UI_CONTINUE; - } - - /* Check to see if the screen state already exists in our stack. */ - cur_state = ui->state; - while (cur_state != NULL) { - if (cur_state->screen->id == id) { - state_exists = 1; - break; - } - cur_state = cur_state->prev; - } - - if (state_exists) { - /* Pop until the requested screen is at the top of stack. */ - while (ui->state->screen->id != id) { - cur_state = ui->state; - ui->state = cur_state->prev; - free(cur_state); - } - if (ui->state->screen->reinit) - VB2_TRY(ui->state->screen->reinit(ui)); - } else { - /* Allocate the requested screen on top of the stack. */ - cur_state = malloc(sizeof(*ui->state)); - if (cur_state == NULL) { - VB2_DEBUG("WARNING: malloc failed; ignoring\n"); - return VB2_REQUEST_UI_CONTINUE; - } - memset(cur_state, 0, sizeof(*ui->state)); - cur_state->prev = ui->state; - cur_state->screen = new_screen_info; - ui->state = cur_state; - if (ui->state->screen->init) - VB2_TRY(ui->state->screen->init(ui)); - else - VB2_TRY(default_screen_init(ui)); - } - - return VB2_REQUEST_UI_CONTINUE; -} - -/*****************************************************************************/ -/* Core UI loop */ - -static vb2_error_t ui_loop_impl( - struct vb2_context *ctx, enum vb2_screen root_screen_id, - vb2_error_t (*global_action)(struct vb2_ui_context *ui)) -{ - struct vb2_ui_context ui; - struct vb2_screen_state prev_state; - int prev_disable_timer; - enum vb2_ui_error prev_error_code; - const struct vb2_menu *menu; - const struct vb2_screen_info *root_info; - uint32_t key_flags; - uint32_t start_time_ms, elapsed_ms; - vb2_error_t rv; - - memset(&ui, 0, sizeof(ui)); - ui.ctx = ctx; - root_info = vb2_get_screen_info(root_screen_id); - if (root_info == NULL) - VB2_DIE("Root screen not found.\n"); - ui.locale_id = vb2api_get_locale_id(ctx); - - rv = vb2_ui_screen_change(&ui, root_screen_id); - if (rv && rv != VB2_REQUEST_UI_CONTINUE) - return rv; - - memset(&prev_state, 0, sizeof(prev_state)); - prev_disable_timer = 0; - prev_error_code = VB2_UI_ERROR_NONE; - - while (1) { - start_time_ms = vb2ex_mtime(); - - /* Draw if there are state changes. */ - if (memcmp(&prev_state, ui.state, sizeof(*ui.state)) || - /* Redraw when timer is disabled. */ - prev_disable_timer != ui.disable_timer || - /* Redraw/beep on a transition. */ - prev_error_code != ui.error_code || - /* Beep. */ - ui.error_beep != 0 || - /* Redraw on a screen request to refresh. */ - ui.force_display) { - - menu = vb2_get_menu(&ui); - VB2_DEBUG("<%s> menu item <%s>\n", - ui.state->screen->name, - menu->num_items ? - menu->items[ui.state->selected_item].text : - "null"); - vb2ex_display_ui(ui.state->screen->id, ui.locale_id, - ui.state->selected_item, - ui.state->disabled_item_mask, - ui.state->hidden_item_mask, - ui.disable_timer, - ui.state->current_page, - ui.error_code); - if (ui.error_beep || - (ui.error_code && - prev_error_code != ui.error_code)) { - vb2ex_beep(250, 400); - ui.error_beep = 0; - } - - /* Reset refresh flag. */ - ui.force_display = 0; - - /* Update prev variables. */ - memcpy(&prev_state, ui.state, sizeof(*ui.state)); - prev_disable_timer = ui.disable_timer; - prev_error_code = ui.error_code; - } - - /* Grab new keyboard input. */ - ui.key = VbExKeyboardReadWithFlags(&key_flags); - ui.key_trusted = !!(key_flags & VB_KEY_FLAG_TRUSTED_KEYBOARD); - - /* Check for shutdown request. */ - rv = vb2_check_shutdown_request(&ui); - if (rv && rv != VB2_REQUEST_UI_CONTINUE) { - VB2_DEBUG("Shutdown requested!\n"); - return rv; - } - - /* Check if we need to exit an error box. */ - rv = vb2_error_exit_action(&ui); - if (rv && rv != VB2_REQUEST_UI_CONTINUE) - return rv; - - /* Run screen action. */ - if (ui.state->screen->action) { - rv = ui.state->screen->action(&ui); - if (rv && rv != VB2_REQUEST_UI_CONTINUE) - return rv; - } - - /* Run menu navigation action. */ - rv = vb2_menu_navigation_action(&ui); - if (rv && rv != VB2_REQUEST_UI_CONTINUE) - return rv; - - /* Run global action function if available. */ - if (global_action) { - rv = global_action(&ui); - if (rv && rv != VB2_REQUEST_UI_CONTINUE) - return rv; - } - - /* Delay. */ - elapsed_ms = vb2ex_mtime() - start_time_ms; - if (elapsed_ms < KEY_DELAY_MS) - vb2ex_msleep(KEY_DELAY_MS - elapsed_ms); - } - - return VB2_SUCCESS; -} - -vb2_error_t vb2_ui_loop(struct vb2_context *ctx, enum vb2_screen root_screen_id, - vb2_error_t (*global_action)(struct vb2_ui_context *ui)) -{ - vb2_error_t rv = ui_loop_impl(ctx, root_screen_id, global_action); - if (rv == VB2_REQUEST_UI_EXIT) - return VB2_SUCCESS; - return rv; -} diff --git a/firmware/2lib/2ui_screens.c b/firmware/2lib/2ui_screens.c deleted file mode 100644 index 3a8e0b60..00000000 --- a/firmware/2lib/2ui_screens.c +++ /dev/null @@ -1,523 +0,0 @@ -/* Copyright 2020 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - * - * Firmware screen definitions. - */ - -#include "2api.h" -#include "2common.h" -#include "2misc.h" -#include "2nvstorage.h" -#include "2ui.h" -#include "2ui_private.h" -#include "vboot_api.h" - -#define MENU_ITEMS(a) ((struct vb2_menu){ \ - .num_items = ARRAY_SIZE(a), \ - .items = a, \ -}) - -#define LANGUAGE_SELECT_ITEM ((struct vb2_menu_item){ \ - .text = "Language selection", \ - .target = VB2_SCREEN_LANGUAGE_SELECT, \ - .is_language_select = 1, \ -}) - -#define NEXT_ITEM(target_screen) ((struct vb2_menu_item){ \ - .text = "Next", \ - .target = (target_screen), \ -}) - -#define BACK_ITEM ((struct vb2_menu_item){ \ - .text = "Back", \ - .action = vb2_ui_screen_back, \ -}) - -#define ADVANCED_OPTIONS_ITEM ((struct vb2_menu_item){ \ - .text = "Advanced options", \ - .target = VB2_SCREEN_ADVANCED_OPTIONS, \ -}) - -/* Action that will power off the device. */ -static vb2_error_t power_off_action(struct vb2_ui_context *ui) -{ - return VB2_REQUEST_SHUTDOWN; -} - -#define POWER_OFF_ITEM ((struct vb2_menu_item){ \ - .text = "Power off", \ - .action = power_off_action, \ -}) - -/******************************************************************************/ -/* - * Functions for ui error handling - */ - -static vb2_error_t set_ui_error(struct vb2_ui_context *ui, - enum vb2_ui_error error_code) -{ - /* Keep the first occurring error. */ - if (ui->error_code) - VB2_DEBUG("When handling ui error %#x, another ui error " - "occurred: %#x", - ui->error_code, error_code); - else - ui->error_code = error_code; - /* Return to the ui loop to show the error code. */ - return VB2_REQUEST_UI_CONTINUE; -} - -static vb2_error_t set_ui_error_and_go_back(struct vb2_ui_context *ui, - enum vb2_ui_error error_code) -{ - set_ui_error(ui, error_code); - return vb2_ui_screen_back(ui); -} - -/******************************************************************************/ -/* - * Functions used for log screens - * - * Expects that the page_count is valid and page_up_item and page_down_item are - * assigned to correct menu item indices in all three functions, the - * current_page is valid in prev and next actions, and the back_item is assigned - * to a correct menu item index. - */ - -static vb2_error_t log_page_update(struct vb2_ui_context *ui, - const char *new_log_string) -{ - const struct vb2_screen_info *screen = ui->state->screen; - - if (new_log_string) { - ui->state->page_count = vb2ex_prepare_log_screen( - screen->id, ui->locale_id, new_log_string); - if (ui->state->page_count == 0) { - VB2_DEBUG("vb2ex_prepare_log_screen failed\n"); - return VB2_ERROR_UI_LOG_INIT; - } - if (ui->state->current_page >= ui->state->page_count) - ui->state->current_page = ui->state->page_count - 1; - ui->force_display = 1; - } - VB2_CLR_BIT(ui->state->disabled_item_mask, screen->page_up_item); - VB2_CLR_BIT(ui->state->disabled_item_mask, screen->page_down_item); - if (ui->state->current_page == 0) - VB2_SET_BIT(ui->state->disabled_item_mask, - screen->page_up_item); - if (ui->state->current_page == ui->state->page_count - 1) - VB2_SET_BIT(ui->state->disabled_item_mask, - screen->page_down_item); - - return VB2_SUCCESS; -} - -static vb2_error_t log_page_reset_to_top(struct vb2_ui_context *ui) -{ - const struct vb2_screen_info *screen = ui->state->screen; - - ui->state->current_page = 0; - ui->state->selected_item = ui->state->page_count > 1 - ? screen->page_down_item - : screen->back_item; - return log_page_update(ui, NULL); -} - -static vb2_error_t log_page_prev_action(struct vb2_ui_context *ui) -{ - /* Validity check. */ - if (ui->state->current_page == 0) - return VB2_SUCCESS; - - ui->state->current_page--; - return log_page_update(ui, NULL); -} - -static vb2_error_t log_page_next_action(struct vb2_ui_context *ui) -{ - /* Validity check. */ - if (ui->state->current_page == ui->state->page_count - 1) - return VB2_SUCCESS; - - ui->state->current_page++; - return log_page_update(ui, NULL); -} - -#define PAGE_UP_ITEM ((struct vb2_menu_item){ \ - .text = "Page up", \ - .action = log_page_prev_action, \ -}) - -#define PAGE_DOWN_ITEM ((struct vb2_menu_item){ \ - .text = "Page down", \ - .action = log_page_next_action, \ -}) - -/******************************************************************************/ -/* VB2_SCREEN_LANGUAGE_SELECT */ - -static vb2_error_t language_select_action(struct vb2_ui_context *ui) -{ - vb2_error_t rv; - ui->locale_id = ui->state->selected_item; - VB2_DEBUG("Locale changed to %u\n", ui->locale_id); - - /* Write locale id back to nvdata. */ - vb2api_set_locale_id(ui->ctx, ui->locale_id); - - /* Commit nvdata changes immediately, in case of three-finger salute - reboot. Ignore commit errors in recovery mode. */ - rv = vb2ex_commit_data(ui->ctx); - if (rv && !(ui->ctx->flags & VB2_CONTEXT_RECOVERY_MODE)) - return rv; - - return vb2_ui_screen_back(ui); -} - -const struct vb2_menu *vb2_get_language_menu(struct vb2_ui_context *ui) -{ - int i; - uint32_t num_locales; - struct vb2_menu_item *items; - - if (ui->language_menu.num_items > 0) - return &ui->language_menu; - - num_locales = vb2ex_get_locale_count(); - if (num_locales == 0) { - VB2_DEBUG("WARNING: No locales available; assuming 1 locale\n"); - num_locales = 1; - } - - items = malloc(num_locales * sizeof(struct vb2_menu_item)); - if (!items) { - VB2_DEBUG("ERROR: malloc failed for language items\n"); - return NULL; - } - - for (i = 0; i < num_locales; i++) { - items[i].text = "Some language"; - items[i].action = language_select_action; - } - - ui->language_menu.num_items = num_locales; - ui->language_menu.items = items; - return &ui->language_menu; -} - -static vb2_error_t language_select_init(struct vb2_ui_context *ui) -{ - const struct vb2_menu *menu = vb2_get_menu(ui); - if (menu->num_items == 0) { - VB2_DEBUG("ERROR: No menu items found; " - "rejecting entering language selection screen\n"); - return vb2_ui_screen_back(ui); - } - if (ui->locale_id < menu->num_items) { - ui->state->selected_item = ui->locale_id; - } else { - VB2_DEBUG("WARNING: Current locale not found in menu items; " - "initializing selected_item to 0\n"); - ui->state->selected_item = 0; - } - return VB2_SUCCESS; -} - -static const struct vb2_screen_info language_select_screen = { - .id = VB2_SCREEN_LANGUAGE_SELECT, - .name = "Language selection screen", - .init = language_select_init, - .get_menu = vb2_get_language_menu, -}; - -/******************************************************************************/ -/* VB2_SCREEN_ADVANCED_OPTIONS */ - -#define ADVANCED_OPTIONS_ITEM_DEVELOPER_MODE 1 -#define ADVANCED_OPTIONS_ITEM_DEBUG_INFO 2 - -vb2_error_t vb2_advanced_options_init(struct vb2_ui_context *ui) -{ - ui->state->selected_item = ADVANCED_OPTIONS_ITEM_DEVELOPER_MODE; - if (vb2_get_sd(ui->ctx)->flags & VB2_SD_FLAG_DEV_MODE_ENABLED || - !vb2api_allow_recovery(ui->ctx)) { - VB2_SET_BIT(ui->state->hidden_item_mask, - ADVANCED_OPTIONS_ITEM_DEVELOPER_MODE); - ui->state->selected_item = ADVANCED_OPTIONS_ITEM_DEBUG_INFO; - } - - return VB2_SUCCESS; -} - -static const struct vb2_menu_item advanced_options_items[] = { - LANGUAGE_SELECT_ITEM, - [ADVANCED_OPTIONS_ITEM_DEVELOPER_MODE] = { - .text = "Enable developer mode", - .target = VB2_SCREEN_RECOVERY_TO_DEV, - }, - [ADVANCED_OPTIONS_ITEM_DEBUG_INFO] = { - .text = "Debug info", - .target = VB2_SCREEN_DEBUG_INFO, - }, - { - .text = "Firmware log", - .target = VB2_SCREEN_FIRMWARE_LOG, - }, - BACK_ITEM, - POWER_OFF_ITEM, -}; - -static const struct vb2_screen_info advanced_options_screen = { - .id = VB2_SCREEN_ADVANCED_OPTIONS, - .name = "Advanced options", - .init = vb2_advanced_options_init, - .menu = MENU_ITEMS(advanced_options_items), -}; - -/******************************************************************************/ -/* VB2_SCREEN_DEBUG_INFO */ - -#define DEBUG_INFO_ITEM_PAGE_UP 1 -#define DEBUG_INFO_ITEM_PAGE_DOWN 2 -#define DEBUG_INFO_ITEM_BACK 3 - -static vb2_error_t debug_info_set_content(struct vb2_ui_context *ui) -{ - const char *log_string = vb2ex_get_debug_info(ui->ctx); - if (!log_string) - return set_ui_error_and_go_back(ui, VB2_UI_ERROR_DEBUG_LOG); - if (vb2_is_error(log_page_update(ui, log_string))) - return set_ui_error_and_go_back(ui, VB2_UI_ERROR_DEBUG_LOG); - return VB2_SUCCESS; -} - -static vb2_error_t debug_info_init(struct vb2_ui_context *ui) -{ - VB2_TRY(debug_info_set_content(ui)); - if (vb2_is_error(log_page_reset_to_top(ui))) - return set_ui_error_and_go_back(ui, VB2_UI_ERROR_DEBUG_LOG); - return VB2_SUCCESS; -} - -static vb2_error_t debug_info_reinit(struct vb2_ui_context *ui) -{ - return debug_info_set_content(ui); -} - -static const struct vb2_menu_item debug_info_items[] = { - LANGUAGE_SELECT_ITEM, - [DEBUG_INFO_ITEM_PAGE_UP] = PAGE_UP_ITEM, - [DEBUG_INFO_ITEM_PAGE_DOWN] = PAGE_DOWN_ITEM, - [DEBUG_INFO_ITEM_BACK] = BACK_ITEM, - POWER_OFF_ITEM, -}; - -static const struct vb2_screen_info debug_info_screen = { - .id = VB2_SCREEN_DEBUG_INFO, - .name = "Debug info", - .init = debug_info_init, - .reinit = debug_info_reinit, - .menu = MENU_ITEMS(debug_info_items), - .page_up_item = DEBUG_INFO_ITEM_PAGE_UP, - .page_down_item = DEBUG_INFO_ITEM_PAGE_DOWN, - .back_item = DEBUG_INFO_ITEM_BACK, -}; - -/******************************************************************************/ -/* VB2_SCREEN_FIRMWARE_LOG */ - -#define FIRMWARE_LOG_ITEM_PAGE_UP 1 -#define FIRMWARE_LOG_ITEM_PAGE_DOWN 2 -#define FIRMWARE_LOG_ITEM_BACK 3 - -static vb2_error_t firmware_log_set_content(struct vb2_ui_context *ui, - int reset) -{ - const char *log_string = vb2ex_get_firmware_log(reset); - if (!log_string) - return set_ui_error_and_go_back(ui, VB2_UI_ERROR_FIRMWARE_LOG); - if (vb2_is_error(log_page_update(ui, log_string))) - return set_ui_error_and_go_back(ui, VB2_UI_ERROR_FIRMWARE_LOG); - return VB2_SUCCESS; -} - -static vb2_error_t firmware_log_init(struct vb2_ui_context *ui) -{ - VB2_TRY(firmware_log_set_content(ui, 1)); - if (vb2_is_error(log_page_reset_to_top(ui))) - return set_ui_error_and_go_back(ui, VB2_UI_ERROR_FIRMWARE_LOG); - return VB2_SUCCESS; -} - -static vb2_error_t firmware_log_reinit(struct vb2_ui_context *ui) -{ - return firmware_log_set_content(ui, 0); -} - -static const struct vb2_menu_item firmware_log_items[] = { - LANGUAGE_SELECT_ITEM, - [FIRMWARE_LOG_ITEM_PAGE_UP] = PAGE_UP_ITEM, - [FIRMWARE_LOG_ITEM_PAGE_DOWN] = PAGE_DOWN_ITEM, - [FIRMWARE_LOG_ITEM_BACK] = BACK_ITEM, - POWER_OFF_ITEM, -}; - -static const struct vb2_screen_info firmware_log_screen = { - .id = VB2_SCREEN_FIRMWARE_LOG, - .name = "Firmware log", - .init = firmware_log_init, - .reinit = firmware_log_reinit, - .menu = MENU_ITEMS(firmware_log_items), - .page_up_item = FIRMWARE_LOG_ITEM_PAGE_UP, - .page_down_item = FIRMWARE_LOG_ITEM_PAGE_DOWN, - .back_item = FIRMWARE_LOG_ITEM_BACK, -}; - -/******************************************************************************/ -/* VB2_SCREEN_RECOVERY_TO_DEV */ - -#define RECOVERY_TO_DEV_ITEM_CONFIRM 1 -#define RECOVERY_TO_DEV_ITEM_CANCEL 2 - -vb2_error_t recovery_to_dev_init(struct vb2_ui_context *ui) -{ - if (vb2_get_sd(ui->ctx)->flags & VB2_SD_FLAG_DEV_MODE_ENABLED) - /* We're in dev mode, so let user know they can't transition */ - return set_ui_error_and_go_back( - ui, VB2_UI_ERROR_DEV_MODE_ALREADY_ENABLED); - - if (!PHYSICAL_PRESENCE_KEYBOARD && vb2ex_physical_presence_pressed()) { - VB2_DEBUG("Presence button stuck?\n"); - return vb2_ui_screen_back(ui); - } - - ui->state->selected_item = RECOVERY_TO_DEV_ITEM_CONFIRM; - - /* Disable "Confirm" button for other physical presence types. */ - if (!PHYSICAL_PRESENCE_KEYBOARD) { - VB2_SET_BIT(ui->state->hidden_item_mask, - RECOVERY_TO_DEV_ITEM_CONFIRM); - ui->state->selected_item = RECOVERY_TO_DEV_ITEM_CANCEL; - } - - ui->physical_presence_button_pressed = 0; - - return VB2_SUCCESS; -} - -static vb2_error_t recovery_to_dev_finalize(struct vb2_ui_context *ui) -{ - VB2_DEBUG("Physical presence confirmed!\n"); - - /* Validity check, should never happen. */ - if (ui->state->screen->id != VB2_SCREEN_RECOVERY_TO_DEV || - (vb2_get_sd(ui->ctx)->flags & VB2_SD_FLAG_DEV_MODE_ENABLED) || - !vb2api_allow_recovery(ui->ctx)) { - VB2_DEBUG("ERROR: Dev transition validity check failed\n"); - return VB2_SUCCESS; - } - - VB2_DEBUG("Enabling dev mode and rebooting...\n"); - - if (vb2api_enable_developer_mode(ui->ctx) != VB2_SUCCESS) { - VB2_DEBUG("Enable developer mode failed\n"); - return VB2_SUCCESS; - } - - return VB2_REQUEST_REBOOT_EC_TO_RO; -} - -vb2_error_t recovery_to_dev_confirm_action(struct vb2_ui_context *ui) -{ - if (!ui->key_trusted) { - VB2_DEBUG("Reject untrusted %s confirmation\n", - ui->key == VB_KEY_ENTER ? "ENTER" : "POWER"); - /* - * If physical presence is confirmed using the keyboard, - * beep and notify the user when the ENTER key comes - * from an untrusted keyboard. - */ - if (PHYSICAL_PRESENCE_KEYBOARD && ui->key == VB_KEY_ENTER) - return set_ui_error( - ui, VB2_UI_ERROR_UNTRUSTED_CONFIRMATION); - return VB2_SUCCESS; - } - return recovery_to_dev_finalize(ui); -} - -vb2_error_t recovery_to_dev_action(struct vb2_ui_context *ui) -{ - int pressed; - - if (ui->key == ' ') { - VB2_DEBUG("SPACE means cancel dev mode transition\n"); - return vb2_ui_screen_back(ui); - } - - /* Keyboard physical presence case covered by "Confirm" action. */ - if (PHYSICAL_PRESENCE_KEYBOARD) - return VB2_SUCCESS; - - pressed = vb2ex_physical_presence_pressed(); - if (pressed) { - VB2_DEBUG("Physical presence button pressed, " - "awaiting release\n"); - ui->physical_presence_button_pressed = 1; - return VB2_SUCCESS; - } - if (!ui->physical_presence_button_pressed) - return VB2_SUCCESS; - VB2_DEBUG("Physical presence button released\n"); - - return recovery_to_dev_finalize(ui); -} - -static const struct vb2_menu_item recovery_to_dev_items[] = { - LANGUAGE_SELECT_ITEM, - [RECOVERY_TO_DEV_ITEM_CONFIRM] = { - .text = "Confirm", - .action = recovery_to_dev_confirm_action, - }, - [RECOVERY_TO_DEV_ITEM_CANCEL] = { - .text = "Cancel", - .action = vb2_ui_screen_back, - }, - POWER_OFF_ITEM, -}; - -static const struct vb2_screen_info recovery_to_dev_screen = { - .id = VB2_SCREEN_RECOVERY_TO_DEV, - .name = "Transition to developer mode", - .init = recovery_to_dev_init, - .action = recovery_to_dev_action, - .menu = MENU_ITEMS(recovery_to_dev_items), -}; - - -/******************************************************************************/ -/* - * TODO(chromium:1035800): Refactor UI code across vboot and depthcharge. - * Currently vboot and depthcharge maintain their own copies of menus/screens. - * vboot detects keyboard input and controls the navigation among different menu - * items and screens, while depthcharge performs the actual rendering of each - * screen, based on the menu information passed from vboot. - */ -static const struct vb2_screen_info *screens[] = { - &language_select_screen, - &advanced_options_screen, - &debug_info_screen, - &firmware_log_screen, - &recovery_to_dev_screen, -}; - -const struct vb2_screen_info *vb2_get_screen_info(enum vb2_screen id) -{ - int i; - for (i = 0; i < ARRAY_SIZE(screens); i++) { - if (screens[i]->id == id) - return screens[i]; - } - return NULL; -} diff --git a/firmware/2lib/include/2ui.h b/firmware/2lib/include/2ui.h deleted file mode 100644 index c01c1f97..00000000 --- a/firmware/2lib/include/2ui.h +++ /dev/null @@ -1,231 +0,0 @@ -/* Copyright 2020 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - * - * User interfaces for developer and recovery mode menus. - */ - -#ifndef VBOOT_REFERENCE_2UI_H_ -#define VBOOT_REFERENCE_2UI_H_ - -#include <2api.h> -#include <2sysincludes.h> - -/*****************************************************************************/ -/* Data structures */ - -struct vb2_ui_context; /* Forward declaration */ - -struct vb2_menu_item { - /* Text description */ - const char *text; - /* Target screen */ - enum vb2_screen target; - /* Action function takes precedence over target screen if non-NULL. */ - vb2_error_t (*action)(struct vb2_ui_context *ui); - /* Whether the item is language selection */ - int is_language_select; -}; - -struct vb2_menu { - /* Number of menu items */ - uint16_t num_items; - /* List of menu items */ - const struct vb2_menu_item *items; -}; - -struct vb2_screen_info { - /* Screen id */ - enum vb2_screen id; - /* Screen name for printing to console only */ - const char *name; - /* - * Init function runs once when changing to the screen which is not in - * the history stack. - */ - vb2_error_t (*init)(struct vb2_ui_context *ui); - /* - * Re-init function runs once when changing to the screen which is - * already in the history stack, for example, when going back to the - * screen. Exactly one of init() and reinit() will be called. - */ - vb2_error_t (*reinit)(struct vb2_ui_context *ui); - /* Action function runs repeatedly while on the screen. */ - vb2_error_t (*action)(struct vb2_ui_context *ui); - /* Menu items. */ - struct vb2_menu menu; - /* - * Custom function for getting menu items. If non-null, field 'menu' - * will be ignored. - */ - const struct vb2_menu *(*get_menu)(struct vb2_ui_context *ui); - /* - * Indices of menu items; - * used by log_page_* functions in 2ui_screens.c. - */ - uint32_t page_up_item; - uint32_t page_down_item; - uint32_t back_item; - uint32_t cancel_item; -}; - -struct vb2_screen_state { - const struct vb2_screen_info *screen; - uint32_t selected_item; - uint32_t disabled_item_mask; - uint32_t hidden_item_mask; - - /* For log screen. */ - uint32_t page_count; - uint32_t current_page; - - /* For minidiag test screens. */ - int test_finished; /* Do not update screen if the content is done */ - - struct vb2_screen_state *prev; -}; - -enum vb2_power_button { - VB2_POWER_BUTTON_HELD_SINCE_BOOT = 0, - VB2_POWER_BUTTON_RELEASED, - VB2_POWER_BUTTON_PRESSED, /* Must have been previously released */ -}; - -struct vb2_ui_context { - struct vb2_context *ctx; - struct vb2_screen_state *state; - uint32_t locale_id; - uint32_t key; - int key_trusted; - - /* For vb2_check_shutdown_request. */ - enum vb2_power_button power_button; - - /* For developer mode. */ - int disable_timer; - uint32_t start_time_ms; - int beep_count; - - /* For manual recovery. */ - vb2_error_t recovery_rv; - - /* For to_dev transition flow. */ - int physical_presence_button_pressed; - - /* For language selection screen. */ - struct vb2_menu language_menu; - - /* For bootloader selection screen. */ - struct vb2_menu bootloader_menu; - - /* For error beep sound. */ - int error_beep; - - /* For displaying error messages. */ - enum vb2_ui_error error_code; - - /* Force calling vb2ex_display_ui for refreshing the screen. This flag - will be reset after done. */ - int force_display; -}; - -vb2_error_t vb2_ui_developer_mode_boot_internal_action( - struct vb2_ui_context *ui); -vb2_error_t vb2_ui_developer_mode_boot_external_action( - struct vb2_ui_context *ui); -vb2_error_t vb2_ui_developer_mode_boot_altfw_action( - struct vb2_ui_context *ui); - -/** - * Get info struct of a screen. - * - * @param id Screen from enum vb2_screen - * - * @return screen info struct on success, NULL on error. - */ -const struct vb2_screen_info *vb2_get_screen_info(enum vb2_screen id); - -/*****************************************************************************/ -/* Menu navigation functions */ - -/** - * Move selection to the previous menu item. - * - * Update selected_item, taking into account hidden indices (from - * hidden_item_mask). The selection does not wrap, meaning that we block - * on 0 when we hit the start of the menu. - * - * @param ui UI context pointer - * @return VB2_SUCCESS, or error code on error. - */ -vb2_error_t vb2_ui_menu_prev(struct vb2_ui_context *ui); - -/** - * Move selection to the next menu item. - * - * Update selected_item, taking into account hidden indices (from - * hidden_item_mask). The selection does not wrap, meaning that we block - * on the max index when we hit the end of the menu. - * - * @param ui UI context pointer - * @return VB2_SUCCESS, or error code on error. - */ -vb2_error_t vb2_ui_menu_next(struct vb2_ui_context *ui); - -/** - * Select the current menu item. - * - * The caller should take care of returning after this function, and should not - * continue executing under the assumption that the screen has *not* changed. - * - * If the current menu item has an action associated with it, run the action. - * Otherwise, navigate to the target screen. If neither of these are set, then - * selecting the menu item is a no-op. - * - * @param ui UI context pointer - * @return VB2_SUCCESS, or error code on error. - */ -vb2_error_t vb2_ui_menu_select(struct vb2_ui_context *ui); - -/*****************************************************************************/ -/* Screen navigation functions */ -/** - * After these functions are called, no assumptions may be made about which - * screen is currently displayed, and thus execution should return to ui_loop. - * VB2_REQUEST_UI_CONTINUE is returned rather than VB2_SUCCESS, so VB2_TRY can - * be used to wrapped to these functions and the callers of these functions. - */ -/** - * Return back to the previous screen. - * - * The caller should take care of returning after this function, and should not - * continue executing under the assumption that the screen has *not* changed. - * - * If the current screen is already the root screen, the request is ignored. - * - * TODO(b/157625765): Consider falling into recovery mode (BROKEN screen) when - * the current screen is already the root screen. - * - * @param ui UI context pointer - * @return VB2_REQUEST_UI_CONTINUE, or error code on error. - */ -vb2_error_t vb2_ui_screen_back(struct vb2_ui_context *ui); - -/** - * Change to the given screen. - * - * The caller should take care of returning after this function, and should not - * continue executing under the assumption that the screen has *not* changed. - * - * If the screen is not found, the request is ignored. - * - * TODO(b/157625765): Consider falling into recovery mode (BROKEN screen) when - * the target screen is not found. - * - * @param ui UI context pointer - * @param id Screen from enum vb2_screen - * @return VB2_REQUEST_UI_CONTINUE, or error code on error. - */ -vb2_error_t vb2_ui_screen_change(struct vb2_ui_context *ui, enum vb2_screen id); - -#endif /* VBOOT_REFERENCE_2UI_H_ */ diff --git a/firmware/2lib/include/2ui_private.h b/firmware/2lib/include/2ui_private.h deleted file mode 100644 index 9f08c3eb..00000000 --- a/firmware/2lib/include/2ui_private.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright 2020 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - * - * Private declarations for 2ui.c. Defined here for testing purposes. - */ - -#include "2api.h" -#include "2common.h" - -#ifndef VBOOT_REFERENCE_2UI_PRIVATE_H_ -#define VBOOT_REFERENCE_2UI_PRIVATE_H_ - -/* Time-related constants */ -#define KEY_DELAY_MS 20 /* Delay between key scans in UI loops */ -#define DEV_DELAY_SHORT_MS (2 * VB2_MSEC_PER_SEC) /* 2 seconds */ -#define DEV_DELAY_NORMAL_MS (30 * VB2_MSEC_PER_SEC) /* 30 seconds */ -#define DEV_DELAY_BEEP1_MS (20 * VB2_MSEC_PER_SEC) /* 20 seconds */ -#define DEV_DELAY_BEEP2_MS (20 * VB2_MSEC_PER_SEC + 500) /* 20.5 seconds */ - -/* From 2ui.c */ -vb2_error_t vb2_check_shutdown_request(struct vb2_ui_context *ui); -const struct vb2_menu *vb2_get_menu(struct vb2_ui_context *ui); -vb2_error_t vb2_error_exit_action(struct vb2_ui_context *ui); -vb2_error_t vb2_menu_navigation_action(struct vb2_ui_context *ui); -vb2_error_t -vb2_ui_loop(struct vb2_context *ctx, enum vb2_screen root_screen_id, - vb2_error_t (*global_action)(struct vb2_ui_context *ui)); -vb2_error_t developer_action(struct vb2_ui_context *ui); -vb2_error_t manual_recovery_action(struct vb2_ui_context *ui); - -/* From 2ui_screens.c */ -const struct vb2_menu *vb2_get_language_menu(struct vb2_ui_context *ui); -vb2_error_t vb2_advanced_options_init(struct vb2_ui_context *ui); -vb2_error_t recovery_select_init(struct vb2_ui_context *ui); -vb2_error_t recovery_to_dev_init(struct vb2_ui_context *ui); -vb2_error_t recovery_to_dev_confirm_action(struct vb2_ui_context *ui); -vb2_error_t recovery_to_dev_action(struct vb2_ui_context *ui); -vb2_error_t developer_mode_init(struct vb2_ui_context *ui); -vb2_error_t developer_mode_action(struct vb2_ui_context *ui); -vb2_error_t developer_to_norm_action(struct vb2_ui_context *ui); - -#endif /* VBOOT_REFERENCE_2UI_PRIVATE_H_ */ |