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;
51 reg_base = PINMUX_MIO_PAD_SLEEP_STATUS_0_REG_OFFSET;
54 num_pads = PINMUX_PARAM_N_DIO_PADS;
55 reg_base = PINMUX_DIO_PAD_SLEEP_STATUS_REG_OFFSET;
60 if (index >= num_pads) {
63 *reg_offset = (ptrdiff_t)index / 32 + reg_base;
70 ptrdiff_t *reg_offset) {
75 reg_base = PINMUX_MIO_PERIPH_INSEL_REGWEN_0_REG_OFFSET;
76 reg_count = PINMUX_MIO_PERIPH_INSEL_REGWEN_MULTIREG_COUNT;
79 reg_base = PINMUX_MIO_OUTSEL_REGWEN_0_REG_OFFSET;
80 reg_count = PINMUX_MIO_OUTSEL_REGWEN_MULTIREG_COUNT;
83 reg_base = PINMUX_MIO_PAD_SLEEP_REGWEN_0_REG_OFFSET;
84 reg_count = PINMUX_MIO_PAD_SLEEP_REGWEN_MULTIREG_COUNT;
87 reg_base = PINMUX_DIO_PAD_SLEEP_REGWEN_0_REG_OFFSET;
88 reg_count = PINMUX_DIO_PAD_SLEEP_REGWEN_MULTIREG_COUNT;
91 reg_base = PINMUX_MIO_PAD_ATTR_REGWEN_0_REG_OFFSET;
92 reg_count = PINMUX_MIO_PAD_ATTR_REGWEN_MULTIREG_COUNT;
95 reg_base = PINMUX_DIO_PAD_ATTR_REGWEN_0_REG_OFFSET;
96 reg_count = PINMUX_DIO_PAD_ATTR_REGWEN_MULTIREG_COUNT;
99 reg_base = PINMUX_WKUP_DETECTOR_REGWEN_0_REG_OFFSET;
100 reg_count = PINMUX_WKUP_DETECTOR_REGWEN_MULTIREG_COUNT;
106 if (index >= reg_count) {
110 *reg_offset = reg_base + (ptrdiff_t)index * (ptrdiff_t)
sizeof(uint32_t);
117 if (pinmux == NULL) {
121 ptrdiff_t reg_offset;
122 if (!dif_pinmux_get_lock_reg_offset(index, target, ®_offset)) {
125 mmio_region_write32(pinmux->
base_addr, reg_offset, 0);
133 if (pinmux == NULL || is_locked == NULL) {
137 ptrdiff_t reg_offset;
138 if (!dif_pinmux_get_lock_reg_offset(index, target, ®_offset)) {
142 uint32_t reg_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
144 PINMUX_MIO_PERIPH_INSEL_REGWEN_0_EN_0_BIT);
151 if (pinmux == NULL || peripheral_input >= PINMUX_PARAM_N_MIO_PERIPH_IN ||
152 insel >= (2 + PINMUX_PARAM_N_MIO_PADS)) {
164 ptrdiff_t reg_offset =
165 PINMUX_MIO_PERIPH_INSEL_0_REG_OFFSET + (ptrdiff_t)(peripheral_input << 2);
168 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
175 if (pinmux == NULL || mio_pad_output >= PINMUX_PARAM_N_MIO_PADS ||
176 outsel >= (3 + PINMUX_PARAM_N_MIO_PERIPH_OUT)) {
188 ptrdiff_t reg_offset =
189 PINMUX_MIO_OUTSEL_0_REG_OFFSET + (ptrdiff_t)(mio_pad_output << 2);
192 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
199 reg_value, PINMUX_MIO_PAD_ATTR_0_SLEW_RATE_0_FIELD);
202 reg_value, PINMUX_MIO_PAD_ATTR_0_DRIVE_STRENGTH_0_FIELD);
204 pad_attrs.
flags |= kDifPinmuxPadAttrInvertLevel;
207 PINMUX_MIO_PAD_ATTR_0_VIRTUAL_OD_EN_0_BIT)) {
208 pad_attrs.
flags |= kDifPinmuxPadAttrVirtualOpenDrain;
211 pad_attrs.
flags |= kDifPinmuxPadAttrPullResistorEnable;
214 pad_attrs.
flags |= kDifPinmuxPadAttrPullResistorUp;
217 pad_attrs.
flags |= kDifPinmuxPadAttrKeeper;
220 pad_attrs.
flags |= kDifPinmuxPadAttrSchmittTrigger;
223 pad_attrs.
flags |= kDifPinmuxPadAttrOpenDrain;
228 enum { kDifPinmuxPadAttrSpinWaitMicros = 5 };
235 if (pinmux == NULL || attrs_out == NULL) {
238 if (attrs_in.
drive_strength > PINMUX_MIO_PAD_ATTR_0_DRIVE_STRENGTH_0_MASK ||
239 attrs_in.
slew_rate > PINMUX_MIO_PAD_ATTR_0_SLEW_RATE_0_MASK) {
242 ptrdiff_t reg_offset;
243 if (!dif_pinmux_get_reg_offset(pad, type, PINMUX_MIO_PAD_ATTR_0_REG_OFFSET,
244 PINMUX_DIO_PAD_ATTR_0_REG_OFFSET,
261 uint32_t reg_before = mmio_region_read32(pinmux->
base_addr, reg_offset);
264 0, PINMUX_MIO_PAD_ATTR_0_SLEW_RATE_0_FIELD, attrs_in.
slew_rate);
266 reg_value, PINMUX_MIO_PAD_ATTR_0_DRIVE_STRENGTH_0_FIELD,
270 attrs_in.
flags & kDifPinmuxPadAttrInvertLevel);
273 attrs_in.
flags & kDifPinmuxPadAttrVirtualOpenDrain);
275 reg_value, PINMUX_MIO_PAD_ATTR_0_PULL_EN_0_BIT,
276 attrs_in.
flags & kDifPinmuxPadAttrPullResistorEnable);
279 attrs_in.
flags & kDifPinmuxPadAttrPullResistorUp);
282 attrs_in.
flags & kDifPinmuxPadAttrKeeper);
285 attrs_in.
flags & kDifPinmuxPadAttrSchmittTrigger);
287 attrs_in.
flags & kDifPinmuxPadAttrOpenDrain);
288 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
292 if ((attrs_before.
flags & kDifPinmuxPadAttrPullResistorEnable) !=
293 (attrs_in.
flags & kDifPinmuxPadAttrPullResistorEnable)) {
297 uint32_t read_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
298 *attrs_out = dif_pinmux_reg_to_pad_attr(read_value);
300 if (reg_value != read_value) {
310 if (pinmux == NULL || attrs == NULL) {
313 ptrdiff_t reg_offset;
314 if (!dif_pinmux_get_reg_offset(pad, type, PINMUX_MIO_PAD_ATTR_0_REG_OFFSET,
315 PINMUX_DIO_PAD_ATTR_0_REG_OFFSET,
319 uint32_t reg_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
320 *attrs = dif_pinmux_reg_to_pad_attr(reg_value);
328 if (pinmux == NULL) {
332 ptrdiff_t en_reg_offset, mode_reg_offset;
333 if (!dif_pinmux_get_reg_offset(
334 pad, type, PINMUX_MIO_PAD_SLEEP_EN_0_REG_OFFSET,
335 PINMUX_DIO_PAD_SLEEP_EN_0_REG_OFFSET, &en_reg_offset)) {
338 if (!dif_pinmux_get_reg_offset(
339 pad, type, PINMUX_MIO_PAD_SLEEP_MODE_0_REG_OFFSET,
340 PINMUX_DIO_PAD_SLEEP_MODE_0_REG_OFFSET, &mode_reg_offset)) {
360 reg_value = PINMUX_MIO_PAD_SLEEP_MODE_0_OUT_0_VALUE_TIE_LOW;
363 reg_value = PINMUX_MIO_PAD_SLEEP_MODE_0_OUT_0_VALUE_TIE_HIGH;
366 reg_value = PINMUX_MIO_PAD_SLEEP_MODE_0_OUT_0_VALUE_HIGH_Z;
369 reg_value = PINMUX_MIO_PAD_SLEEP_MODE_0_OUT_0_VALUE_KEEP;
374 mmio_region_write32(pinmux->
base_addr, mode_reg_offset, reg_value);
378 mmio_region_write32(pinmux->
base_addr, en_reg_offset, reg_value);
385 if (pinmux == NULL) {
389 ptrdiff_t en_reg_offset;
390 if (!dif_pinmux_get_reg_offset(
391 pad, type, PINMUX_MIO_PAD_SLEEP_EN_0_REG_OFFSET,
392 PINMUX_DIO_PAD_SLEEP_EN_0_REG_OFFSET, &en_reg_offset)) {
409 mmio_region_write32(pinmux->
base_addr, en_reg_offset, 0);
416 bool *in_sleep_mode) {
417 if (pinmux == NULL || in_sleep_mode == NULL) {
421 ptrdiff_t reg_offset;
423 if (!dif_pinmux_get_sleep_status_bit(type, pad, ®_offset, &bit)) {
427 uint32_t reg_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
435 if (pinmux == NULL) {
439 ptrdiff_t reg_offset;
441 if (!dif_pinmux_get_sleep_status_bit(type, pad, ®_offset, &bit)) {
445 uint32_t reg_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
447 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
462 bool set_count =
false;
463 uint32_t reg_mode_value;
464 switch (config.
mode) {
466 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_POSEDGE;
469 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_NEGEDGE;
472 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_EDGE;
476 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_TIMEDHIGH;
480 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_TIMEDLOW;
491 bool reg_miodio_value;
494 if (config.
pad_select >= (2 + PINMUX_PARAM_N_MIO_PADS)) {
497 reg_miodio_value =
false;
500 if (config.
pad_select >= PINMUX_PARAM_N_DIO_PADS) {
503 reg_miodio_value =
true;
509 ptrdiff_t reg_offset = PINMUX_WKUP_DETECTOR_0_REG_OFFSET +
510 (ptrdiff_t)detector * (ptrdiff_t)
sizeof(uint32_t);
512 0, PINMUX_WKUP_DETECTOR_0_MODE_0_FIELD, reg_mode_value);
514 reg_value, PINMUX_WKUP_DETECTOR_0_FILTER_0_BIT, reg_filter_value);
516 reg_value, PINMUX_WKUP_DETECTOR_0_MIODIO_0_BIT, reg_miodio_value);
517 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
520 reg_offset = PINMUX_WKUP_DETECTOR_CNT_TH_0_REG_OFFSET +
521 (ptrdiff_t)detector * (ptrdiff_t)
sizeof(uint32_t);
524 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
527 reg_offset = PINMUX_WKUP_DETECTOR_PADSEL_0_REG_OFFSET +
528 (ptrdiff_t)detector * (ptrdiff_t)
sizeof(uint32_t);
530 0, PINMUX_WKUP_DETECTOR_PADSEL_0_SEL_0_FIELD, config.
pad_select);
531 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
533 reg_offset = PINMUX_WKUP_DETECTOR_EN_0_REG_OFFSET +
534 (ptrdiff_t)detector * (ptrdiff_t)
sizeof(uint32_t);
536 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
542 if (pinmux == NULL) {
545 if (detector >= PINMUX_PARAM_N_WKUP_DETECT) {
558 ptrdiff_t reg_offset = PINMUX_WKUP_DETECTOR_EN_0_REG_OFFSET +
559 (ptrdiff_t)
sizeof(uint32_t) * (ptrdiff_t)detector;
560 mmio_region_write32(pinmux->
base_addr, reg_offset, 0);
565 if (pinmux == NULL) {
568 mmio_region_write32(pinmux->
base_addr, PINMUX_WKUP_CAUSE_REG_OFFSET, 0);
573 uint32_t *detector_map) {
574 if (pinmux == NULL) {
578 mmio_region_read32(pinmux->
base_addr, PINMUX_WKUP_CAUSE_REG_OFFSET);