10 #include "sw/device/lib/runtime/irq.h"
12 #include "sw/device/lib/testing/pwrmgr_testutils.h"
13 #include "sw/device/lib/testing/rand_testutils.h"
14 #include "sw/device/lib/testing/rv_plic_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();
25 static dif_gpio_t gpio;
26 static dif_pwrmgr_t pwrmgr;
27 static dif_pinmux_t pinmux;
29 static dif_rv_plic_t plic;
31 static plic_isr_ctx_t plic_ctx = {.rv_plic = &plic, .hart_id = kPlicTarget};
32 static pwrmgr_isr_ctx_t pwrmgr_isr_ctx = {
35 .expected_irq = kDifPwrmgrIrqWakeup,
40 static volatile const uint8_t kRounds = 2;
43 static const bool deepPowerdown =
false;
46 enum { kNumGpioPadsDv = 8, kNumGpioPadsSiVal = 4 };
51 static int first_gpio_pin;
56 void ottf_external_isr(uint32_t *exc_info) {
57 dif_pwrmgr_irq_t irq_id;
60 isr_testutils_pwrmgr_isr(plic_ctx, pwrmgr_isr_ctx, &peripheral, &irq_id);
64 "IRQ peripheral: %d is incorrect", peripheral);
65 CHECK(irq_id == kDifPwrmgrIrqWakeup,
"IRQ ID: %d is incorrect", irq_id);
89 void gpio_test(dif_pwrmgr_t *pwrmgr, dif_pinmux_t *pinmux, dif_gpio_t *gpio,
95 LOG_INFO(
"Current Test Round: %1d", round);
98 gpio_val = (uint8_t)(rand_testutils_gen32_range(0, gpio_mask));
109 LOG_INFO(
"Chosen GPIO value: %2x", gpio_val);
113 for (
int i = 0; i < num_gpio_pads; i++) {
122 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(
123 pwrmgr, kDifPwrmgrWakeupRequestSourceThree, pwrmgr_domain_cfg));
125 LOG_INFO(
"Entering low power mode.");
129 for (
int i = 0; i < num_gpio_pads; i++) {
134 LOG_INFO(
"Woke up from low power mode.");
137 bool end_round =
false;
141 }
while (!end_round);
149 void gpio_init(
const dif_pinmux_t *pinmux,
const dif_gpio_t *gpio) {
157 for (
int i = 0; i < num_gpio_pads; i++) {
179 gpio_mask = (1 << num_gpio_pads) - 1;
188 irq_global_ctrl(
true);
189 irq_external_ctrl(
true);
192 CHECK_DIF_OK(dif_pwrmgr_init(
194 CHECK_DIF_OK(dif_rv_plic_init(
196 CHECK_DIF_OK(dif_pinmux_init(
202 rv_plic_testutils_irq_range_enable(&plic, kPlicTarget,
219 if (deepPowerdown ==
false) {
221 pwrmgr_domain_cfg = kDifPwrmgrDomainOptionMainPowerInLowPower |
222 kDifPwrmgrDomainOptionUsbClockInActivePower;
225 LOG_INFO(
"Num Rounds: %3d", kRounds);
228 gpio_init(&pinmux, &gpio);
230 for (
int i = kRounds - 1; i >= 0; i--) {
231 gpio_test(&pwrmgr, &pinmux, &gpio, i);