11 #include "sw/device/lib/runtime/irq.h"
13 #include "sw/device/lib/testing/pwrmgr_testutils.h"
14 #include "sw/device/lib/testing/rstmgr_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();
24 kPowerUpTimeAonCycles = 7,
30 static volatile const uint8_t kNumLowPowerSamples;
31 static volatile const uint8_t kNumNormalPowerSamples;
32 static volatile const uint8_t kWakeUpTimeAonCycles;
34 static volatile const uint8_t kChannel0MaxLowByte;
35 static volatile const uint8_t kChannel0MaxHighByte;
36 static volatile const uint8_t kChannel0MinLowByte;
37 static volatile const uint8_t kChannel0MinHighByte;
39 static volatile const uint8_t kChannel1MaxLowByte;
40 static volatile const uint8_t kChannel1MaxHighByte;
41 static volatile const uint8_t kChannel1MinLowByte;
42 static volatile const uint8_t kChannel1MinHighByte;
44 static void configure_adc_ctrl(
const dif_adc_ctrl_t *adc_ctrl) {
50 .num_low_power_samples = kNumLowPowerSamples,
51 .num_normal_power_samples = kNumNormalPowerSamples,
52 .power_up_time_aon_cycles = kPowerUpTimeAonCycles,
53 .wake_up_time_aon_cycles = kWakeUpTimeAonCycles}));
56 static dif_adc_ctrl_t adc_ctrl;
57 static dif_rv_plic_t plic;
58 static volatile bool interrupt_expected =
false;
59 static volatile bool interrupt_serviced =
false;
61 void ottf_external_isr(uint32_t *exc_info) {
62 plic_isr_ctx_t plic_ctx = {.rv_plic = &plic,
65 adc_ctrl_isr_ctx_t adc_ctrl_ctx = {
66 .adc_ctrl = &adc_ctrl,
72 dif_adc_ctrl_irq_t adc_ctrl_irq;
73 isr_testutils_adc_ctrl_isr(plic_ctx, adc_ctrl_ctx,
false, &peripheral,
77 CHECK(adc_ctrl_irq == kDifAdcCtrlIrqMatchPending);
78 interrupt_serviced =
true;
81 CHECK(interrupt_expected);
84 static void en_plic_irqs(dif_rv_plic_t *plic) {
88 for (uint32_t i = 0; i <
ARRAYSIZE(plic_irqs); ++i) {
97 irq_global_ctrl(
true);
98 irq_external_ctrl(
true);
105 CHECK_DIF_OK(dif_adc_ctrl_init(
107 CHECK_DIF_OK(dif_pwrmgr_init(
109 CHECK_DIF_OK(dif_rstmgr_init(
111 CHECK_DIF_OK(dif_rv_plic_init(
115 CHECK_DIF_OK(dif_adc_ctrl_irq_set_enabled(
118 uint16_t channel0_filter0_max =
119 (uint16_t)(kChannel0MaxHighByte << 8) | kChannel0MaxLowByte;
120 uint16_t channel0_filter0_min =
121 (uint16_t)(kChannel0MinHighByte << 8) | kChannel0MinLowByte;
122 uint16_t channel1_filter0_max =
123 (uint16_t)(kChannel1MaxHighByte << 8) | kChannel1MaxLowByte;
124 uint16_t channel1_filter0_min =
125 (uint16_t)(kChannel1MinHighByte << 8) | kChannel1MinLowByte;
128 if (UNWRAP(pwrmgr_testutils_is_wakeup_reason(&pwrmgr, 0)) ==
true) {
130 interrupt_expected =
false;
137 configure_adc_ctrl(&adc_ctrl);
141 &adc_ctrl, kDifAdcCtrlChannel0,
143 .generate_irq_on_match =
true,
144 .generate_wakeup_on_match =
true,
146 .max_voltage = channel0_filter0_max,
147 .min_voltage = channel0_filter0_min},
150 &adc_ctrl, kDifAdcCtrlChannel1,
152 .generate_irq_on_match =
true,
153 .generate_wakeup_on_match =
true,
155 .max_voltage = channel1_filter0_max,
156 .min_voltage = channel1_filter0_min},
168 CHECK_STATUS_OK(rstmgr_testutils_pre_reset(&rstmgr));
169 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
170 &pwrmgr, kDifPwrmgrWakeupRequestSourceTwo, 0));
172 LOG_INFO(
"Issued WFI to enter sleep.");
173 test_status_set(kTestStatusInWfi);
175 }
else if (UNWRAP(pwrmgr_testutils_is_wakeup_reason(
176 &pwrmgr, kDifPwrmgrWakeupRequestSourceTwo)) ==
true) {
178 interrupt_expected =
true;
181 CHECK(UNWRAP(rstmgr_testutils_is_reset_info(
185 &adc_ctrl, kDifAdcCtrlChannel0, &adc_value));
186 CHECK(channel0_filter0_min <= adc_value &&
187 adc_value <= channel0_filter0_max);
190 &adc_ctrl, kDifAdcCtrlChannel1, &adc_value));
191 CHECK(channel1_filter0_min <= adc_value &&
192 adc_value <= channel1_filter0_max);
195 CHECK(interrupt_serviced);
201 LOG_ERROR(
"Unexpected wakeup detected: type = %d, request_source = %d",