52 #ifndef __GR533X_LL_MSIO_H__
53 #define __GR533X_LL_MSIO_H__
85 typedef struct _ll_msio_init
140 #define LL_MSIO_INPUT_POS ((uint32_t)0x0U)
141 #define LL_MSIO_OUTPUT_POS ((uint32_t)0x1U)
142 #define LL_MSIO_STRENGTH_DS0_MASK ((uint32_t)0x10U)
143 #define LL_MSIO_STRENGTH_DS1_MASK ((uint32_t)0x01U)
144 #define LL_MSIO_STRENGTH_DS0_POS ((uint32_t)0x04U)
145 #define LL_MSIO_STRENGTH_DS1_POS ((uint32_t)0x00U)
151 #define LL_MSIO_PIN_0 ((uint32_t)0x01U)
152 #define LL_MSIO_PIN_1 ((uint32_t)0x02U)
153 #define LL_MSIO_PIN_2 ((uint32_t)0x04U)
154 #define LL_MSIO_PIN_3 ((uint32_t)0x08U)
155 #define LL_MSIO_PIN_4 ((uint32_t)0x10U)
156 #define LL_MSIO_PIN_5 ((uint32_t)0x20U)
157 #define LL_MSIO_PIN_6 ((uint32_t)0x40U)
158 #define LL_MSIO_PIN_7 ((uint32_t)0x80U)
159 #define LL_MSIO_PIN_8 ((uint32_t)0x100U)
160 #define LL_MSIO_PIN_9 ((uint32_t)0x200U)
161 #define LL_MSIO_PIN_ALL ((uint32_t)0x3FFU)
168 #define LL_MSIO_DIRECTION_NONE ((uint32_t)0x0U)
169 #define LL_MSIO_DIRECTION_INPUT ((uint32_t)0x1U)
170 #define LL_MSIO_DIRECTION_OUTPUT ((uint32_t)0x2U)
171 #define LL_MSIO_DIRECTION_INOUT ((uint32_t)0x3U)
177 #define LL_MSIO_MODE_ANALOG ((uint32_t)0x1U)
178 #define LL_MSIO_MODE_DIGITAL ((uint32_t)0x0U)
184 #define LL_MSIO_PULL_NO ((uint32_t)0x0U)
185 #define LL_MSIO_PULL_UP ((uint32_t)0x1U)
186 #define LL_MSIO_PULL_DOWN ((uint32_t)0x2U)
192 #define LL_MSIO_SPEED_MEDIUM ((uint32_t)0x1U)
193 #define LL_MSIO_SPEED_HIGH ((uint32_t)0x0U)
199 #define LL_MSIO_STRENGTH_LOW ((uint32_t)0x00U)
200 #define LL_MSIO_STRENGTH_MEDIUM ((uint32_t)0x01U)
201 #define LL_MSIO_STRENGTH_HIGH ((uint32_t)0x10U)
202 #define LL_MSIO_STRENGTH_ULTRA ((uint32_t)0x11U)
208 #define LL_MSIO_INPUT_TYPE_CMOS ((uint32_t)0x00U)
209 #define LL_MSIO_INPUT_TYPE_SCHMITT ((uint32_t)0x01U)
229 #define LL_MSIO_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__))
237 #define LL_MSIO_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__)
258 #define LL_MSIO_DEFAULT_CONFIG \
260 .pin = LL_MSIO_PIN_ALL, \
261 .direction = LL_MSIO_DIRECTION_INPUT, \
262 .mode = LL_MSIO_MODE_DIGITAL, \
263 .pull = LL_MSIO_PULL_DOWN, \
264 .mux = IO_MUX_GPIO, \
265 .speed = LL_MSIO_SPEED_MEDIUM, \
266 .strength = LL_MSIO_STRENGTH_MEDIUM, \
267 .input_type = LL_MSIO_INPUT_TYPE_CMOS, \
312 __STATIC_INLINE
void ll_msio_set_pin_direction(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t direction)
314 uint32_t ie_mask = (pin_mask << AON_MSIO_A_PAD_CFG1_IE_POS) & AON_MSIO_A_PAD_CFG1_IE;
315 uint32_t oe_mask = (pin_mask << AON_MSIO_A_PAD_CFG0_OE_POS) & AON_MSIO_A_PAD_CFG0_OE;
316 uint32_t ie = ((direction == LL_MSIO_DIRECTION_INPUT) || (direction == LL_MSIO_DIRECTION_INOUT)) ? ie_mask : 0x0000U;
317 uint32_t oe = ((direction == LL_MSIO_DIRECTION_OUTPUT) || (direction == LL_MSIO_DIRECTION_INOUT)) ? oe_mask : 0x0000U;
318 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG1, ie_mask, ie);
319 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG0, oe_mask, oe);
351 __STATIC_INLINE uint32_t ll_msio_get_pin_direction(msio_pad_t MSIOx, uint32_t pin)
353 uint32_t ie_mask = (pin << AON_MSIO_A_PAD_CFG1_IE_POS) & AON_MSIO_A_PAD_CFG1_IE;
354 uint32_t oe_mask = (pin << AON_MSIO_A_PAD_CFG0_OE_POS) & AON_MSIO_A_PAD_CFG0_OE;
355 uint32_t ie = READ_BITS(AON_MSIO->MSIO_A_PAD_CFG1, ie_mask) >> (POSITION_VAL(pin));
356 uint32_t oe = READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, oe_mask) >> (POSITION_VAL(pin));
357 return (((ie >> AON_MSIO_A_PAD_CFG1_IE_POS) << LL_MSIO_INPUT_POS)
358 | ((oe >> AON_MSIO_A_PAD_CFG0_OE_POS) << LL_MSIO_OUTPUT_POS));
386 __STATIC_INLINE
void ll_msio_set_pin_mode(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t mode)
388 uint32_t mask = (pin_mask << AON_MSIO_A_PAD_CFG3_AE_POS) & AON_MSIO_A_PAD_CFG3_AE;
389 if(mode == LL_MSIO_MODE_ANALOG)
391 SET_BITS(AON_MSIO->MSIO_A_PAD_CFG3, mask);
395 CLEAR_BITS(AON_MSIO->MSIO_A_PAD_CFG3, mask);
424 __STATIC_INLINE uint32_t ll_msio_get_pin_mode(msio_pad_t MSIOx, uint32_t pin)
426 uint32_t mask = (pin << AON_MSIO_A_PAD_CFG3_AE_POS) & AON_MSIO_A_PAD_CFG3_AE;
427 return ((READ_BITS(AON_MSIO->MSIO_A_PAD_CFG3, mask) == mask) ? LL_MSIO_MODE_ANALOG : LL_MSIO_MODE_DIGITAL);
456 __STATIC_INLINE
void ll_msio_set_pin_input_type(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t type)
458 pin_mask = (pin_mask << AON_MSIO_A_PAD_CFG2_IS_POS) & AON_MSIO_A_PAD_CFG2_IS;
459 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG2, pin_mask, (type == LL_MSIO_INPUT_TYPE_SCHMITT) ? pin_mask : 0);
487 __STATIC_INLINE uint32_t ll_msio_get_pin_input_type(msio_pad_t MSIOx, uint32_t pin)
489 pin = (pin << AON_MSIO_A_PAD_CFG2_IS_POS) & AON_MSIO_A_PAD_CFG2_IS;
490 return ((uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG2, pin) == pin) ?
491 LL_MSIO_INPUT_TYPE_SCHMITT : LL_MSIO_INPUT_TYPE_CMOS);
521 __STATIC_INLINE
void ll_msio_set_pin_pull(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t pull)
523 uint32_t ps_mask = (pin_mask << AON_MSIO_A_PAD_CFG1_PS_POS) & AON_MSIO_A_PAD_CFG1_PS;
524 uint32_t pe_mask = (pin_mask << AON_MSIO_A_PAD_CFG1_PE_POS) & AON_MSIO_A_PAD_CFG1_PE;
525 uint32_t ps = (pull == LL_MSIO_PULL_UP) ? ps_mask : 0x0000U;
526 uint32_t pe = (pull == LL_MSIO_PULL_NO) ? 0x0000U : pe_mask;
527 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG1, pe_mask | ps_mask, pe | ps);
556 __STATIC_INLINE uint32_t ll_msio_get_pin_pull(msio_pad_t MSIOx, uint32_t pin)
558 uint32_t ps_mask = (pin << AON_MSIO_A_PAD_CFG1_PS_POS) & AON_MSIO_A_PAD_CFG1_PS;
559 uint32_t pe_mask = (pin << AON_MSIO_A_PAD_CFG1_PE_POS) & AON_MSIO_A_PAD_CFG1_PE;
560 return ((READ_BITS(AON_MSIO->MSIO_A_PAD_CFG1, pe_mask) == RESET) ? LL_MSIO_PULL_NO :
561 ((READ_BITS(AON_MSIO->MSIO_A_PAD_CFG1, ps_mask) == RESET) ? LL_MSIO_PULL_DOWN : LL_MSIO_PULL_UP));
590 __STATIC_INLINE
void ll_msio_set_pin_mux(msio_pad_t MSIOx, uint32_t pin, uint32_t mux)
592 if(IO_MUX_GPIO == mux)
594 CLEAR_BITS(AON_MSIO->MSIO_MCU_OVR, pin << AON_MSIO_MCU_OVR_MSIO_OVR_POS);
598 SET_BITS(AON_MSIO->MSIO_MCU_OVR, pin << AON_MSIO_MCU_OVR_MSIO_OVR_POS);
604 pin = POSITION_VAL(pin);
607 pos = (pin & 3) << 3;
609 MODIFY_REG(MCU_PAD->MSIO_PAD_MUX[
id], IO_MUX_BIT_MASK << pos, mux << pos);
635 __STATIC_INLINE uint32_t ll_msio_get_pin_mux(msio_pad_t MSIOx, uint32_t pin)
637 if (READ_BITS(AON_MSIO->MSIO_MCU_OVR, pin << AON_MSIO_MCU_OVR_MSIO_OVR_POS))
642 pin = POSITION_VAL(pin);
645 pos = (pin & 3) << 3;
647 return (READ_BITS(MCU_PAD->MSIO_PAD_MUX[
id], IO_MUX_BIT_MASK << pos) >> pos);
681 __STATIC_INLINE
void ll_msio_set_pin_speed(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t speed)
685 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG2, pin_mask << AON_MSIO_A_PAD_CFG2_SR_POS, pin_mask << AON_MSIO_A_PAD_CFG2_SR_POS);
689 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG2, pin_mask << AON_MSIO_A_PAD_CFG2_SR_POS, 0);
716 __STATIC_INLINE uint32_t ll_msio_get_pin_speed(msio_pad_t MSIOx, uint32_t pin)
719 pos = POSITION_VAL(pin);
720 return (READ_BITS(AON_MSIO->MSIO_A_PAD_CFG2, pin << AON_MSIO_A_PAD_CFG2_SR_POS) >> AON_MSIO_A_PAD_CFG2_SR_POS >> pos);
753 __STATIC_INLINE
void ll_msio_set_pin_strength(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t strength)
755 uint8_t ds0 = (strength & LL_MSIO_STRENGTH_DS0_MASK) >> LL_MSIO_STRENGTH_DS0_POS;
756 uint8_t ds1 = (strength & LL_MSIO_STRENGTH_DS1_MASK) >> LL_MSIO_STRENGTH_DS1_POS;
759 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG3, pin_mask << AON_MSIO_A_PAD_CFG3_DS0_POS , pin_mask << AON_MSIO_A_PAD_CFG3_DS0_POS);
763 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG3, pin_mask << AON_MSIO_A_PAD_CFG3_DS0_POS , 0);
767 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG3, pin_mask << AON_MSIO_A_PAD_CFG3_DS1_POS , pin_mask << AON_MSIO_A_PAD_CFG3_DS1_POS);
771 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG3, pin_mask << AON_MSIO_A_PAD_CFG3_DS1_POS , 0);
801 __STATIC_INLINE uint32_t ll_msio_get_pin_strength(msio_pad_t MSIOx, uint32_t pin_mask)
804 pos = POSITION_VAL(pin_mask);
805 uint8_t ds0 = READ_BITS(AON_MSIO->MSIO_A_PAD_CFG3, pin_mask << AON_MSIO_A_PAD_CFG3_DS0_POS ) >> AON_MSIO_A_PAD_CFG3_DS0_POS >> pos;
806 uint8_t ds1 = READ_BITS(AON_MSIO->MSIO_A_PAD_CFG3, pin_mask << AON_MSIO_A_PAD_CFG3_DS1_POS ) >> AON_MSIO_A_PAD_CFG3_DS1_POS >> pos;
807 return ((ds0 << LL_MSIO_STRENGTH_DS0_POS) | (ds1 << LL_MSIO_STRENGTH_DS1_POS));
825 __STATIC_INLINE uint32_t ll_msio_read_input_port(msio_pad_t MSIOx)
827 return (uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, AON_MSIO_A_PAD_CFG0_IN_VAL) >> AON_MSIO_A_PAD_CFG0_IN_VAL_POS);
852 __STATIC_INLINE uint32_t ll_msio_read_input_pin(msio_pad_t MSIOx, uint32_t pin_mask)
854 pin_mask = (pin_mask << AON_MSIO_A_PAD_CFG0_IN_VAL_POS) & AON_MSIO_A_PAD_CFG0_IN_VAL;
855 return (uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, pin_mask) == pin_mask);
880 __STATIC_INLINE uint32_t ll_msio_read_output_pin(msio_pad_t MSIOx, uint32_t pin_mask)
882 pin_mask = (pin_mask << AON_MSIO_A_PAD_CFG0_OUT_VAL_POS) & AON_MSIO_A_PAD_CFG0_OUT_VAL;
883 return (uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, pin_mask) == pin_mask);
897 __STATIC_INLINE
void ll_msio_write_output_port(msio_pad_t MSIOx, uint32_t port_value)
899 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG0, AON_MSIO_A_PAD_CFG0_OUT_VAL, (port_value << AON_MSIO_A_PAD_CFG0_OUT_VAL_POS) & AON_MSIO_A_PAD_CFG0_OUT_VAL);
911 __STATIC_INLINE uint32_t ll_msio_read_output_port(msio_pad_t MSIOx)
913 return (uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, AON_MSIO_A_PAD_CFG0_OUT_VAL) >> AON_MSIO_A_PAD_CFG0_OUT_VAL_POS);
938 __STATIC_INLINE
void ll_msio_set_output_pin(msio_pad_t MSIOx, uint32_t pin_mask)
940 SET_BITS(AON_MSIO->MSIO_A_PAD_CFG0, (pin_mask << AON_MSIO_A_PAD_CFG0_OUT_VAL_POS) & AON_MSIO_A_PAD_CFG0_OUT_VAL);
965 __STATIC_INLINE
void ll_msio_reset_output_pin(msio_pad_t MSIOx, uint32_t pin_mask)
967 CLEAR_BITS(AON_MSIO->MSIO_A_PAD_CFG0, (pin_mask << AON_MSIO_A_PAD_CFG0_OUT_VAL_POS) & AON_MSIO_A_PAD_CFG0_OUT_VAL);
992 __STATIC_INLINE
void ll_msio_toggle_pin(msio_pad_t MSIOx, uint32_t pin_mask)
994 WRITE_REG(AON_MSIO->MSIO_A_PAD_CFG0, (READ_REG(AON_MSIO->MSIO_A_PAD_CFG0) ^ ((pin_mask << AON_MSIO_A_PAD_CFG0_OUT_VAL_POS) & AON_MSIO_A_PAD_CFG0_OUT_VAL)));
1014 error_status_t ll_msio_init(msio_pad_t MSIOx,ll_msio_init_t *p_msio_init);