6 #include "sw/device/lib/base/status.h"
12 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
13 #include "sw/device/lib/testing/otp_ctrl_testutils.h"
14 #include "sw/device/lib/testing/pinmux_testutils.h"
15 #include "sw/device/lib/testing/test_framework/check.h"
16 #include "sw/device/lib/testing/test_framework/ottf_console.h"
17 #include "sw/device/lib/testing/test_framework/ottf_test_config.h"
18 #include "sw/device/lib/testing/test_framework/ottf_utils.h"
22 OTTF_DEFINE_TEST_CONFIG(.enable_uart_flow_control =
true);
24 volatile uint32_t kTestPhase;
25 volatile uint32_t kEndTest;
27 static dif_pinmux_t pinmux;
29 static dif_otp_ctrl_t otp_ctrl;
33 kFlashInfoPartitionId = 0,
34 kFlashInfoPageIdCreatorSecret = 1,
35 kFlashInfoPageIdOwnerSecret = 2,
36 kFlashInfoPageIdIsoPart = 3,
40 kCommandTimeout = 5000000,
44 static const uint32_t kRandomData[2] = {
50 const uint32_t *data,
bool scramble) {
53 TRY(flash_ctrl_testutils_info_region_scrambled_setup(
54 flash, page_id, kFlashInfoBankId, kFlashInfoPartitionId, &address));
56 TRY(flash_ctrl_testutils_info_region_setup(
57 flash, page_id, kFlashInfoBankId, kFlashInfoPartitionId, &address));
60 TRY(flash_ctrl_testutils_erase_and_write_page(
61 flash, address, kFlashInfoPartitionId, data,
62 kDifFlashCtrlPartitionTypeInfo, 1));
64 LOG_INFO(
"wr_info: data:0x%x", *data);
69 uint32_t *data,
bool scramble) {
72 TRY(flash_ctrl_testutils_info_region_scrambled_setup(
73 flash, page_id, kFlashInfoBankId, kFlashInfoPartitionId, &address));
75 TRY(flash_ctrl_testutils_info_region_setup(
76 flash, page_id, kFlashInfoBankId, kFlashInfoPartitionId, &address));
79 TRY(flash_ctrl_testutils_read(flash, address, kFlashInfoPartitionId, data,
80 kDifFlashCtrlPartitionTypeInfo, 1, 1));
85 static status_t read_and_check_info(
bool match) {
86 uint32_t readback_data[2];
87 read_info_page(&flash, kFlashInfoPageIdOwnerSecret, readback_data,
true);
88 read_info_page(&flash, kFlashInfoPageIdIsoPart, readback_data + 1,
true);
89 LOG_INFO(
"readdata0: %x", *readback_data);
90 LOG_INFO(
"readdata1: %x", *(readback_data + 1));
94 CHECK_ARRAYS_EQ(readback_data, kRandomData, 1);
96 CHECK_ARRAYS_NE(readback_data, kRandomData, 2);
104 CHECK_DIF_OK(dif_pinmux_init(
106 pinmux_testutils_init(&pinmux);
109 CHECK_DIF_OK(dif_otp_ctrl_init(
115 kTestPhase = kTestPhaseInit;
119 OTTF_WAIT_FOR(kEndTest, kCommandTimeout);
121 switch (kTestPhase) {
124 write_info_page(&flash, kFlashInfoPageIdOwnerSecret, kRandomData,
true);
125 write_info_page(&flash, kFlashInfoPageIdIsoPart, kRandomData + 1,
true);
126 read_and_check_info(
true);
130 CHECK_STATUS_OK(otp_ctrl_testutils_lock_partition(
137 read_and_check_info(
false);
140 LOG_ERROR(
"unexpected test phase : %d", kTestPhase);