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);
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);
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);
202 mmio_region_write32(pinmux->base_addr, reg_offset, reg_value);
207 dt_periph_io_t periph_io,
209 if (dt_pad_type(pad) != kDtPadTypeMio ||
210 dt_periph_io_type(periph_io) != kDtPeriphIoTypeMio) {
214 pinmux, dt_periph_io_mio_periph_input(periph_io), dt_pad_mio_insel(pad));
219 dt_periph_io_t periph_io) {
220 if (dt_pad_type(pad) != kDtPadTypeMio ||
221 dt_periph_io_type(periph_io) != kDtPeriphIoTypeMio) {
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);
236 pad_attrs.
flags |= kDifPinmuxPadAttrInvertLevel;
239 PINMUX_MIO_PAD_ATTR_0_VIRTUAL_OD_EN_0_BIT)) {
240 pad_attrs.
flags |= kDifPinmuxPadAttrVirtualOpenDrain;
243 pad_attrs.
flags |= kDifPinmuxPadAttrPullResistorEnable;
246 pad_attrs.
flags |= kDifPinmuxPadAttrPullResistorUp;
249 pad_attrs.
flags |= kDifPinmuxPadAttrKeeper;
252 pad_attrs.
flags |= kDifPinmuxPadAttrSchmittTrigger;
255 pad_attrs.
flags |= kDifPinmuxPadAttrOpenDrain;
258 PINMUX_MIO_PAD_ATTR_0_INPUT_DISABLE_0_BIT)) {
259 pad_attrs.
flags |= kDifPinmuxPadAttrInputDisable;
264 enum { 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,
297 uint32_t reg_before = mmio_region_read32(pinmux->base_addr, reg_offset);
300 0, PINMUX_MIO_PAD_ATTR_0_SLEW_RATE_0_FIELD, attrs_in.
slew_rate);
302 reg_value, PINMUX_MIO_PAD_ATTR_0_DRIVE_STRENGTH_0_FIELD,
306 attrs_in.
flags & kDifPinmuxPadAttrInvertLevel);
309 attrs_in.
flags & kDifPinmuxPadAttrVirtualOpenDrain);
311 reg_value, PINMUX_MIO_PAD_ATTR_0_PULL_EN_0_BIT,
312 attrs_in.
flags & kDifPinmuxPadAttrPullResistorEnable);
315 attrs_in.
flags & kDifPinmuxPadAttrPullResistorUp);
318 attrs_in.
flags & kDifPinmuxPadAttrKeeper);
321 attrs_in.
flags & kDifPinmuxPadAttrSchmittTrigger);
323 attrs_in.
flags & kDifPinmuxPadAttrOpenDrain);
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)) {
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) {
357 switch (dt_pad_type(pad)) {
360 *index_out = dt_pad_mio_pad_index(pad);
364 *index_out = dt_pad_dio_pad_index(pad);
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)) {
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);
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)) {
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);
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);
534 mmio_region_write32(pinmux->base_addr, reg_offset, reg_value);
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;
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);
599 0, PINMUX_WKUP_DETECTOR_0_MODE_0_FIELD, reg_mode_value);
601 reg_value, PINMUX_WKUP_DETECTOR_0_FILTER_0_BIT, reg_filter_value);
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);
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);
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);
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);