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"
20 OTTF_DEFINE_TEST_CONFIG();
23 static const uint32_t kPlicTarget = 0;
24 static dif_gpio_t gpio;
25 static dif_pwrmgr_t pwrmgr;
26 static dif_pinmux_t pinmux;
28 static dif_rv_plic_t plic;
30 static const dt_pwrmgr_t kPwrmgrDt = 0;
31 static_assert(kDtPwrmgrCount == 1,
"this test expects a pwrmgr");
32 static const dt_rv_plic_t kRvPlicDt = 0;
33 static_assert(kDtRvPlicCount == 1,
"this test expects exactly one rv_plic");
34 static const dt_pinmux_t kPinmuxDt = 0;
35 static_assert(kDtPinmuxCount == 1,
"this test expects exactly one pinmux");
36 static const dt_gpio_t kGpioDt = 0;
37 static_assert(kDtGpioCount == 1,
"this test expects exactly one gpio");
41 static volatile const uint8_t kRounds = 2;
44 static const bool deepPowerdown =
false;
47 enum { kNumGpioPadsDv = 8, kNumGpioPadsSiVal = 4 };
52 static int first_gpio_pin;
57 bool ottf_handle_irq(uint32_t *exc_info, dt_instance_id_t devid,
59 if (devid == dt_pwrmgr_instance_id(kPwrmgrDt) &&
60 irq_id == dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup)) {
62 CHECK_DIF_OK(dif_pwrmgr_irq_acknowledge(&pwrmgr, kDtPwrmgrIrqWakeup));
86 void gpio_test(dif_pwrmgr_t *pwrmgr, dif_pinmux_t *pinmux, dif_gpio_t *gpio,
92 LOG_INFO(
"Current Test Round: %1d", round);
95 gpio_val = (uint8_t)(rand_testutils_gen32_range(0, gpio_mask));
106 LOG_INFO(
"Chosen GPIO value: %2x", gpio_val);
110 for (
int i = 0; i < num_gpio_pads; i++) {
122 kDtPinmuxWakeupPinWkupReq, &wakeup_sources));
123 CHECK_STATUS_OK(pwrmgr_testutils_enable_low_power(pwrmgr, wakeup_sources,
126 LOG_INFO(
"Entering low power mode.");
130 for (
int i = 0; i < num_gpio_pads; i++) {
135 LOG_INFO(
"Woke up from low power mode.");
138 bool end_round =
false;
142 }
while (!end_round);
150 void gpio_init(
const dif_pinmux_t *pinmux,
const dif_gpio_t *gpio) {
158 for (
int i = 0; i < num_gpio_pads; i++) {
180 gpio_mask = (1 << num_gpio_pads) - 1;
189 irq_global_ctrl(
true);
190 irq_external_ctrl(
true);
193 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
194 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kRvPlicDt, &plic));
195 CHECK_DIF_OK(dif_pinmux_init_from_dt(kPinmuxDt, &pinmux));
196 CHECK_DIF_OK(dif_gpio_init_from_dt(kGpioDt, &gpio));
200 dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup);
201 rv_plic_testutils_irq_range_enable(&plic, kPlicTarget, plic_id, plic_id);
217 if (deepPowerdown ==
false) {
219 pwrmgr_domain_cfg = kDifPwrmgrDomainOptionMainPowerInLowPower |
220 kDifPwrmgrDomainOptionUsbClockInActivePower;
223 LOG_INFO(
"Num Rounds: %3d", kRounds);
226 gpio_init(&pinmux, &gpio);
228 for (
int i = kRounds - 1; i >= 0; i--) {
229 gpio_test(&pwrmgr, &pinmux, &gpio, i);