8 #include "sw/device/lib/base/status.h"
14 #include "sw/device/lib/runtime/irq.h"
16 #include "sw/device/lib/testing/json/command.h"
17 #include "sw/device/lib/testing/json/gpio.h"
18 #include "sw/device/lib/testing/json/pinmux_config.h"
19 #include "sw/device/lib/testing/rv_plic_testutils.h"
20 #include "sw/device/lib/testing/test_framework/check.h"
21 #include "sw/device/lib/testing/test_framework/ottf_isrs.h"
23 #include "sw/device/lib/testing/test_framework/ujson_ottf.h"
24 #include "sw/device/lib/ujson/ujson.h"
28 OTTF_DEFINE_TEST_CONFIG(.enable_uart_flow_control =
true);
30 static dif_gpio_t gpio;
31 static dif_pinmux_t pinmux;
32 static dif_uart_t uart0;
33 static dif_rv_plic_t plic;
34 static const uint32_t kExpected_intr[] = {17, 18, 19, 20, 21,
36 static uint32_t intr_index = 0;
40 test_command_t command;
41 TRY(ujson_deserialize_test_command_t(uj, &command));
43 case kTestCommandGpioSet:
44 RESP_ERR(uj, gpio_set(uj, &gpio));
46 case kTestCommandGpioGet:
47 RESP_ERR(uj, gpio_get(uj, &gpio));
49 case kTestCommandPinmuxConfig:
50 RESP_ERR(uj, pinmux_config(uj, &pinmux));
53 LOG_ERROR(
"Unrecognized command: %d", command);
54 RESP_ERR(uj, INVALID_ARGUMENT());
67 void ottf_external_isr(uint32_t *exc_info) {
91 CHECK(gpio_pin_irq_fired == kExpected_intr[intr_index],
92 "Unexpected interrupt rcv:%d exp:%d", gpio_pin_irq_fired,
93 kExpected_intr[intr_index]);
95 if (intr_index ==
ARRAYSIZE(kExpected_intr)) {
104 CHECK_DIF_OK(dif_gpio_irq_set_enabled(&gpio, gpio_pin_irq_fired,
106 CHECK_DIF_OK(dif_gpio_irq_acknowledge(&gpio, gpio_pin_irq_fired));
113 CHECK_DIF_OK(dif_pinmux_init(
117 CHECK_DIF_OK(dif_rv_plic_init(
119 CHECK_DIF_OK(dif_uart_init(
122 rv_plic_testutils_irq_range_enable(
129 ujson_t uj = ujson_ottf_console();
131 status_t s = command_processor(&uj);