diff options
Diffstat (limited to 'firmware/lib/vboot_ui_wilco.c')
-rw-r--r-- | firmware/lib/vboot_ui_wilco.c | 170 |
1 files changed, 125 insertions, 45 deletions
diff --git a/firmware/lib/vboot_ui_wilco.c b/firmware/lib/vboot_ui_wilco.c index b8457def..ff4e229e 100644 --- a/firmware/lib/vboot_ui_wilco.c +++ b/firmware/lib/vboot_ui_wilco.c @@ -20,18 +20,25 @@ static inline int is_vowel(uint32_t key) key == 'O' || key == 'U'; } +static int vendor_data_length(char *data_value) +{ + for (int len = 0; len <= VENDOR_DATA_LENGTH; len++) { + if (data_value[len] == '\0') + return len; + } + + return VENDOR_DATA_LENGTH; +} + /* - * Prompt the user to enter the vendor data + * Prompt the user to enter the serial number */ static vb2_error_t vb2_enter_vendor_data_ui(struct vb2_context *ctx, char *data_value) { - int len = 0; - VbScreenData data = { - .vendor_data = { data_value } - }; + int len = vendor_data_length(data_value); + VbScreenData data = {.vendor_data = {data_value, 1}}; - data_value[0] = '\0'; VbDisplayScreen(ctx, VB_SCREEN_SET_VENDOR_DATA, 1, &data); /* We'll loop until the user decides what to do */ @@ -101,70 +108,143 @@ static vb2_error_t vb2_enter_vendor_data_ui(struct vb2_context *ctx, return VB2_SUCCESS; } -vb2_error_t vb2_vendor_data_ui(struct vb2_context *ctx) +/* + * Prompt the user to confirm the serial number and write to memory + */ +static vb2_error_t vb2_confirm_vendor_data_ui(struct vb2_context *ctx, + char* data_value, VbScreenData *data) { - char data_value[VENDOR_DATA_LENGTH + 1]; - VbScreenData data = { - .vendor_data = { data_value } - }; - - vb2_error_t ret = vb2_enter_vendor_data_ui(ctx, data_value); - - if (ret) - return ret; - - /* Vendor data was not entered just return */ - if (data_value[0] == '\0') - return VB2_SUCCESS; - - VbDisplayScreen(ctx, VB_SCREEN_CONFIRM_VENDOR_DATA, 1, &data); + VbDisplayScreen(ctx, VB_SCREEN_CONFIRM_VENDOR_DATA, 1, data); /* We'll loop until the user decides what to do */ do { - uint32_t key = VbExKeyboardRead(); + uint32_t key_confirm = VbExKeyboardRead(); - if (vb2_want_shutdown(ctx, key)) { - VB2_DEBUG("Vendor Data UI - shutdown requested!\n"); + if (vb2_want_shutdown(ctx, key_confirm)) { + VB2_DEBUG("Confirm Vendor Data UI " + "- shutdown requested!\n"); return VBERROR_SHUTDOWN_REQUESTED; } - switch (key) { + switch (key_confirm) { case 0: /* Nothing pressed */ break; case VB_KEY_ESC: /* Escape pressed - return to developer screen */ - VB2_DEBUG("Vendor Data UI - user pressed Esc: " - "exit to Developer screen\n"); + VB2_DEBUG("Confirm Vendor Data UI - user " + "pressed Esc: exit to Developer screen\n"); return VB2_SUCCESS; + case VB_KEY_RIGHT: + case VB_KEY_LEFT: + data->vendor_data.selected_index = + data->vendor_data.selected_index ^ 1; + VbDisplayScreen(ctx, VB_SCREEN_CONFIRM_VENDOR_DATA, + 1, data); + VB2_DEBUG("selected_index:%d\n", + data->vendor_data.selected_index); + break; case VB_KEY_ENTER: /* Enter pressed - write vendor data */ - VB2_DEBUG("Vendor Data UI - user pressed Enter: " - "write vendor data (%s) to VPD\n", - data_value); - ret = VbExSetVendorData(data_value); + if (data->vendor_data.selected_index == 0) { + VB2_DEBUG("Confirm Vendor Data UI - user " + "selected YES: " + "write vendor data (%s) to VPD\n", + data_value); + vb2_error_t ret = VbExSetVendorData(data_value); - if (ret == VB2_SUCCESS) { - vb2_nv_set(ctx, VB2_NV_DISABLE_DEV_REQUEST, 1); - return VBERROR_REBOOT_REQUIRED; + if (ret == VB2_SUCCESS) { + vb2_nv_set(ctx, + VB2_NV_DISABLE_DEV_REQUEST, + 1); + return VBERROR_REBOOT_REQUIRED; + } else { + vb2_error_notify( + "ERROR: Vendor data was not " + "set.\n" + "System will now shutdown\n", + NULL, VB_BEEP_FAILED); + VbExSleepMs(5000); + return VBERROR_SHUTDOWN_REQUESTED; + } } else { - vb2_error_notify( - "ERROR: Vendor data was not set.\n" - "System will now shutdown\n", - NULL, - VB_BEEP_FAILED); - VbExSleepMs(5000); - return VBERROR_SHUTDOWN_REQUESTED; + VB2_DEBUG("Confirm Vendor Data UI - user " + "selected NO: " + "Returning to set screen\n"); + return VB2_SUCCESS; } default: - VB2_DEBUG("Vendor Data UI - pressed key %#x\n", key); - VbCheckDisplayKey(ctx, key, &data); + VB2_DEBUG("Confirm Vendor Data UI - pressed " + "key %#x\n", key_confirm); + VbCheckDisplayKey(ctx, key_confirm, data); break; } VbExSleepMs(KEY_DELAY_MS); } while (1); - return VB2_SUCCESS; } +vb2_error_t vb2_vendor_data_ui(struct vb2_context *ctx) +{ + char data_value[VENDOR_DATA_LENGTH + 1]; + + VbScreenData data = {.vendor_data = {data_value, 0}}; + VbDisplayScreen(ctx, VB_COMPLETE_VENDOR_DATA, 0, NULL); + + do { + uint32_t key_set = VbExKeyboardRead(); + + if (vb2_want_shutdown(ctx, key_set)) { + VB2_DEBUG("Vendor Data UI - shutdown requested!\n"); + return VBERROR_SHUTDOWN_REQUESTED; + } + + switch (key_set) { + case 0: + /* Nothing pressed - do nothing. */ + break; + case VB_KEY_ESC: + /* ESC pressed - boot normally */ + VB2_DEBUG("Vendor Data UI - boot normally\n"); + return VB2_SUCCESS; + break; + case VB_KEY_ENTER: + data_value[0] = '\0'; + do { + /* ENTER pressed - + enter vendor data set screen */ + VB2_DEBUG("Vendor Data UI - Enter VD set " + "screen\n"); + vb2_error_t ret = vb2_enter_vendor_data_ui( + ctx, data_value); + + if (ret) + return ret; + + /* Vendor data was not entered just return */ + if (vendor_data_length(data_value) == 0) { + return VB2_SUCCESS; + } + + /* Reset confirmation answer to YES */ + data.vendor_data.selected_index = 0; + + ret = vb2_confirm_vendor_data_ui( + ctx, data_value, &data); + + if (ret) + return ret; + + /* Break if vendor data confirmed */ + if (data.vendor_data.selected_index == 0) + return VB2_SUCCESS; + } while (1); + break; + default: + break; + } + } while (1); + return VB2_SUCCESS; +} + vb2_error_t vb2_check_diagnostic_key(struct vb2_context *ctx, uint32_t key) { if (DIAGNOSTIC_UI && (key == VB_KEY_CTRL('C') || key == VB_KEY_F(12))) { |