12#include "pinmux_regs.h"
16 ptrdiff_t mio_reg_base,
17 ptrdiff_t dio_reg_base,
18 ptrdiff_t *reg_offset) {
24 num_pads = PINMUX_PARAM_N_MIO_PADS;
25 reg_base = mio_reg_base;
28 num_pads = PINMUX_PARAM_N_DIO_PADS;
29 reg_base = dio_reg_base;
34 if (index >= num_pads) {
37 *reg_offset = reg_base + (ptrdiff_t)(index *
sizeof(uint32_t));
43 ptrdiff_t *reg_offset,
50 num_pads = PINMUX_PARAM_N_MIO_PADS;
52#ifdef PINMUX_MIO_PAD_SLEEP_STATUS_0_REG_OFFSET
53 reg_base = PINMUX_MIO_PAD_SLEEP_STATUS_0_REG_OFFSET;
55 reg_base = PINMUX_MIO_PAD_SLEEP_STATUS_REG_OFFSET;
59 num_pads = PINMUX_PARAM_N_DIO_PADS;
61#ifdef PINMUX_DIO_PAD_SLEEP_STATUS_0_REG_OFFSET
62 reg_base = PINMUX_DIO_PAD_SLEEP_STATUS_0_REG_OFFSET;
64 reg_base = PINMUX_DIO_PAD_SLEEP_STATUS_REG_OFFSET;
70 if (index >= num_pads) {
73 *reg_offset = (ptrdiff_t)index / 32 + reg_base;
80 ptrdiff_t *reg_offset) {
85 reg_base = PINMUX_MIO_PERIPH_INSEL_REGWEN_0_REG_OFFSET;
86 reg_count = PINMUX_MIO_PERIPH_INSEL_REGWEN_MULTIREG_COUNT;
89 reg_base = PINMUX_MIO_OUTSEL_REGWEN_0_REG_OFFSET;
90 reg_count = PINMUX_MIO_OUTSEL_REGWEN_MULTIREG_COUNT;
93 reg_base = PINMUX_MIO_PAD_SLEEP_REGWEN_0_REG_OFFSET;
94 reg_count = PINMUX_MIO_PAD_SLEEP_REGWEN_MULTIREG_COUNT;
97 reg_base = PINMUX_DIO_PAD_SLEEP_REGWEN_0_REG_OFFSET;
98 reg_count = PINMUX_DIO_PAD_SLEEP_REGWEN_MULTIREG_COUNT;
101 reg_base = PINMUX_MIO_PAD_ATTR_REGWEN_0_REG_OFFSET;
102 reg_count = PINMUX_MIO_PAD_ATTR_REGWEN_MULTIREG_COUNT;
105 reg_base = PINMUX_DIO_PAD_ATTR_REGWEN_0_REG_OFFSET;
106 reg_count = PINMUX_DIO_PAD_ATTR_REGWEN_MULTIREG_COUNT;
109 reg_base = PINMUX_WKUP_DETECTOR_REGWEN_0_REG_OFFSET;
110 reg_count = PINMUX_WKUP_DETECTOR_REGWEN_MULTIREG_COUNT;
116 if (index >= reg_count) {
120 *reg_offset = reg_base + (ptrdiff_t)index * (ptrdiff_t)
sizeof(uint32_t);
127 if (pinmux == NULL) {
131 ptrdiff_t reg_offset;
132 if (!dif_pinmux_get_lock_reg_offset(index, target, ®_offset)) {
135 mmio_region_write32(pinmux->
base_addr, reg_offset, 0);
143 if (pinmux == NULL || is_locked == NULL) {
147 ptrdiff_t reg_offset;
148 if (!dif_pinmux_get_lock_reg_offset(index, target, ®_offset)) {
152 uint32_t reg_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
153 *is_locked = !bitfield_bit32_read(reg_value,
154 PINMUX_MIO_PERIPH_INSEL_REGWEN_0_EN_0_BIT);
161 if (pinmux == NULL || peripheral_input >= PINMUX_PARAM_N_MIO_PERIPH_IN ||
162 insel >= (2 + PINMUX_PARAM_N_MIO_PADS)) {
174 ptrdiff_t reg_offset =
175 PINMUX_MIO_PERIPH_INSEL_0_REG_OFFSET + (ptrdiff_t)(peripheral_input << 2);
177 bitfield_field32_write(0, PINMUX_MIO_PERIPH_INSEL_0_IN_0_FIELD, insel);
178 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
185 if (pinmux == NULL || mio_pad_output >= PINMUX_PARAM_N_MIO_PADS ||
186 outsel >= (3 + PINMUX_PARAM_N_MIO_PERIPH_OUT)) {
198 ptrdiff_t reg_offset =
199 PINMUX_MIO_OUTSEL_0_REG_OFFSET + (ptrdiff_t)(mio_pad_output << 2);
201 bitfield_field32_write(0, PINMUX_MIO_OUTSEL_0_OUT_0_FIELD, outsel);
202 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
213 return dif_pinmux_input_select(
225 dt_periph_io_mio_outsel(periph_io));
231 reg_value, PINMUX_MIO_PAD_ATTR_0_SLEW_RATE_0_FIELD);
234 reg_value, PINMUX_MIO_PAD_ATTR_0_DRIVE_STRENGTH_0_FIELD);
235 if (bitfield_bit32_read(reg_value, PINMUX_MIO_PAD_ATTR_0_INVERT_0_BIT)) {
236 pad_attrs.
flags |= kDifPinmuxPadAttrInvertLevel;
238 if (bitfield_bit32_read(reg_value,
239 PINMUX_MIO_PAD_ATTR_0_VIRTUAL_OD_EN_0_BIT)) {
240 pad_attrs.
flags |= kDifPinmuxPadAttrVirtualOpenDrain;
242 if (bitfield_bit32_read(reg_value, PINMUX_MIO_PAD_ATTR_0_PULL_EN_0_BIT)) {
243 pad_attrs.
flags |= kDifPinmuxPadAttrPullResistorEnable;
245 if (bitfield_bit32_read(reg_value, PINMUX_MIO_PAD_ATTR_0_PULL_SELECT_0_BIT)) {
246 pad_attrs.
flags |= kDifPinmuxPadAttrPullResistorUp;
248 if (bitfield_bit32_read(reg_value, PINMUX_MIO_PAD_ATTR_0_KEEPER_EN_0_BIT)) {
249 pad_attrs.
flags |= kDifPinmuxPadAttrKeeper;
251 if (bitfield_bit32_read(reg_value, PINMUX_MIO_PAD_ATTR_0_SCHMITT_EN_0_BIT)) {
252 pad_attrs.
flags |= kDifPinmuxPadAttrSchmittTrigger;
254 if (bitfield_bit32_read(reg_value, PINMUX_MIO_PAD_ATTR_0_OD_EN_0_BIT)) {
255 pad_attrs.
flags |= kDifPinmuxPadAttrOpenDrain;
257 if (bitfield_bit32_read(reg_value,
258 PINMUX_MIO_PAD_ATTR_0_INPUT_DISABLE_0_BIT)) {
259 pad_attrs.
flags |= kDifPinmuxPadAttrInputDisable;
264enum { kDifPinmuxPadAttrSpinWaitMicros = 5 };
271 if (pinmux == NULL || attrs_out == NULL) {
274 if (attrs_in.
drive_strength > PINMUX_MIO_PAD_ATTR_0_DRIVE_STRENGTH_0_MASK ||
275 attrs_in.
slew_rate > PINMUX_MIO_PAD_ATTR_0_SLEW_RATE_0_MASK) {
278 ptrdiff_t reg_offset;
279 if (!dif_pinmux_get_reg_offset(pad, type, PINMUX_MIO_PAD_ATTR_0_REG_OFFSET,
280 PINMUX_DIO_PAD_ATTR_0_REG_OFFSET,
289 dif_pinmux_is_locked(pinmux, pad, lock_target, &is_locked);
297 uint32_t reg_before = mmio_region_read32(pinmux->
base_addr, reg_offset);
299 uint32_t reg_value = bitfield_field32_write(
300 0, PINMUX_MIO_PAD_ATTR_0_SLEW_RATE_0_FIELD, attrs_in.
slew_rate);
301 reg_value = bitfield_field32_write(
302 reg_value, PINMUX_MIO_PAD_ATTR_0_DRIVE_STRENGTH_0_FIELD,
305 bitfield_bit32_write(reg_value, PINMUX_MIO_PAD_ATTR_0_INVERT_0_BIT,
306 attrs_in.
flags & kDifPinmuxPadAttrInvertLevel);
308 bitfield_bit32_write(reg_value, PINMUX_MIO_PAD_ATTR_0_VIRTUAL_OD_EN_0_BIT,
309 attrs_in.
flags & kDifPinmuxPadAttrVirtualOpenDrain);
310 reg_value = bitfield_bit32_write(
311 reg_value, PINMUX_MIO_PAD_ATTR_0_PULL_EN_0_BIT,
312 attrs_in.
flags & kDifPinmuxPadAttrPullResistorEnable);
314 bitfield_bit32_write(reg_value, PINMUX_MIO_PAD_ATTR_0_PULL_SELECT_0_BIT,
315 attrs_in.
flags & kDifPinmuxPadAttrPullResistorUp);
317 bitfield_bit32_write(reg_value, PINMUX_MIO_PAD_ATTR_0_KEEPER_EN_0_BIT,
318 attrs_in.
flags & kDifPinmuxPadAttrKeeper);
320 bitfield_bit32_write(reg_value, PINMUX_MIO_PAD_ATTR_0_SCHMITT_EN_0_BIT,
321 attrs_in.
flags & kDifPinmuxPadAttrSchmittTrigger);
322 reg_value = bitfield_bit32_write(reg_value, PINMUX_MIO_PAD_ATTR_0_OD_EN_0_BIT,
323 attrs_in.
flags & kDifPinmuxPadAttrOpenDrain);
325 bitfield_bit32_write(reg_value, PINMUX_MIO_PAD_ATTR_0_INPUT_DISABLE_0_BIT,
326 attrs_in.
flags & kDifPinmuxPadAttrInputDisable);
327 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
331 if ((attrs_before.
flags & kDifPinmuxPadAttrPullResistorEnable) !=
332 (attrs_in.
flags & kDifPinmuxPadAttrPullResistorEnable)) {
333 busy_spin_micros(kDifPinmuxPadAttrSpinWaitMicros);
336 uint32_t read_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
337 *attrs_out = dif_pinmux_reg_to_pad_attr(read_value);
345 if (reg_value != read_value) {
354 if (index_out == NULL || type_out == NULL) {
379 dif_pinmux_pad_write_attrs(pinmux, index, type, attrs_in, attrs_out));
387 if (pinmux == NULL || attrs == NULL) {
390 ptrdiff_t reg_offset;
391 if (!dif_pinmux_get_reg_offset(pad, type, PINMUX_MIO_PAD_ATTR_0_REG_OFFSET,
392 PINMUX_DIO_PAD_ATTR_0_REG_OFFSET,
396 uint32_t reg_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
397 *attrs = dif_pinmux_reg_to_pad_attr(reg_value);
415 if (pinmux == NULL) {
419 ptrdiff_t en_reg_offset, mode_reg_offset;
420 if (!dif_pinmux_get_reg_offset(
421 pad, type, PINMUX_MIO_PAD_SLEEP_EN_0_REG_OFFSET,
422 PINMUX_DIO_PAD_SLEEP_EN_0_REG_OFFSET, &en_reg_offset)) {
425 if (!dif_pinmux_get_reg_offset(
426 pad, type, PINMUX_MIO_PAD_SLEEP_MODE_0_REG_OFFSET,
427 PINMUX_DIO_PAD_SLEEP_MODE_0_REG_OFFSET, &mode_reg_offset)) {
435 dif_pinmux_is_locked(pinmux, pad, lock_target, &is_locked);
447 reg_value = PINMUX_MIO_PAD_SLEEP_MODE_0_OUT_0_VALUE_TIE_LOW;
450 reg_value = PINMUX_MIO_PAD_SLEEP_MODE_0_OUT_0_VALUE_TIE_HIGH;
453 reg_value = PINMUX_MIO_PAD_SLEEP_MODE_0_OUT_0_VALUE_HIGH_Z;
456 reg_value = PINMUX_MIO_PAD_SLEEP_MODE_0_OUT_0_VALUE_KEEP;
461 mmio_region_write32(pinmux->
base_addr, mode_reg_offset, reg_value);
464 reg_value = bitfield_bit32_write(0, PINMUX_MIO_PAD_SLEEP_EN_0_EN_0_BIT, 1);
465 mmio_region_write32(pinmux->
base_addr, en_reg_offset, reg_value);
472 if (pinmux == NULL) {
476 ptrdiff_t en_reg_offset;
477 if (!dif_pinmux_get_reg_offset(
478 pad, type, PINMUX_MIO_PAD_SLEEP_EN_0_REG_OFFSET,
479 PINMUX_DIO_PAD_SLEEP_EN_0_REG_OFFSET, &en_reg_offset)) {
488 dif_pinmux_is_locked(pinmux, pad, lock_target, &is_locked);
496 mmio_region_write32(pinmux->
base_addr, en_reg_offset, 0);
503 bool *in_sleep_mode) {
504 if (pinmux == NULL || in_sleep_mode == NULL) {
508 ptrdiff_t reg_offset;
510 if (!dif_pinmux_get_sleep_status_bit(type, pad, ®_offset, &bit)) {
514 uint32_t reg_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
515 *in_sleep_mode = bitfield_bit32_read(reg_value, bit);
522 if (pinmux == NULL) {
526 ptrdiff_t reg_offset;
528 if (!dif_pinmux_get_sleep_status_bit(type, pad, ®_offset, &bit)) {
532 uint32_t reg_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
533 reg_value = bitfield_bit32_write(reg_value, bit, 0);
534 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
544 dif_result_t result = dif_pinmux_wakeup_detector_disable(pinmux, detector);
549 bool set_count =
false;
550 uint32_t reg_mode_value;
551 switch (config.
mode) {
553 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_POSEDGE;
556 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_NEGEDGE;
559 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_EDGE;
563 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_TIMEDHIGH;
567 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_TIMEDLOW;
573 bool reg_filter_value = dif_toggle_to_bool(config.
signal_filter);
578 bool reg_miodio_value;
581 if (config.
pad_select >= (2 + PINMUX_PARAM_N_MIO_PADS)) {
584 reg_miodio_value =
false;
587 if (config.
pad_select >= PINMUX_PARAM_N_DIO_PADS) {
590 reg_miodio_value =
true;
596 ptrdiff_t reg_offset = PINMUX_WKUP_DETECTOR_0_REG_OFFSET +
597 (ptrdiff_t)detector * (ptrdiff_t)
sizeof(uint32_t);
598 uint32_t reg_value = bitfield_field32_write(
599 0, PINMUX_WKUP_DETECTOR_0_MODE_0_FIELD, reg_mode_value);
600 reg_value = bitfield_bit32_write(
601 reg_value, PINMUX_WKUP_DETECTOR_0_FILTER_0_BIT, reg_filter_value);
602 reg_value = bitfield_bit32_write(
603 reg_value, PINMUX_WKUP_DETECTOR_0_MIODIO_0_BIT, reg_miodio_value);
604 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
607 reg_offset = PINMUX_WKUP_DETECTOR_CNT_TH_0_REG_OFFSET +
608 (ptrdiff_t)detector * (ptrdiff_t)
sizeof(uint32_t);
609 reg_value = bitfield_field32_write(
611 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
614 reg_offset = PINMUX_WKUP_DETECTOR_PADSEL_0_REG_OFFSET +
615 (ptrdiff_t)detector * (ptrdiff_t)
sizeof(uint32_t);
616 reg_value = bitfield_field32_write(
617 0, PINMUX_WKUP_DETECTOR_PADSEL_0_SEL_0_FIELD, config.
pad_select);
618 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
620 reg_offset = PINMUX_WKUP_DETECTOR_EN_0_REG_OFFSET +
621 (ptrdiff_t)detector * (ptrdiff_t)
sizeof(uint32_t);
622 reg_value = bitfield_bit32_write(0, PINMUX_WKUP_DETECTOR_EN_0_EN_0_BIT,
true);
623 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
629 if (pinmux == NULL) {
632 if (detector >= PINMUX_PARAM_N_WKUP_DETECT) {
645 ptrdiff_t reg_offset = PINMUX_WKUP_DETECTOR_EN_0_REG_OFFSET +
646 (ptrdiff_t)
sizeof(uint32_t) * (ptrdiff_t)detector;
647 mmio_region_write32(pinmux->
base_addr, reg_offset, 0);
652 if (pinmux == NULL) {
655 mmio_region_write32(pinmux->
base_addr, PINMUX_WKUP_CAUSE_REG_OFFSET, 0);
660 uint32_t *detector_map) {
661 if (pinmux == NULL) {
665 mmio_region_read32(pinmux->
base_addr, PINMUX_WKUP_CAUSE_REG_OFFSET);