52 #ifndef __GR55XX_LL_MSIO_H__
53 #define __GR55XX_LL_MSIO_H__
62 #if defined(AON_MSIO) || defined(MCU_RET)
85 typedef struct _ll_msio_init
130 #define LL_MSIO_PIN_0 ((uint32_t)0x01U)
131 #define LL_MSIO_PIN_1 ((uint32_t)0x02U)
132 #define LL_MSIO_PIN_2 ((uint32_t)0x04U)
133 #define LL_MSIO_PIN_3 ((uint32_t)0x08U)
134 #define LL_MSIO_PIN_4 ((uint32_t)0x10U)
135 #define LL_MSIO_PIN_5 ((uint32_t)0x20U)
136 #define LL_MSIO_PIN_6 ((uint32_t)0x40U)
137 #define LL_MSIO_PIN_7 ((uint32_t)0x80U)
138 #define LL_MSIO_PIN_ALL ((uint32_t)0xFFU)
145 #define LL_MSIO_DIRECTION_NONE ((uint32_t)0x0U)
146 #define LL_MSIO_DIRECTION_INPUT ((uint32_t)0x1U)
147 #define LL_MSIO_DIRECTION_OUTPUT ((uint32_t)0x2U)
148 #define LL_MSIO_DIRECTION_INOUT ((uint32_t)0x3U)
154 #define LL_MSIO_MODE_ANALOG ((uint32_t)0x0U)
155 #define LL_MSIO_MODE_DIGITAL ((uint32_t)0x1U)
161 #define LL_MSIO_PULL_NO ((uint32_t)0x0U)
162 #define LL_MSIO_PULL_UP ((uint32_t)0x1U)
163 #define LL_MSIO_PULL_DOWN ((uint32_t)0x2U)
169 #define LL_MSIO_MUX_0 ((uint32_t)0x0U)
170 #define LL_MSIO_MUX_1 ((uint32_t)0x1U)
171 #define LL_MSIO_MUX_2 ((uint32_t)0x2U)
172 #define LL_MSIO_MUX_3 ((uint32_t)0x3U)
173 #define LL_MSIO_MUX_4 ((uint32_t)0x4U)
174 #define LL_MSIO_MUX_5 ((uint32_t)0x5U)
175 #define LL_MSIO_MUX_6 ((uint32_t)0x6U)
176 #define LL_MSIO_MUX_7 ((uint32_t)0x7U)
197 #define LL_MSIO_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__))
205 #define LL_MSIO_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__)
226 #define LL_MSIO_DEFAULT_CONFIG \
228 .pin = LL_MSIO_PIN_ALL, \
229 .direction = LL_MSIO_DIRECTION_INPUT, \
230 .mode = LL_MSIO_MODE_DIGITAL, \
231 .pull = LL_MSIO_PULL_DOWN, \
232 .mux = LL_MSIO_MUX_7, \
275 __STATIC_INLINE
void ll_msio_set_pin_direction(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t direction)
277 uint32_t oe_mask = (pin_mask << AON_MSIO_MSIO_A_PAD_CFG0_OUT_EN_POS) & AON_MSIO_MSIO_A_PAD_CFG0_OUT_EN;
278 uint32_t ie_mask = (pin_mask << AON_MSIO_MSIO_A_PAD_CFG1_IN_EN_POS) & AON_MSIO_MSIO_A_PAD_CFG1_IN_EN;
280 if (direction != LL_MSIO_DIRECTION_NONE)
282 if (direction != LL_MSIO_DIRECTION_INOUT)
284 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG0, oe_mask, (direction == LL_MSIO_DIRECTION_OUTPUT) ? 0x00 : oe_mask);
285 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG1, ie_mask, (direction == LL_MSIO_DIRECTION_INPUT) ? 0x00 : ie_mask);
289 CLEAR_BITS(AON_MSIO->MSIO_A_PAD_CFG0, oe_mask);
290 CLEAR_BITS(AON_MSIO->MSIO_A_PAD_CFG1, ie_mask);
295 SET_BITS(AON_MSIO->MSIO_A_PAD_CFG0, oe_mask);
296 SET_BITS(AON_MSIO->MSIO_A_PAD_CFG1, ie_mask);
326 __STATIC_INLINE uint32_t ll_msio_get_pin_direction(msio_pad_t MSIOx, uint32_t pin)
328 uint32_t oe_mask = (pin << AON_MSIO_MSIO_A_PAD_CFG0_OUT_EN_POS) & AON_MSIO_MSIO_A_PAD_CFG0_OUT_EN;
329 uint32_t ie_mask = (pin << AON_MSIO_MSIO_A_PAD_CFG1_IN_EN_POS) & AON_MSIO_MSIO_A_PAD_CFG1_IN_EN;
330 uint32_t mask = READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, oe_mask);
331 mask |= READ_BITS(AON_MSIO->MSIO_A_PAD_CFG1, ie_mask);
332 if (mask == (ie_mask | oe_mask))
333 return LL_MSIO_DIRECTION_NONE;
337 return LL_MSIO_DIRECTION_INOUT;
339 return ((mask == ie_mask) ? LL_MSIO_DIRECTION_OUTPUT : LL_MSIO_DIRECTION_INPUT);
366 __STATIC_INLINE
void ll_msio_set_pin_mode(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t mode)
368 uint32_t ae_mask = (pin_mask << AON_MSIO_MSIO_A_PAD_CFG1_A_EN_POS) & AON_MSIO_MSIO_A_PAD_CFG1_A_EN;
369 uint32_t ae_n = (mode == LL_MSIO_MODE_ANALOG) ? 0U : ae_mask;
370 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG1, ae_mask, ae_n);
396 __STATIC_INLINE uint32_t ll_msio_get_pin_mode(msio_pad_t MSIOx, uint32_t pin)
398 uint32_t ae_mask = (pin << AON_MSIO_MSIO_A_PAD_CFG1_A_EN_POS) & AON_MSIO_MSIO_A_PAD_CFG1_A_EN;
399 return ((READ_BITS(AON_MSIO->MSIO_A_PAD_CFG1, ae_mask) == ae_mask) ? LL_MSIO_MODE_DIGITAL : LL_MSIO_MODE_ANALOG);
427 __STATIC_INLINE
void ll_msio_set_pin_pull(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t pull)
429 if (pull != LL_MSIO_PULL_NO)
431 uint32_t rtype_mask = (pin_mask << AON_MSIO_MSIO_A_PAD_CFG1_R_TYPE_POS) & AON_MSIO_MSIO_A_PAD_CFG1_R_TYPE;
432 uint32_t rtype = (pull != LL_MSIO_PULL_UP) ? 0U : rtype_mask;
433 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG1, rtype_mask, rtype);
434 CLEAR_BITS(AON_MSIO->MSIO_A_PAD_CFG1,
435 (pin_mask << AON_MSIO_MSIO_A_PAD_CFG1_R_EN_POS) & AON_MSIO_MSIO_A_PAD_CFG1_R_EN);
439 SET_BITS(AON_MSIO->MSIO_A_PAD_CFG1,
440 (pin_mask << AON_MSIO_MSIO_A_PAD_CFG1_R_EN_POS) & AON_MSIO_MSIO_A_PAD_CFG1_R_EN);
468 __STATIC_INLINE uint32_t ll_msio_get_pin_pull(msio_pad_t MSIOx, uint32_t pin)
470 if (READ_BITS(AON_MSIO->MSIO_A_PAD_CFG1,
471 (pin << AON_MSIO_MSIO_A_PAD_CFG1_R_EN_POS) & AON_MSIO_MSIO_A_PAD_CFG1_R_EN))
473 return LL_MSIO_PULL_NO;
477 uint32_t rtype_mask = (pin << AON_MSIO_MSIO_A_PAD_CFG1_R_TYPE_POS) & AON_MSIO_MSIO_A_PAD_CFG1_R_TYPE;
478 return ((READ_BITS(AON_MSIO->MSIO_A_PAD_CFG1, rtype_mask) != RESET) ? LL_MSIO_PULL_UP : LL_MSIO_PULL_DOWN);
513 __STATIC_INLINE
void ll_msio_set_pin_mux(msio_pad_t MSIOx, uint32_t pin, uint32_t mux)
515 uint32_t pos = POSITION_VAL(pin) << 2;
516 if (LL_MSIO_MUX_7 == mux)
518 CLEAR_BITS(AON_MSIO->MSIO_MCU_OVR, pin << AON_MSIO_MSIO_MCU_OVR_MSIO_OVR_POS);
522 MODIFY_REG(MCU_RET->MSIO_A_PAD_MUX_CTL, 0xF << pos, mux << pos);
523 SET_BITS(AON_MSIO->MSIO_MCU_OVR, pin << AON_MSIO_MSIO_MCU_OVR_MSIO_OVR_POS);
555 __STATIC_INLINE uint32_t ll_msio_get_pin_mux(msio_pad_t MSIOx, uint32_t pin)
557 if (READ_BITS(AON_MSIO->MSIO_MCU_OVR, pin << AON_MSIO_MSIO_MCU_OVR_MSIO_OVR_POS))
559 uint32_t pos = POSITION_VAL(pin) << 2;
560 return (READ_BITS(MCU_RET->MSIO_A_PAD_MUX_CTL, 0xF << pos) >> pos);
564 return LL_MSIO_MUX_7;
584 __STATIC_INLINE uint32_t ll_msio_read_input_port(msio_pad_t MSIOx)
586 return (uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, AON_MSIO_MSIO_A_PAD_CFG0_IN) >> AON_MSIO_MSIO_A_PAD_CFG0_IN_POS);
609 __STATIC_INLINE uint32_t ll_msio_read_input_pin(msio_pad_t MSIOx, uint32_t pin_mask)
611 pin_mask = (pin_mask << AON_MSIO_MSIO_A_PAD_CFG0_IN_POS) & AON_MSIO_MSIO_A_PAD_CFG0_IN;
612 return (uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, pin_mask) == pin_mask);
635 __STATIC_INLINE uint32_t ll_msio_read_output_pin(msio_pad_t MSIOx, uint32_t pin_mask)
637 pin_mask = (pin_mask << AON_MSIO_MSIO_A_PAD_CFG0_OUT_POS) & AON_MSIO_MSIO_A_PAD_CFG0_OUT;
638 return (uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, pin_mask) == pin_mask);
652 __STATIC_INLINE
void ll_msio_write_output_port(msio_pad_t MSIOx, uint32_t port_value)
654 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG0, AON_MSIO_MSIO_A_PAD_CFG0_OUT, (port_value << AON_MSIO_MSIO_A_PAD_CFG0_OUT_POS) & AON_MSIO_MSIO_A_PAD_CFG0_OUT);
666 __STATIC_INLINE uint32_t ll_msio_read_output_port(msio_pad_t MSIOx)
668 return (uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, AON_MSIO_MSIO_A_PAD_CFG0_OUT) >> AON_MSIO_MSIO_A_PAD_CFG0_OUT_POS);
691 __STATIC_INLINE
void ll_msio_set_output_pin(msio_pad_t MSIOx, uint32_t pin_mask)
693 SET_BITS(AON_MSIO->MSIO_A_PAD_CFG0, (pin_mask << AON_MSIO_MSIO_A_PAD_CFG0_OUT_POS) & AON_MSIO_MSIO_A_PAD_CFG0_OUT);
716 __STATIC_INLINE
void ll_msio_reset_output_pin(msio_pad_t MSIOx, uint32_t pin_mask)
718 CLEAR_BITS(AON_MSIO->MSIO_A_PAD_CFG0, (pin_mask << AON_MSIO_MSIO_A_PAD_CFG0_OUT_POS) & AON_MSIO_MSIO_A_PAD_CFG0_OUT);
741 __STATIC_INLINE
void ll_msio_toggle_pin(msio_pad_t MSIOx, uint32_t pin_mask)
743 WRITE_REG(AON_MSIO->MSIO_A_PAD_CFG0, (READ_REG(AON_MSIO->MSIO_A_PAD_CFG0) ^ ((pin_mask << AON_MSIO_MSIO_A_PAD_CFG0_OUT_POS) & AON_MSIO_MSIO_A_PAD_CFG0_OUT)));
762 error_status_t ll_msio_init(msio_pad_t MSIOx,ll_msio_init_t *p_msio_init);