8 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
9 #include "sw/device/lib/testing/nv_counter_testutils.h"
10 #include "sw/device/lib/testing/test_framework/check.h"
12 #include "sw/device/silicon_creator/lib/boot_data.h"
13 #include "sw/device/silicon_creator/lib/drivers/flash_ctrl.h"
14 #include "sw/device/silicon_creator/lib/drivers/lifecycle.h"
15 #include "sw/device/silicon_creator/lib/drivers/rstmgr.h"
16 #include "sw/device/silicon_creator/lib/manifest_def.h"
20 OTTF_DEFINE_TEST_CONFIG();
32 static void increment_flash_counter(
void) {
37 CHECK_STATUS_OK(flash_ctrl_testutils_default_region_access(
40 true,
false,
false,
false,
false));
42 flash_ctrl_testutils_counter_increment(&flash_ctrl, kFlashCounterId));
43 CHECK_STATUS_OK(flash_ctrl_testutils_default_region_access(
44 &flash_ctrl,
false,
false,
false,
false,
false,
false));
47 static rom_error_t first_boot_test(
void) {
48 LOG_INFO(
"First boot: interrupted upgrade");
50 RETURN_IF_ERROR(boot_data_read(lifecycle_state_get(), &
boot_data));
55 RETURN_IF_ERROR(boot_data_write(&
boot_data));
56 RETURN_IF_ERROR(boot_data_read(lifecycle_state_get(), &
boot_data));
60 uint32_t corrupted_words[4] = {0};
61 flash_ctrl_info_perms_set(&kFlashCtrlInfoPageBootData0,
63 .read = kMultiBitBool4False,
64 .write = kMultiBitBool4True,
65 .erase = kMultiBitBool4False,
67 RETURN_IF_ERROR(flash_ctrl_info_write(&kFlashCtrlInfoPageBootData0, 0, 4,
69 flash_ctrl_info_perms_set(&kFlashCtrlInfoPageBootData0,
71 .read = kMultiBitBool4False,
72 .write = kMultiBitBool4False,
73 .erase = kMultiBitBool4False,
78 static rom_error_t second_boot_test(
void) {
82 RETURN_IF_ERROR(boot_data_read(lifecycle_state_get(), &
boot_data));
87 RETURN_IF_ERROR(boot_data_write(&
boot_data));
88 RETURN_IF_ERROR(boot_data_read(lifecycle_state_get(), &
boot_data));
95 static rom_error_t third_boot_test(
void) {
99 RETURN_IF_ERROR(boot_data_read(lifecycle_state_get(), &
boot_data));
109 size_t reboot_counter = 0;
111 flash_ctrl_testutils_counter_get(kFlashCounterId, &reboot_counter));
113 switch (reboot_counter) {
121 increment_flash_counter();
128 increment_flash_counter();
135 return status_ok(result);