blob: ea18a089df2ffe0a925ced2e8cd10a3fba815466 [file] [log] [blame]
// 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));
}