8 #include "sw/device/lib/runtime/irq.h"
10 #include "sw/device/lib/testing/test_framework/check.h"
15 static dif_rv_timer_t timer;
20 kReferenceTimeMillis = 5,
24 OTTF_DEFINE_TEST_CONFIG();
26 static status_t set_tick(uint32_t tick_hz) {
34 static status_t test_tick(uint32_t tick_hz) {
35 LOG_INFO(
"%s: tick_hz = %u", __func__, tick_hz);
37 TRY(set_tick(tick_hz));
42 TRY_CHECK(counter == 0,
"Failed to write the counter");
49 const uint64_t elapsed_millis =
udiv64_slow(counter * 1000, tick_hz, NULL);
52 TRY_CHECK((elapsed_millis >= (uint64_t)(kReferenceTimeMillis * 0.97)) &&
53 (elapsed_millis <= (uint64_t)(kReferenceTimeMillis * 1.03)),
54 "Unexpected elapsed time, expected: %u, got: %u",
55 (uint32_t)kReferenceTimeMillis, (uint32_t)elapsed_millis);
60 static status_t test_wrap(uint32_t tick_hz) {
61 LOG_INFO(
"%s: tick_hz = %u", __func__, tick_hz);
63 TRY(dif_rv_timer_irq_set_enabled(
66 TRY(set_tick(tick_hz));
68 uint64_t start_counter = UINT64_MAX - (kWrapTimeMillis * tick_hz) / 1000;
76 uint64_t counter = UINT64_MAX;
79 TRY_CHECK(counter < start_counter,
80 "Unexpected elapsed time, expected: %08x%08x, got: %08x%08x",
81 (uint32_t)(start_counter >> 32), (uint32_t)start_counter,
82 (uint32_t)(counter >> 32), (uint32_t)counter);
84 bool irq_pending =
false;
85 TRY(dif_rv_timer_irq_is_pending(&timer, kDifRvTimerIrqTimerExpiredHart0Timer0,
87 TRY_CHECK(irq_pending,
"Expected timer IRQ");
102 CHECK_DIF_OK(dif_rv_timer_init(
106 const uint32_t kTickHz[] = {
115 for (
size_t i = 0; i <
ARRAYSIZE(kTickHz); ++i) {
121 return status_ok(result);