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;
226 PINMUX_MIO_PAD_ATTR_0_INPUT_DISABLE_0_BIT)) {
227 pad_attrs.
flags |= kDifPinmuxPadAttrInputDisable;
232 enum { kDifPinmuxPadAttrSpinWaitMicros = 5 };
239 if (pinmux == NULL || attrs_out == NULL) {
242 if (attrs_in.
drive_strength > PINMUX_MIO_PAD_ATTR_0_DRIVE_STRENGTH_0_MASK ||
243 attrs_in.
slew_rate > PINMUX_MIO_PAD_ATTR_0_SLEW_RATE_0_MASK) {
246 ptrdiff_t reg_offset;
247 if (!dif_pinmux_get_reg_offset(pad, type, PINMUX_MIO_PAD_ATTR_0_REG_OFFSET,
248 PINMUX_DIO_PAD_ATTR_0_REG_OFFSET,
265 uint32_t reg_before = mmio_region_read32(pinmux->
base_addr, reg_offset);
268 0, PINMUX_MIO_PAD_ATTR_0_SLEW_RATE_0_FIELD, attrs_in.
slew_rate);
270 reg_value, PINMUX_MIO_PAD_ATTR_0_DRIVE_STRENGTH_0_FIELD,
274 attrs_in.
flags & kDifPinmuxPadAttrInvertLevel);
277 attrs_in.
flags & kDifPinmuxPadAttrVirtualOpenDrain);
279 reg_value, PINMUX_MIO_PAD_ATTR_0_PULL_EN_0_BIT,
280 attrs_in.
flags & kDifPinmuxPadAttrPullResistorEnable);
283 attrs_in.
flags & kDifPinmuxPadAttrPullResistorUp);
286 attrs_in.
flags & kDifPinmuxPadAttrKeeper);
289 attrs_in.
flags & kDifPinmuxPadAttrSchmittTrigger);
291 attrs_in.
flags & kDifPinmuxPadAttrOpenDrain);
294 attrs_in.
flags & kDifPinmuxPadAttrInputDisable);
295 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
299 if ((attrs_before.
flags & kDifPinmuxPadAttrPullResistorEnable) !=
300 (attrs_in.
flags & kDifPinmuxPadAttrPullResistorEnable)) {
304 uint32_t read_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
305 *attrs_out = dif_pinmux_reg_to_pad_attr(read_value);
313 if (reg_value != read_value) {
323 if (pinmux == NULL || attrs == NULL) {
326 ptrdiff_t reg_offset;
327 if (!dif_pinmux_get_reg_offset(pad, type, PINMUX_MIO_PAD_ATTR_0_REG_OFFSET,
328 PINMUX_DIO_PAD_ATTR_0_REG_OFFSET,
332 uint32_t reg_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
333 *attrs = dif_pinmux_reg_to_pad_attr(reg_value);
341 if (pinmux == NULL) {
345 ptrdiff_t en_reg_offset, mode_reg_offset;
346 if (!dif_pinmux_get_reg_offset(
347 pad, type, PINMUX_MIO_PAD_SLEEP_EN_0_REG_OFFSET,
348 PINMUX_DIO_PAD_SLEEP_EN_0_REG_OFFSET, &en_reg_offset)) {
351 if (!dif_pinmux_get_reg_offset(
352 pad, type, PINMUX_MIO_PAD_SLEEP_MODE_0_REG_OFFSET,
353 PINMUX_DIO_PAD_SLEEP_MODE_0_REG_OFFSET, &mode_reg_offset)) {
373 reg_value = PINMUX_MIO_PAD_SLEEP_MODE_0_OUT_0_VALUE_TIE_LOW;
376 reg_value = PINMUX_MIO_PAD_SLEEP_MODE_0_OUT_0_VALUE_TIE_HIGH;
379 reg_value = PINMUX_MIO_PAD_SLEEP_MODE_0_OUT_0_VALUE_HIGH_Z;
382 reg_value = PINMUX_MIO_PAD_SLEEP_MODE_0_OUT_0_VALUE_KEEP;
387 mmio_region_write32(pinmux->
base_addr, mode_reg_offset, reg_value);
391 mmio_region_write32(pinmux->
base_addr, en_reg_offset, reg_value);
398 if (pinmux == NULL) {
402 ptrdiff_t en_reg_offset;
403 if (!dif_pinmux_get_reg_offset(
404 pad, type, PINMUX_MIO_PAD_SLEEP_EN_0_REG_OFFSET,
405 PINMUX_DIO_PAD_SLEEP_EN_0_REG_OFFSET, &en_reg_offset)) {
422 mmio_region_write32(pinmux->
base_addr, en_reg_offset, 0);
429 bool *in_sleep_mode) {
430 if (pinmux == NULL || in_sleep_mode == NULL) {
434 ptrdiff_t reg_offset;
436 if (!dif_pinmux_get_sleep_status_bit(type, pad, ®_offset, &bit)) {
440 uint32_t reg_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
448 if (pinmux == NULL) {
452 ptrdiff_t reg_offset;
454 if (!dif_pinmux_get_sleep_status_bit(type, pad, ®_offset, &bit)) {
458 uint32_t reg_value = mmio_region_read32(pinmux->
base_addr, reg_offset);
460 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
475 bool set_count =
false;
476 uint32_t reg_mode_value;
477 switch (config.
mode) {
479 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_POSEDGE;
482 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_NEGEDGE;
485 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_EDGE;
489 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_TIMEDHIGH;
493 reg_mode_value = PINMUX_WKUP_DETECTOR_0_MODE_0_VALUE_TIMEDLOW;
504 bool reg_miodio_value;
507 if (config.
pad_select >= (2 + PINMUX_PARAM_N_MIO_PADS)) {
510 reg_miodio_value =
false;
513 if (config.
pad_select >= PINMUX_PARAM_N_DIO_PADS) {
516 reg_miodio_value =
true;
522 ptrdiff_t reg_offset = PINMUX_WKUP_DETECTOR_0_REG_OFFSET +
523 (ptrdiff_t)detector * (ptrdiff_t)
sizeof(uint32_t);
525 0, PINMUX_WKUP_DETECTOR_0_MODE_0_FIELD, reg_mode_value);
527 reg_value, PINMUX_WKUP_DETECTOR_0_FILTER_0_BIT, reg_filter_value);
529 reg_value, PINMUX_WKUP_DETECTOR_0_MIODIO_0_BIT, reg_miodio_value);
530 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
533 reg_offset = PINMUX_WKUP_DETECTOR_CNT_TH_0_REG_OFFSET +
534 (ptrdiff_t)detector * (ptrdiff_t)
sizeof(uint32_t);
537 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
540 reg_offset = PINMUX_WKUP_DETECTOR_PADSEL_0_REG_OFFSET +
541 (ptrdiff_t)detector * (ptrdiff_t)
sizeof(uint32_t);
543 0, PINMUX_WKUP_DETECTOR_PADSEL_0_SEL_0_FIELD, config.
pad_select);
544 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
546 reg_offset = PINMUX_WKUP_DETECTOR_EN_0_REG_OFFSET +
547 (ptrdiff_t)detector * (ptrdiff_t)
sizeof(uint32_t);
549 mmio_region_write32(pinmux->
base_addr, reg_offset, reg_value);
555 if (pinmux == NULL) {
558 if (detector >= PINMUX_PARAM_N_WKUP_DETECT) {
571 ptrdiff_t reg_offset = PINMUX_WKUP_DETECTOR_EN_0_REG_OFFSET +
572 (ptrdiff_t)
sizeof(uint32_t) * (ptrdiff_t)detector;
573 mmio_region_write32(pinmux->
base_addr, reg_offset, 0);
578 if (pinmux == NULL) {
581 mmio_region_write32(pinmux->
base_addr, PINMUX_WKUP_CAUSE_REG_OFFSET, 0);
586 uint32_t *detector_map) {
587 if (pinmux == NULL) {
591 mmio_region_read32(pinmux->
base_addr, PINMUX_WKUP_CAUSE_REG_OFFSET);