5#include "sw/device/lib/testing/uart_testutils.h"
11#include "hw/top/dt/dt_pinmux.h"
18#include "sw/device/lib/testing/pinmux_testutils.h"
19#include "sw/device/lib/testing/test_framework/check.h"
21#include "hw/top/uart_regs.h"
23#define MODULE_ID MAKE_MODULE_ID('u', 't', 'u')
31static dt_uart_t get_uart_instance(uint8_t uart_idx) {
32 if (uart_idx >= kDtUartCount) {
49static status_t get_uart_pads_for_channel(
dt_uart_t uart_dt,
50 uart_pinmux_channel_t channel,
52#if defined(OPENTITAN_IS_DARJEELING)
55 return INVALID_ARGUMENT();
59#elif defined(OPENTITAN_IS_EARLGREY) || defined(OPENTITAN_IS_ENGLISHBREAKFAST)
81 return INVALID_ARGUMENT();
86 case kUartPinmuxChannelConsole:
90 case kUartPinmuxChannelDut:
95 return INVALID_ARGUMENT();
99 return UNIMPLEMENTED();
105status_t uart_testutils_select_pinmux(
const dif_pinmux_t *pinmux,
107 uart_pinmux_channel_t channel) {
108 TRY_CHECK(channel < kUartPinmuxChannelCount,
"Channel out of bounds");
110 dt_uart_t uart_dt = get_uart_instance(uart_idx);
111 TRY_CHECK(uart_dt < kDtUartCount,
"UART index out of bounds");
119 TRY(get_uart_pads_for_channel(uart_dt, channel, &rx_pad, &tx_pad));
122 TRY(dif_pinmux_mio_select_input(pinmux, rx_periph_io, rx_pad));
125 TRY(dif_pinmux_mio_select_output(pinmux, tx_pad, tx_periph_io));
130status_t uart_testutils_detach_pinmux(
const dif_pinmux_t *pinmux,
132 dt_uart_t uart_dt = get_uart_instance(uart_idx);
133 TRY_CHECK(uart_dt < kDtUartCount,
"UART index out of bounds");