[sw/pinmux] Add DIF to set pinmux insel Signed-off-by: Alexander Williams <awill@google.com>
diff --git a/sw/device/lib/dif/dif_pinmux.c b/sw/device/lib/dif/dif_pinmux.c index ef1343b..7bc798f 100644 --- a/sw/device/lib/dif/dif_pinmux.c +++ b/sw/device/lib/dif/dif_pinmux.c
@@ -4,9 +4,26 @@ #include "sw/device/lib/dif/dif_pinmux.h" +#include "sw/device/lib/base/bitfield.h" #include "sw/device/lib/dif/dif_base.h" #include "pinmux_regs.h" // Generated. // This just exists to check that the header compiles for now. The actual // implementation is work in progress. + +OT_WARN_UNUSED_RESULT +dif_result_t dif_pinmux_input_select(const dif_pinmux_t *pinmux, + dif_pinmux_index_t peripheral_input, + dif_pinmux_index_t insel) { + if (pinmux == NULL || peripheral_input >= PINMUX_PARAM_N_MIO_PERIPH_IN || + insel >= (2 + PINMUX_PARAM_N_MIO_PADS)) { + return kDifBadArg; + } + uint32_t reg_offset = + PINMUX_MIO_PERIPH_INSEL_0_REG_OFFSET + (peripheral_input << 2); + uint32_t reg_value = + bitfield_field32_write(0, PINMUX_MIO_PERIPH_INSEL_0_IN_0_FIELD, insel); + mmio_region_write32(pinmux->base_addr, reg_offset, reg_value); + return kDifOk; +}