8 #include "sw/device/lib/runtime/irq.h"
10 #include "sw/device/lib/testing/aon_timer_testutils.h"
11 #include "sw/device/lib/testing/clkmgr_testutils.h"
12 #include "sw/device/lib/testing/pwrmgr_testutils.h"
13 #include "sw/device/lib/testing/rv_plic_testutils.h"
14 #include "sw/device/lib/testing/sensor_ctrl_testutils.h"
15 #include "sw/device/lib/testing/test_framework/check.h"
19 #include "sw/device/lib/testing/autogen/isr_testutils.h"
21 OTTF_DEFINE_TEST_CONFIG();
33 kWaitForCSRPollingMicros = 1,
34 kMeasurementsPerRound = 100,
39 static const dt_pwrmgr_t kPwrmgrDt = 0;
40 static_assert(kDtPwrmgrCount == 1,
"this test expects a pwrmgr");
41 static const dt_aon_timer_t kAonTimerDt = 0;
42 static_assert(kDtAonTimerCount == 1,
"this test expects an aon_timer");
43 static const dt_clkmgr_t kClkmgrDt = 0;
44 static_assert(kDtClkmgrCount == 1,
"this test expects a clkmgr");
45 static const dt_sensor_ctrl_t kSensorCtrlDt = 0;
46 static_assert(kDtSensorCtrlCount >= 1,
"this test expects a sensor_ctrl");
47 static const dt_rv_plic_t kRvPlicDt = 0;
48 static_assert(kDtRvPlicCount == 1,
"this test expects a rv_plic");
50 static dif_clkmgr_t clkmgr;
51 static dif_pwrmgr_t pwrmgr;
52 static dif_rv_plic_t rv_plic;
54 static volatile bool isr_entered;
59 bool ottf_handle_irq(uint32_t *exc_info, dt_instance_id_t devid,
61 if (devid == dt_pwrmgr_instance_id(kPwrmgrDt) &&
62 irq_id == dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup)) {
63 CHECK_DIF_OK(dif_pwrmgr_irq_acknowledge(&pwrmgr, kDtPwrmgrIrqWakeup));
72 dif_sensor_ctrl_t sensor_ctrl;
73 dif_aon_timer_t aon_timer;
75 uint32_t delay_micros = 0;
76 CHECK_STATUS_OK(aon_timer_testutils_get_us_from_aon_cycles(
77 kMeasurementsPerRound, &delay_micros));
80 irq_global_ctrl(
true);
81 irq_external_ctrl(
true);
83 CHECK_DIF_OK(dif_clkmgr_init_from_dt(kClkmgrDt, &clkmgr));
84 CHECK_DIF_OK(dif_sensor_ctrl_init_from_dt(kSensorCtrlDt, &sensor_ctrl));
85 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
86 CHECK_DIF_OK(dif_aon_timer_init_from_dt(kAonTimerDt, &aon_timer));
87 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kRvPlicDt, &rv_plic));
92 kDtAonTimerWakeupWkupReq, &wakeup_sources));
98 CHECK(UNWRAP(pwrmgr_testutils_is_wakeup_reason(&pwrmgr, 0)) ==
true);
100 CHECK_STATUS_OK(clkmgr_testutils_enable_clock_counts_with_expected_thresholds(
101 &clkmgr,
false,
false,
106 CHECK_STATUS_OK(clkmgr_testutils_check_measurement_counts(&clkmgr));
107 CHECK_STATUS_OK(clkmgr_testutils_disable_clock_counts(&clkmgr));
110 CHECK_STATUS_OK(clkmgr_testutils_enable_clock_counts_with_expected_thresholds(
111 &clkmgr,
false,
false,
122 aon_timer_testutils_wakeup_config(&aon_timer, wakeup_threshold));
126 dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup);
127 rv_plic_testutils_irq_range_enable(&rv_plic, kPlicTarget, irq_id, irq_id);
132 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
133 &pwrmgr, wakeup_sources,
135 kDifPwrmgrDomainOptionUsbClockInActivePower |
136 kDifPwrmgrDomainOptionMainPowerInLowPower));
138 LOG_INFO(
"TEST: Issue WFI to enter sleep");
144 CHECK_STATUS_OK(clkmgr_testutils_check_measurement_counts(&clkmgr));
145 bool all_enabled = UNWRAP(