| // Copyright 2022 Google LLC. |
| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| #include "sw/device/lib/testing/pinmux_testutils.h" |
| |
| #include "hw/top_matcha/sw/autogen/top_matcha.h" |
| #include "sw/device/lib/base/macros.h" |
| #include "sw/device/lib/dif/dif_base.h" |
| #include "sw/device/lib/dif/dif_gpio.h" |
| #include "sw/device/lib/dif/dif_pinmux.h" |
| #include "sw/device/lib/runtime/hart.h" |
| #include "sw/device/lib/testing/test_framework/check.h" |
| |
| // NB: Keep these definitions aligned with |
| // hw/top_matcha/rtl/chip_matcha_verilator.sv and |
| // hw/top_matcha/dv/env/chip_if.sv |
| const dif_pinmux_index_t kPinmuxTestutilsGpioInselPins[kDifGpioNumPins] = { |
| kTopMatchaPinmuxInselIoa0, kTopMatchaPinmuxInselIoa1, |
| kTopMatchaPinmuxInselIoa2, kTopMatchaPinmuxInselIoa3, |
| kTopMatchaPinmuxInselIoa4, kTopMatchaPinmuxInselIoa5, |
| kTopMatchaPinmuxInselIoa6, kTopMatchaPinmuxInselIoa7, |
| kTopMatchaPinmuxInselIoa8, kTopMatchaPinmuxInselIob0, |
| kTopMatchaPinmuxInselIob1, kTopMatchaPinmuxInselIob2, |
| kTopMatchaPinmuxInselIob3, kTopMatchaPinmuxInselIob4, |
| kTopMatchaPinmuxInselIob5, kTopMatchaPinmuxInselIob6, |
| kTopMatchaPinmuxInselIob7, kTopMatchaPinmuxInselIob8, |
| kTopMatchaPinmuxInselIob10, kTopMatchaPinmuxInselIob11, |
| kTopMatchaPinmuxInselIob12, kTopMatchaPinmuxInselIoc6, |
| kTopMatchaPinmuxInselIoc0, kTopMatchaPinmuxInselIoc1, |
| kTopMatchaPinmuxInselIoc2, kTopMatchaPinmuxInselIoc7, |
| kTopMatchaPinmuxInselIoc9, kTopMatchaPinmuxInselIoc5, |
| kTopMatchaPinmuxInselIor6, kTopMatchaPinmuxInselIor7, |
| kTopMatchaPinmuxInselIoc8, kTopMatchaPinmuxInselIor10, |
| }; |
| |
| const dif_pinmux_index_t kPinmuxTestutilsGpioMioOutPins[kDifGpioNumPins] = { |
| kTopMatchaPinmuxMioOutIoa0, kTopMatchaPinmuxMioOutIoa1, |
| kTopMatchaPinmuxMioOutIoa2, kTopMatchaPinmuxMioOutIoa3, |
| kTopMatchaPinmuxMioOutIoa4, kTopMatchaPinmuxMioOutIoa5, |
| kTopMatchaPinmuxMioOutIoa6, kTopMatchaPinmuxMioOutIoa7, |
| kTopMatchaPinmuxMioOutIoa8, kTopMatchaPinmuxMioOutIob0, |
| kTopMatchaPinmuxMioOutIob1, kTopMatchaPinmuxMioOutIob2, |
| kTopMatchaPinmuxMioOutIob3, kTopMatchaPinmuxMioOutIob4, |
| kTopMatchaPinmuxMioOutIob5, kTopMatchaPinmuxMioOutIob6, |
| kTopMatchaPinmuxMioOutIob7, kTopMatchaPinmuxMioOutIob8, |
| kTopMatchaPinmuxMioOutIob10, kTopMatchaPinmuxMioOutIob11, |
| kTopMatchaPinmuxMioOutIob12, kTopMatchaPinmuxMioOutIoc6, |
| kTopMatchaPinmuxMioOutIoc0, kTopMatchaPinmuxMioOutIoc1, |
| kTopMatchaPinmuxMioOutIoc2, kTopMatchaPinmuxMioOutIoc7, |
| kTopMatchaPinmuxMioOutIoc9, kTopMatchaPinmuxMioOutIoc5, |
| kTopMatchaPinmuxMioOutIor6, kTopMatchaPinmuxMioOutIor7, |
| kTopMatchaPinmuxMioOutIoc8, kTopMatchaPinmuxMioOutIor10, |
| }; |
| |
| void pinmux_testutils_init(dif_pinmux_t *pinmux) { |
| for (int i = 0; i < kDifGpioNumPins; ++i) { |
| dif_pinmux_index_t mio = kPinmuxTestutilsGpioInselPins[i]; |
| dif_pinmux_index_t gpio = kTopMatchaPinmuxPeripheralInGpioGpio0 + i; |
| CHECK_DIF_OK(dif_pinmux_input_select(pinmux, gpio, mio)); |
| } |
| |
| for (int i = 0; i < kDifGpioNumPins; ++i) { |
| dif_pinmux_index_t mio = kPinmuxTestutilsGpioMioOutPins[i]; |
| dif_pinmux_index_t gpio = kTopMatchaPinmuxOutselGpioGpio0 + i; |
| CHECK_DIF_OK(dif_pinmux_output_select(pinmux, mio, gpio)); |
| } |
| |
| // Configure UART0 RX input to connect to MIO pad IOC3 |
| CHECK_DIF_OK(dif_pinmux_input_select( |
| pinmux, kTopMatchaPinmuxPeripheralInUart0Rx, kTopMatchaPinmuxInselIoc3)); |
| CHECK_DIF_OK(dif_pinmux_output_select(pinmux, kTopMatchaPinmuxMioOutIoc3, |
| kTopMatchaPinmuxOutselConstantHighZ)); |
| // Configure UART0 TX output to connect to MIO pad IOC4 |
| CHECK_DIF_OK(dif_pinmux_output_select(pinmux, kTopMatchaPinmuxMioOutIoc4, |
| kTopMatchaPinmuxOutselUart0Tx)); |
| |
| // Enable pull-ups on UART0 RX |
| // Pull-ups are available only on certain platforms. |
| if (kDeviceType == kDeviceSimDV) { |
| dif_pinmux_pad_attr_t out_attr; |
| dif_pinmux_pad_attr_t in_attr = { |
| .slew_rate = 0, |
| .drive_strength = 0, |
| .flags = kDifPinmuxPadAttrPullResistorEnable | |
| kDifPinmuxPadAttrPullResistorUp}; |
| |
| CHECK_DIF_OK(dif_pinmux_pad_write_attrs(pinmux, kTopMatchaMuxedPadsIoc3, |
| kDifPinmuxPadKindMio, in_attr, |
| &out_attr)); |
| CHECK_DIF_OK(dif_pinmux_pad_write_attrs(pinmux, kTopMatchaMuxedPadsIoc10, |
| kDifPinmuxPadKindMio, in_attr, |
| &out_attr)); |
| }; |
| |
| // Configure SMC_UART RX input to connect to MIO pad IOC10 |
| CHECK_DIF_OK(dif_pinmux_input_select(pinmux, |
| kTopMatchaPinmuxPeripheralInSmcUartRx, |
| kTopMatchaPinmuxInselIoc10)); |
| CHECK_DIF_OK(dif_pinmux_output_select(pinmux, kTopMatchaPinmuxMioOutIoc10, |
| kTopMatchaPinmuxOutselConstantHighZ)); |
| // Configure SMC_UART TX output to connect to MIO pad IOC11 |
| CHECK_DIF_OK(dif_pinmux_output_select(pinmux, kTopMatchaPinmuxMioOutIoc11, |
| kTopMatchaPinmuxOutselSmcUartTx)); |
| } |