summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/2lib/2stub.c13
-rw-r--r--firmware/2lib/2ui_screens.c154
-rw-r--r--firmware/2lib/include/2api.h28
-rw-r--r--firmware/2lib/include/2ui.h2
4 files changed, 195 insertions, 2 deletions
diff --git a/firmware/2lib/2stub.c b/firmware/2lib/2stub.c
index f7b15ce5..7cec2e5d 100644
--- a/firmware/2lib/2stub.c
+++ b/firmware/2lib/2stub.c
@@ -194,6 +194,19 @@ vb2_error_t vb2ex_diag_get_storage_health(const char **out)
}
__attribute__((weak))
+vb2_error_t vb2ex_diag_get_storage_test_log(const char **out)
+{
+ *out = "mock";
+ return VB2_SUCCESS;
+}
+
+__attribute__((weak))
+vb2_error_t vb2ex_diag_storage_test_control(enum vb2_diag_storage_test ops)
+{
+ return VB2_SUCCESS;
+}
+
+__attribute__((weak))
vb2_error_t vb2ex_diag_memory_quick_test(int reset, const char **out)
{
*out = "mock";
diff --git a/firmware/2lib/2ui_screens.c b/firmware/2lib/2ui_screens.c
index 4f00fd5e..e3d7067e 100644
--- a/firmware/2lib/2ui_screens.c
+++ b/firmware/2lib/2ui_screens.c
@@ -1034,12 +1034,38 @@ static const struct vb2_screen_info developer_select_bootloader_screen = {
/******************************************************************************/
/* VB2_SCREEN_DIAGNOSTICS */
+#define DIAGNOSTICS_ITEM_STORAGE_HEALTH 1
+#define DIAGNOSTICS_ITEM_STORAGE_TEST_SHORT 2
+#define DIAGNOSTICS_ITEM_STORAGE_TEST_EXTENDED 3
+
+static vb2_error_t diagnostics_init(struct vb2_ui_context *ui)
+{
+ const char *unused_log_string;
+ vb2_error_t rv = vb2ex_diag_get_storage_test_log(&unused_log_string);
+ if (rv == VB2_ERROR_EX_UNIMPLEMENTED) {
+ VB2_SET_BIT(ui->state->disabled_item_mask,
+ DIAGNOSTICS_ITEM_STORAGE_TEST_SHORT);
+ VB2_SET_BIT(ui->state->disabled_item_mask,
+ DIAGNOSTICS_ITEM_STORAGE_TEST_EXTENDED);
+ }
+ ui->state->selected_item = DIAGNOSTICS_ITEM_STORAGE_HEALTH;
+ return VB2_SUCCESS;
+}
+
static const struct vb2_menu_item diagnostics_items[] = {
LANGUAGE_SELECT_ITEM,
- {
+ [DIAGNOSTICS_ITEM_STORAGE_HEALTH] = {
.text = "Storage health info",
.target = VB2_SCREEN_DIAGNOSTICS_STORAGE_HEALTH,
},
+ [DIAGNOSTICS_ITEM_STORAGE_TEST_SHORT] = {
+ .text = "Storage self-test (short)",
+ .target = VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST_SHORT,
+ },
+ [DIAGNOSTICS_ITEM_STORAGE_TEST_EXTENDED] = {
+ .text = "Storage self-test (Extended)",
+ .target = VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST_EXTENDED,
+ },
{
.text = "Memory check (quick)",
.target = VB2_SCREEN_DIAGNOSTICS_MEMORY_QUICK,
@@ -1054,6 +1080,7 @@ static const struct vb2_menu_item diagnostics_items[] = {
static const struct vb2_screen_info diagnostics_screen = {
.id = VB2_SCREEN_DIAGNOSTICS,
.name = "Diagnostic tools",
+ .init = diagnostics_init,
.menu = MENU_ITEMS(diagnostics_items),
};
@@ -1098,6 +1125,129 @@ static const struct vb2_screen_info diagnostics_storage_health_screen = {
};
/******************************************************************************/
+/* VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST */
+
+#define DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_UP 0
+#define DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_DOWN 1
+#define DIAGNOSTICS_STORAGE_TEST_ITEM_BACK 2
+#define DIAGNOSTICS_STORAGE_TEST_ITEM_CANCEL 3
+
+static vb2_error_t diagnostics_storage_test_update_impl(
+ struct vb2_ui_context *ui)
+{
+ const char *log_string;
+ int is_test_running = 0;
+
+ /* Early return if the test is done. */
+ if (ui->state->test_finished)
+ return VB2_SUCCESS;
+
+ vb2_error_t rv = vb2ex_diag_get_storage_test_log(&log_string);
+ switch (rv) {
+ case VB2_ERROR_EX_DIAG_TEST_RUNNING:
+ is_test_running = 1;
+ break;
+ case VB2_SUCCESS:
+ ui->state->test_finished = 1;
+ break;
+ default:
+ VB2_DEBUG("vb2ex_diag_get_storage_test_log returned %#x\n", rv);
+ return rv;
+ }
+ VB2_TRY(log_page_show_back_or_cancel(ui, is_test_running));
+ return log_page_update(ui, log_string);
+}
+
+static vb2_error_t diagnostics_storage_test_update(struct vb2_ui_context *ui)
+{
+ vb2_error_t rv = diagnostics_storage_test_update_impl(ui);
+ if (rv) {
+ ui->error_code = VB2_UI_ERROR_DIAGNOSTICS;
+ return vb2_ui_screen_back(ui);
+ }
+ return VB2_SUCCESS;
+}
+
+static vb2_error_t diagnostics_storage_test_control(
+ struct vb2_ui_context *ui, enum vb2_diag_storage_test op)
+{
+ vb2_error_t rv = vb2ex_diag_storage_test_control(op);
+ if (rv) {
+ ui->error_code = VB2_UI_ERROR_DIAGNOSTICS;
+ return vb2_ui_screen_back(ui);
+ }
+ return VB2_SUCCESS;
+}
+
+static vb2_error_t diagnostics_storage_test_init(struct vb2_ui_context *ui)
+{
+ VB2_TRY(diagnostics_storage_test_update(ui));
+ return log_page_reset_to_top(ui);
+}
+
+static vb2_error_t diagnostics_storage_test_short_init(
+ struct vb2_ui_context *ui)
+{
+ VB2_TRY(diagnostics_storage_test_control(ui,
+ VB2_DIAG_STORAGE_TEST_STOP));
+ VB2_TRY(diagnostics_storage_test_control(ui,
+ VB2_DIAG_STORAGE_TEST_SHORT));
+ return diagnostics_storage_test_init(ui);
+}
+
+static vb2_error_t diagnostics_storage_test_extended_init(
+ struct vb2_ui_context *ui)
+{
+ VB2_TRY(diagnostics_storage_test_control(ui,
+ VB2_DIAG_STORAGE_TEST_STOP));
+ VB2_TRY(diagnostics_storage_test_control(
+ ui, VB2_DIAG_STORAGE_TEST_EXTENDED));
+ return diagnostics_storage_test_init(ui);
+}
+
+static vb2_error_t diagnostics_storage_test_cancel(struct vb2_ui_context *ui)
+{
+ VB2_TRY(diagnostics_storage_test_control(ui,
+ VB2_DIAG_STORAGE_TEST_STOP));
+ return vb2_ui_screen_back(ui);
+}
+
+static const struct vb2_menu_item diagnostics_storage_test_items[] = {
+ [DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_UP] = PAGE_UP_ITEM,
+ [DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_DOWN] = PAGE_DOWN_ITEM,
+ [DIAGNOSTICS_STORAGE_TEST_ITEM_BACK] = BACK_ITEM,
+ [DIAGNOSTICS_STORAGE_TEST_ITEM_CANCEL] = {
+ .text = "Cancel",
+ .action = diagnostics_storage_test_cancel,
+ },
+ POWER_OFF_ITEM,
+};
+
+static const struct vb2_screen_info diagnostics_storage_test_short_screen = {
+ .id = VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST_SHORT,
+ .name = "Storage self-test (short)",
+ .init = diagnostics_storage_test_short_init,
+ .action = diagnostics_storage_test_update,
+ .menu = MENU_ITEMS(diagnostics_storage_test_items),
+ .page_up_item = DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_UP,
+ .page_down_item = DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_DOWN,
+ .back_item = DIAGNOSTICS_STORAGE_TEST_ITEM_BACK,
+ .cancel_item = DIAGNOSTICS_STORAGE_TEST_ITEM_CANCEL,
+};
+
+static const struct vb2_screen_info diagnostics_storage_test_extended_screen = {
+ .id = VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST_EXTENDED,
+ .name = "Storage self-test (extended)",
+ .init = diagnostics_storage_test_extended_init,
+ .action = diagnostics_storage_test_update,
+ .menu = MENU_ITEMS(diagnostics_storage_test_items),
+ .page_up_item = DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_UP,
+ .page_down_item = DIAGNOSTICS_STORAGE_TEST_ITEM_PAGE_DOWN,
+ .back_item = DIAGNOSTICS_STORAGE_TEST_ITEM_BACK,
+ .cancel_item = DIAGNOSTICS_STORAGE_TEST_ITEM_CANCEL,
+};
+
+/******************************************************************************/
/* VB2_SCREEN_DIAGNOSTICS_MEMORY_QUICK
VB2_SCREEN_DIAGNOSTICS_MEMORY_FULL */
@@ -1240,6 +1390,8 @@ static const struct vb2_screen_info *screens[] = {
&developer_select_bootloader_screen,
&diagnostics_screen,
&diagnostics_storage_health_screen,
+ &diagnostics_storage_test_short_screen,
+ &diagnostics_storage_test_extended_screen,
&diagnostics_memory_quick_screen,
&diagnostics_memory_full_screen,
};
diff --git a/firmware/2lib/include/2api.h b/firmware/2lib/include/2api.h
index 6a1fc171..8d14f376 100644
--- a/firmware/2lib/include/2api.h
+++ b/firmware/2lib/include/2api.h
@@ -1345,6 +1345,8 @@ enum vb2_screen {
VB2_SCREEN_DIAGNOSTICS = 0x400,
/* Storage diagnostic screen */
VB2_SCREEN_DIAGNOSTICS_STORAGE_HEALTH = 0x410,
+ VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST_SHORT = 0x411,
+ VB2_SCREEN_DIAGNOSTICS_STORAGE_TEST_EXTENDED = 0x412,
/* Memory diagnostic screens */
VB2_SCREEN_DIAGNOSTICS_MEMORY_QUICK = 0x420,
VB2_SCREEN_DIAGNOSTICS_MEMORY_FULL = 0x421,
@@ -1526,6 +1528,21 @@ uint32_t vb2ex_prepare_log_screen(enum vb2_screen screen, uint32_t locale_id,
vb2_error_t vb2ex_diag_get_storage_health(const char **out);
/**
+ * Get the storage self-test log.
+ *
+ * @param out For returning a read-only pointer of full log string which is
+ * guaranteed to be null-terminated. The function will manage
+ * memory internally, so the returned pointer will only be valid
+ * until next call.
+ * @return The status of storage test. VB2_SUCCESS means the test is finished,
+ * regardless of passing or failing. VB2_ERROR_EX_DIAG_TEST_RUNNING means
+ * the test is still running. VB2_ERROR_EX_UNIMPLEMENTED means the storage
+ * self-test is not supported on this device. Other non-zero codes for internal
+ * errors.
+ */
+vb2_error_t vb2ex_diag_get_storage_test_log(const char **out);
+
+/**
* Get the memory diagnostic status. When it is called, it will take over the
* control for a short period of time running memory test, and then return the
* result of current status. If `reset` is not zero, it will reset the memory
@@ -1547,6 +1564,17 @@ vb2_error_t vb2ex_diag_memory_quick_test(int reset, const char **out);
vb2_error_t vb2ex_diag_memory_full_test(int reset, const char **out);
/*****************************************************************************/
+/* Functions for diagnostics control. */
+
+enum vb2_diag_storage_test {
+ VB2_DIAG_STORAGE_TEST_STOP = 0,
+ VB2_DIAG_STORAGE_TEST_SHORT,
+ VB2_DIAG_STORAGE_TEST_EXTENDED,
+};
+
+vb2_error_t vb2ex_diag_storage_test_control(enum vb2_diag_storage_test ops);
+
+/*****************************************************************************/
/* Timer. */
/**
diff --git a/firmware/2lib/include/2ui.h b/firmware/2lib/include/2ui.h
index 5434fd96..6dbb322d 100644
--- a/firmware/2lib/include/2ui.h
+++ b/firmware/2lib/include/2ui.h
@@ -79,7 +79,7 @@ struct vb2_screen_state {
uint32_t page_count;
uint32_t current_page;
- /* For memory check screen. */
+ /* For minidiag test screens. */
int test_finished; /* Do not update screen if the content is done */
struct vb2_screen_state *prev;