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"
24 #include "sw/device/lib/testing/autogen/isr_testutils.h"
26 OTTF_DEFINE_TEST_CONFIG();
28 static dif_pinmux_t pinmux;
29 static dif_gpio_t gpio;
31 static dif_pwrmgr_t pwrmgr;
32 static dif_aon_timer_t aon_timer;
33 static dif_rv_plic_t plic;
34 static plic_isr_ctx_t plic_ctx = {.rv_plic = &plic,
36 static pwrmgr_isr_ctx_t pwrmgr_isr_ctx = {
39 .expected_irq = kDifPwrmgrIrqWakeup,
42 static status_t enter_low_power(
void) {
45 kDifPwrmgrDomainOptionMainPowerInLowPower;
52 irq_global_ctrl(
false);
54 TRY(pwrmgr_testutils_enable_low_power(
55 &pwrmgr, kDifPwrmgrWakeupRequestSourceThree, pwrmgr_domain_cfg));
58 TRY_CHECK(UNWRAP(pwrmgr_testutils_is_wakeup_reason(
59 &pwrmgr, kDifPwrmgrWakeupRequestSourceThree)));
70 irq_global_ctrl(
true);
75 static status_t configure_spi_flash_mode(
void) {
78 .manufacturer_id = 0x74,
79 .continuation_code = 0x17,
80 .num_continuation_code = 2,
93 .
opcode = kSpiDeviceFlashOpReadJedec,
97 .payload_dir_to_host =
false,
114 CHECK_DIF_OK(dif_pwrmgr_init(addr, &pwrmgr));
117 CHECK_DIF_OK(dif_aon_timer_init(addr, &aon_timer));
120 CHECK_DIF_OK(dif_pinmux_init(addr, &pinmux));
123 CHECK_DIF_OK(dif_rv_plic_init(addr, &plic));
126 CHECK_DIF_OK(dif_gpio_init(addr, &gpio));
135 irq_global_ctrl(
true);
136 irq_external_ctrl(
true);
141 .signal_filter =
false,
149 LOG_INFO(
"Setting SPI_DIO1 to high when sleeping");
162 LOG_INFO(
"Use IOA7 to let host know when sleep is active.");
173 LOG_INFO(
"Setting SPI_DIO1 to low when sleeping");
215 .signal_filter =
false,
217 .pad_select = kTopEarlgreyDirectPadsSpiDeviceCsb,
221 configure_spi_flash_mode();
231 void ottf_external_isr(uint32_t *exc_info) {
232 dif_pwrmgr_irq_t irq_id;
235 isr_testutils_pwrmgr_isr(plic_ctx, pwrmgr_isr_ctx, &peripheral, &irq_id);
239 "IRQ peripheral: %d is incorrect", peripheral);
240 CHECK(irq_id == kDifPwrmgrIrqWakeup,
"IRQ ID: %d is incorrect", irq_id);