5#include "sw/device/lib/testing/pinmux_testutils.h"
7#include "dt/dt_pinmux.h"
11#include "sw/device/lib/base/status.h"
16#include "sw/device/lib/testing/test_framework/check.h"
21#if defined(OPENTITAN_IS_EARLGREY) || defined(OPENTITAN_IS_ENGLISHBREAKFAST)
32#elif defined(OPENTITAN_IS_DARJEELING)
46 CHECK_STATUS_OK(pinmux_testutils_connect(
49 CHECK_STATUS_OK(pinmux_testutils_connect(
52 CHECK_STATUS_OK(pinmux_testutils_connect(
57 CHECK_STATUS_OK(pinmux_testutils_connect(
61 CHECK_STATUS_OK(pinmux_testutils_connect(
65#ifdef OPENTITAN_IS_EARLGREY
73 .flags = kDifPinmuxPadAttrPullResistorEnable |
74 kDifPinmuxPadAttrPullResistorUp};
77 dif_pinmux_pad_write_attrs_dt(pinmux, kPadUart0Rx, in_attr, &out_attr));
83 CHECK_STATUS_OK(pinmux_testutils_connect(
87 CHECK_STATUS_OK(pinmux_testutils_connect(
92#ifdef OPENTITAN_IS_EARLGREY
107 .slew_rate = 0, .drive_strength = 1, .flags = 0};
109 CHECK_DIF_OK(dif_pinmux_pad_write_attrs_dt(pinmux, kDtPadUsbdevUsbDp,
110 in_attr, &out_attr));
111 CHECK_DIF_OK(dif_pinmux_pad_write_attrs_dt(pinmux, kDtPadUsbdevUsbDn,
112 in_attr, &out_attr));
116 CHECK_DIF_OK(dif_pinmux_mio_select_output(pinmux,
kDtPadIoc7,
117 kDtPeriphIoConstantHighZ));
121status_t pinmux_testutils_connect(
const dif_pinmux_t *pinmux,
127 return INVALID_ARGUMENT();
131 TRY(dif_pinmux_mio_select_input(pinmux, periph_io, pad));
135 TRY(dif_pinmux_mio_select_output(pinmux, pad, periph_io));
139 TRY(dif_pinmux_mio_select_output(pinmux, pad,
140 kDtPeriphIoConstantHighZ));
146 dt_periph_io_dio_pad(periph_io) != pad) {
147 return INVALID_ARGUMENT();
153 return INVALID_ARGUMENT();
157 return INVALID_ARGUMENT();
171#if defined(OPENTITAN_IS_EARLGREY) || defined(OPENTITAN_IS_ENGLISHBREAKFAST)
180#elif defined(OPENTITAN_IS_DARJEELING)
192#error Unsupported top
195uint32_t pinmux_testutils_get_testable_gpios_mask(
void) {
218 CHECK_DIF_OK(dif_pinmux_pad_write_attrs_dt(pinmux, pad, attr, &attr_out));
220 busy_spin_micros(100);
225 CHECK_DIF_OK(dif_gpio_read(gpio, io, &state));
226 uint32_t result = state ? 2 : 0;
231 attr.
flags = kDifPinmuxPadAttrPullResistorEnable |
232 (state ? 0 : kDifPinmuxPadAttrPullResistorUp);
233 CHECK_DIF_OK(dif_pinmux_pad_write_attrs_dt(pinmux, pad, attr, &attr_out));
235 busy_spin_micros(100);
238 CHECK_DIF_OK(dif_gpio_read(gpio, io, &state));
239 result += state ? 1 : 0;
245 strap |= pinmux_testutils_read_strap_pin(pinmux, gpio, 22, kPadStrap0);
246 strap |= pinmux_testutils_read_strap_pin(pinmux, gpio, 23, kPadStrap1) << 2;
247 strap |= pinmux_testutils_read_strap_pin(pinmux, gpio, 24, kPadStrap2) << 4;
251void pinmux_testutils_configure_pads(
const dif_pinmux_t *pinmux,
252 const pinmux_pad_attributes_t *attrs,
254 for (
size_t i = 0; i < num_attrs; ++i) {
257 dif_pinmux_pad_get_attrs_dt(pinmux, attrs[i].pad, &desired_attr));
258 desired_attr.
flags = attrs[i].flags;
259 CHECK_DIF_OK(dif_pinmux_pad_write_attrs_dt(pinmux, attrs[i].pad,
260 desired_attr, &actual_attr));