5 #include "sw/device/lib/testing/nv_counter_testutils.h"
12 #include "sw/device/lib/testing/flash_ctrl_testutils.h"
13 #include "sw/device/lib/testing/test_framework/check.h"
15 #include "flash_ctrl_regs.h"
19 kNonVolatileCounterFlashWords = 256,
21 static_assert(kNonVolatileCounterFlashWords ==
22 kFlashCtrlTestUtilsCounterMaxCount,
23 "Word count must be equal to max count.");
25 FLASH_CTRL_PARAM_BYTES_PER_WORD ==
sizeof(uint64_t),
26 "Elements of the counter array must be the same size as a flash word");
27 extern char _non_volatile_counter_flash_words[];
30 uint64_t nv_counter_0[kNonVolatileCounterFlashWords];)
32 uint64_t nv_counter_1[kNonVolatileCounterFlashWords];)
34 uint64_t nv_counter_2[kNonVolatileCounterFlashWords];)
36 uint64_t nv_counter_3[kNonVolatileCounterFlashWords];)
38 static uint64_t *
const kNvCounters[] = {
45 status_t flash_ctrl_testutils_counter_get(
size_t counter, uint32_t *value) {
46 TRY_CHECK(value != NULL);
47 TRY_CHECK(counter <
ARRAYSIZE(kNvCounters));
48 TRY_CHECK((uint32_t)&_non_volatile_counter_flash_words ==
49 kNonVolatileCounterFlashWords);
53 size_t i = kNonVolatileCounterFlashWords - 1;
54 for (; i < kNonVolatileCounterFlashWords; --i) {
55 if (kNvCounters[counter][i] == 0) {
63 status_t flash_ctrl_testutils_counter_increment(
66 TRY(flash_ctrl_testutils_counter_get(counter, &i));
67 TRY_CHECK(i < kNonVolatileCounterFlashWords,
68 "Non-volatile counter %u is at its maximum", counter);
69 TRY(flash_ctrl_testutils_counter_set_at_least(flash_state, counter, i + 1));
71 TRY(flash_ctrl_testutils_counter_get(counter, &value));
72 TRY_CHECK(value == i + 1,
"Counter increment failed");
76 status_t flash_ctrl_testutils_counter_set_at_least(
78 TRY_CHECK(val <= kNonVolatileCounterFlashWords,
79 "Non-volatile counter %u new value %u > max value %u", counter, val,
80 kNonVolatileCounterFlashWords);
84 uint32_t new_val[FLASH_CTRL_PARAM_BYTES_PER_WORD /
sizeof(uint32_t)] = {0, 0};
85 return flash_ctrl_testutils_write(flash_state,
86 (uint32_t)&kNvCounters[counter][val - 1] -
88 0, new_val, kDifFlashCtrlPartitionTypeData,
98 status_t flash_ctrl_testutils_counter_init_zero(
100 uint32_t new_val[FLASH_CTRL_PARAM_BYTES_PER_WORD /
sizeof(uint32_t)] = {0xaa,
102 for (
int ii = 0; ii < kNonVolatileCounterFlashWords; ii++) {
103 TRY(flash_ctrl_testutils_erase_and_write_page(
105 (uint32_t)&kNvCounters[counter][ii] -
107 0, new_val, kDifFlashCtrlPartitionTypeData,
ARRAYSIZE(new_val)));