5 #include "sw/device/lib/testing/pinmux_testutils.h"
7 #include "dt/dt_pinmux.h"
8 #include "dt/dt_uart.h"
11 #include "sw/device/lib/base/status.h"
16 #include "sw/device/lib/testing/test_framework/check.h"
18 static const dt_gpio_t kGpioDt = kDtGpio;
19 static const dt_uart_t kUart0Dt = kDtUart0;
21 #if defined(OPENTITAN_IS_EARLGREY) || defined(OPENTITAN_IS_ENGLISHBREAKFAST)
22 static const dt_pad_t kPadUart0Tx = kDtPadIoc4;
23 static const dt_pad_t kPadUart0Rx = kDtPadIoc3;
25 static const dt_uart_t kUart1Dt = kDtUart1;
26 static const dt_pad_t kPadUart1Tx = kDtPadIob5;
27 static const dt_pad_t kPadUart1Rx = kDtPadIob4;
28 static const dt_pad_t kPadStrap0 = kDtPadIoc0;
29 static const dt_pad_t kPadStrap1 = kDtPadIoc1;
30 static const dt_pad_t kPadStrap2 = kDtPadIoc2;
32 #elif defined(OPENTITAN_IS_DARJEELING)
33 static const dt_pad_t kPadUart0Tx = kDtPadUart0Tx;
34 static const dt_pad_t kPadUart0Rx = kDtPadUart0Rx;
36 static const dt_pad_t kPadStrap0 = kDtPadGpioGpio22;
37 static const dt_pad_t kPadStrap1 = kDtPadGpioGpio23;
38 static const dt_pad_t kPadStrap2 = kDtPadGpioGpio24;
41 #error Unsupported top
44 void pinmux_testutils_init(dif_pinmux_t *pinmux) {
46 CHECK_STATUS_OK(pinmux_testutils_connect(
47 pinmux, dt_gpio_periph_io(kGpioDt, kDtGpioPeriphIoGpio22),
48 kDtPeriphIoDirIn, kPadStrap0));
49 CHECK_STATUS_OK(pinmux_testutils_connect(
50 pinmux, dt_gpio_periph_io(kGpioDt, kDtGpioPeriphIoGpio23),
51 kDtPeriphIoDirIn, kPadStrap1));
52 CHECK_STATUS_OK(pinmux_testutils_connect(
53 pinmux, dt_gpio_periph_io(kGpioDt, kDtGpioPeriphIoGpio24),
54 kDtPeriphIoDirIn, kPadStrap2));
57 CHECK_STATUS_OK(pinmux_testutils_connect(
58 pinmux, dt_uart_periph_io(kUart0Dt, kDtUartPeriphIoRx), kDtPeriphIoDirIn,
61 CHECK_STATUS_OK(pinmux_testutils_connect(
62 pinmux, dt_uart_periph_io(kUart0Dt, kDtUartPeriphIoTx), kDtPeriphIoDirOut,
65 #ifdef OPENTITAN_IS_EARLGREY
73 .flags = kDifPinmuxPadAttrPullResistorEnable |
74 kDifPinmuxPadAttrPullResistorUp};
83 CHECK_STATUS_OK(pinmux_testutils_connect(
84 pinmux, dt_uart_periph_io(kUart1Dt, kDtUartPeriphIoRx), kDtPeriphIoDirIn,
87 CHECK_STATUS_OK(pinmux_testutils_connect(
88 pinmux, dt_uart_periph_io(kUart1Dt, kDtUartPeriphIoTx), kDtPeriphIoDirOut,
92 #ifdef OPENTITAN_IS_EARLGREY
107 .
slew_rate = 0, .drive_strength = 1, .flags = 0};
110 in_attr, &out_attr));
112 in_attr, &out_attr));
117 kDtPeriphIoConstantHighZ));
121 status_t pinmux_testutils_connect(
const dif_pinmux_t *pinmux,
122 dt_periph_io_t periph_io,
123 dt_periph_io_dir_t dir, dt_pad_t pad) {
124 switch (dt_periph_io_type(periph_io)) {
125 case kDtPeriphIoTypeMio:
126 if (dt_pad_type(pad) != kDtPadTypeMio) {
127 return INVALID_ARGUMENT();
130 if (dir == kDtPeriphIoDirIn || dir == kDtPeriphIoDirInout) {
134 if (dir == kDtPeriphIoDirOut || dir == kDtPeriphIoDirInout) {
138 else if (dt_periph_io_dir(periph_io) == kDtPeriphIoDirInout) {
140 kDtPeriphIoConstantHighZ));
143 case kDtPeriphIoTypeDio:
145 if (dt_pad_type(pad) != kDtPadTypeDio ||
146 dt_periph_io_dio_pad(periph_io) != pad) {
147 return INVALID_ARGUMENT();
150 dt_periph_io_dir_t io_dir = dt_periph_io_dir(periph_io);
151 if ((io_dir == kDtPeriphIoDirIn || io_dir == kDtPeriphIoDirOut) &&
153 return INVALID_ARGUMENT();
157 return INVALID_ARGUMENT();
171 #if defined(OPENTITAN_IS_EARLGREY) || defined(OPENTITAN_IS_ENGLISHBREAKFAST)
173 kDtPadIoa0, kDtPadIoa1, kDtPadIoa2, kDtPadIoa3, kDtPadIoa4,
174 kDtPadIoa5, kDtPadIoa6, kDtPadIoa7, kDtPadIoa8, kDtPadIob6,
175 kDtPadIob7, kDtPadIob8, kDtPadIob9, kDtPadIob10, kDtPadIob11,
176 kDtPadIob12, kDtPadIoc9, kDtPadIoc10, kDtPadIoc11, kDtPadIoc12,
177 kDtPadIor0, kDtPadIor1, kDtPadIor2, kDtPadIor3, kDtPadIor4,
178 kDtPadIor5, kDtPadIor6, kDtPadIor7, kDtPadIor10, kDtPadIor11,
179 kDtPadIor12, kDtPadIor13};
180 #elif defined(OPENTITAN_IS_DARJEELING)
182 kDtPadGpioGpio0, kDtPadGpioGpio1, kDtPadGpioGpio2, kDtPadGpioGpio3,
183 kDtPadGpioGpio4, kDtPadGpioGpio5, kDtPadGpioGpio6, kDtPadGpioGpio7,
184 kDtPadGpioGpio8, kDtPadGpioGpio9, kDtPadGpioGpio10, kDtPadGpioGpio11,
185 kDtPadGpioGpio12, kDtPadGpioGpio13, kDtPadGpioGpio14, kDtPadGpioGpio15,
186 kDtPadGpioGpio16, kDtPadGpioGpio17, kDtPadGpioGpio18, kDtPadGpioGpio19,
187 kDtPadGpioGpio20, kDtPadGpioGpio21, kDtPadGpioGpio22, kDtPadGpioGpio23,
188 kDtPadGpioGpio24, kDtPadGpioGpio25, kDtPadGpioGpio26, kDtPadGpioGpio27,
189 kDtPadGpioGpio28, kDtPadGpioGpio29, kDtPadGpioGpio30, kDtPadGpioGpio31,
192 #error Unsupported top
195 uint32_t pinmux_testutils_get_testable_gpios_mask(
void) {
213 uint32_t pinmux_testutils_read_strap_pin(dif_pinmux_t *pinmux, dif_gpio_t *gpio,
226 uint32_t result = state ? 2 : 0;
231 attr.
flags = kDifPinmuxPadAttrPullResistorEnable |
232 (state ? 0 : kDifPinmuxPadAttrPullResistorUp);
239 result += state ? 1 : 0;
243 uint32_t pinmux_testutils_read_straps(dif_pinmux_t *pinmux, dif_gpio_t *gpio) {
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;
251 void pinmux_testutils_configure_pads(
const dif_pinmux_t *pinmux,
254 for (
size_t i = 0; i < num_attrs; ++i) {
258 desired_attr.
flags = attrs[i].flags;
260 desired_attr, &actual_attr));