10 #include "sw/device/lib/dif/dif_rv_core_ibex.h"
12 #include "sw/device/lib/runtime/irq.h"
14 #include "sw/device/lib/testing/aon_timer_testutils.h"
15 #include "sw/device/lib/testing/pwrmgr_testutils.h"
16 #include "sw/device/lib/testing/rv_plic_testutils.h"
17 #include "sw/device/lib/testing/spi_device_testutils.h"
18 #include "sw/device/lib/testing/spi_flash_emulator.h"
19 #include "sw/device/lib/testing/spi_flash_testutils.h"
20 #include "sw/device/lib/testing/test_framework/check.h"
25 OTTF_DEFINE_TEST_CONFIG();
27 static dif_pinmux_t pinmux;
28 static dif_gpio_t gpio;
30 static dif_pwrmgr_t pwrmgr;
31 static dif_aon_timer_t aon_timer;
32 static dif_rv_plic_t plic;
38 static const dt_pwrmgr_t kPwrmgrDt = 0;
39 static_assert(kDtPwrmgrCount == 1,
"this test expects a pwrmgr");
40 static const dt_rv_plic_t kRvPlicDt = 0;
41 static_assert(kDtRvPlicCount == 1,
"this test expects exactly one rv_plic");
42 static const dt_pinmux_t kPinmuxDt = 0;
43 static_assert(kDtPinmuxCount == 1,
"this test expects exactly one pinmux");
44 static const dt_aon_timer_t kAonTimerDt = 0;
45 static_assert(kDtAonTimerCount == 1,
"this test expects an aon_timer");
46 static const dt_gpio_t kGpioDt = 0;
47 static_assert(kDtGpioCount == 1,
"this test expects a gpio");
48 static const dt_spi_device_t kSpiDeviceDt = 0;
49 static_assert(kDtSpiDeviceCount >= 1,
50 "this test expects at least one spi_device");
52 static status_t enter_low_power(
void) {
55 kDifPwrmgrDomainOptionMainPowerInLowPower;
65 kDtPinmuxWakeupPinWkupReq, &wakeup_sources));
67 irq_global_ctrl(
false);
69 TRY(pwrmgr_testutils_enable_low_power(&pwrmgr, wakeup_sources,
73 TRY_CHECK(UNWRAP(pwrmgr_testutils_is_wakeup_reason(&pwrmgr, wakeup_sources)));
84 irq_global_ctrl(
true);
89 static status_t configure_spi_flash_mode(
void) {
92 .manufacturer_id = 0x74,
93 .continuation_code = 0x17,
94 .num_continuation_code = 2,
107 .
opcode = kSpiDeviceFlashOpReadJedec,
111 .payload_dir_to_host =
false,
125 CHECK_DIF_OK(dif_pwrmgr_init_from_dt(kPwrmgrDt, &pwrmgr));
127 CHECK_DIF_OK(dif_aon_timer_init_from_dt(kAonTimerDt, &aon_timer));
129 CHECK_DIF_OK(dif_pinmux_init_from_dt(kPinmuxDt, &pinmux));
131 CHECK_DIF_OK(dif_rv_plic_init_from_dt(kRvPlicDt, &plic));
133 CHECK_DIF_OK(dif_gpio_init_from_dt(kGpioDt, &gpio));
138 dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup);
139 rv_plic_testutils_irq_range_enable(&plic, kPlicTarget, plic_id, plic_id);
142 irq_global_ctrl(
true);
143 irq_external_ctrl(
true);
148 .signal_filter =
false,
156 LOG_INFO(
"Setting SPI_DIO1 to high when sleeping");
169 LOG_INFO(
"Use IOA7 to let host know when sleep is active.");
180 LOG_INFO(
"Setting SPI_DIO1 to low when sleeping");
222 .signal_filter =
false,
224 .pad_select = kTopEarlgreyDirectPadsSpiDeviceCsb,
228 configure_spi_flash_mode();
238 bool ottf_handle_irq(uint32_t *exc_info, dt_instance_id_t devid,
240 if (devid == dt_pwrmgr_instance_id(kPwrmgrDt) &&
241 irq_id == dt_pwrmgr_irq_to_plic_id(kPwrmgrDt, kDtPwrmgrIrqWakeup)) {
242 CHECK_DIF_OK(dif_pwrmgr_irq_acknowledge(&pwrmgr, kDtPwrmgrIrqWakeup));