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
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_ALL ((uint32_t)0xFFU)
166 #define LL_MSIO_DIRECTION_NONE ((uint32_t)0x0U)
167 #define LL_MSIO_DIRECTION_INPUT ((uint32_t)0x1U)
168 #define LL_MSIO_DIRECTION_OUTPUT ((uint32_t)0x2U)
169 #define LL_MSIO_DIRECTION_INOUT ((uint32_t)0x3U)
175 #define LL_MSIO_MODE_ANALOG ((uint32_t)0x1U)
176 #define LL_MSIO_MODE_DIGITAL ((uint32_t)0x0U)
182 #define LL_MSIO_PULL_NO ((uint32_t)0x0U)
183 #define LL_MSIO_PULL_UP ((uint32_t)0x1U)
184 #define LL_MSIO_PULL_DOWN ((uint32_t)0x2U)
190 #define LL_MSIO_MUX_0 ((uint32_t)0x0U)
191 #define LL_MSIO_MUX_1 ((uint32_t)0x1U)
192 #define LL_MSIO_MUX_2 ((uint32_t)0x2U)
193 #define LL_MSIO_MUX_3 ((uint32_t)0x3U)
194 #define LL_MSIO_MUX_4 ((uint32_t)0x4U)
195 #define LL_MSIO_MUX_5 ((uint32_t)0x5U)
196 #define LL_MSIO_MUX_6 ((uint32_t)0x6U)
197 #define LL_MSIO_MUX_7 ((uint32_t)0x7U)
198 #define LL_MSIO_MUX_8 ((uint32_t)0x8U)
204 #define LL_MSIO_SPEED_MEDIUM ((uint32_t)0x0U)
205 #define LL_MSIO_SPEED_HIGH ((uint32_t)0x1U)
211 #define LL_MSIO_STRENGTH_LOW ((uint32_t)0x00U)
212 #define LL_MSIO_STRENGTH_MEDIUM ((uint32_t)0x01U)
213 #define LL_MSIO_STRENGTH_HIGH ((uint32_t)0x10U)
214 #define LL_MSIO_STRENGTH_ULTRA ((uint32_t)0x11U)
220 #define LL_MSIO_INPUT_TYPE_CMOS ((uint32_t)0x00U)
221 #define LL_MSIO_INPUT_TYPE_SCHMITT ((uint32_t)0x01U)
242 #define LL_MSIO_WriteReg(__instance__, __REG__, __VALUE__) WRITE_REG(__instance__->__REG__, (__VALUE__))
250 #define LL_MSIO_ReadReg(__instance__, __REG__) READ_REG(__instance__->__REG__)
271 #define LL_MSIO_DEFAULT_CONFIG \
273 .pin = LL_MSIO_PIN_ALL, \
274 .direction = LL_MSIO_DIRECTION_INPUT, \
275 .mode = LL_MSIO_MODE_DIGITAL, \
276 .pull = LL_MSIO_PULL_DOWN, \
277 .mux = LL_MSIO_MUX_8, \
278 .speed = LL_MSIO_SPEED_MEDIUM, \
279 .strength = LL_MSIO_STRENGTH_MEDIUM, \
280 .input_type = LL_MSIO_INPUT_TYPE_CMOS, \
323 __STATIC_INLINE
void ll_msio_set_pin_direction(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t direction)
325 uint32_t ie_mask = (pin_mask << AON_MSIO_A_PAD_IE_POS) & AON_MSIO_A_PAD_IE;
326 uint32_t oe_mask = (pin_mask << AON_MSIO_A_PAD_OE_POS) & AON_MSIO_A_PAD_OE;
327 uint32_t ie = ((direction == LL_MSIO_DIRECTION_INPUT) || (direction == LL_MSIO_DIRECTION_INOUT)) ? ie_mask : 0x0000U;
328 uint32_t oe = ((direction == LL_MSIO_DIRECTION_OUTPUT) || (direction == LL_MSIO_DIRECTION_INOUT)) ? oe_mask : 0x0000U;
329 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG0, ie_mask, ie);
330 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG0, oe_mask, oe);
360 __STATIC_INLINE uint32_t ll_msio_get_pin_direction(msio_pad_t MSIOx, uint32_t pin)
362 uint32_t ie_mask = (pin << AON_MSIO_A_PAD_IE_POS) & AON_MSIO_A_PAD_IE;
363 uint32_t oe_mask = (pin << AON_MSIO_A_PAD_OE_POS) & AON_MSIO_A_PAD_OE;
364 uint32_t ie = READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, ie_mask) >> (POSITION_VAL(pin));
365 uint32_t oe = READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, oe_mask) >> (POSITION_VAL(pin));
366 return (((ie >> AON_MSIO_A_PAD_IE_POS) << LL_MSIO_INPUT_POS)
367 | ((oe >> AON_MSIO_A_PAD_OE_POS) << LL_MSIO_OUTPUT_POS));
393 __STATIC_INLINE
void ll_msio_set_pin_mode(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t mode)
395 uint32_t mask = (pin_mask << AON_MSIO_A_PAD_AE_POS) & AON_MSIO_A_PAD_AE;
396 if(mode == LL_MSIO_MODE_ANALOG)
398 SET_BITS(AON_MSIO->MSIO_A_PAD_CFG2, mask);
402 CLEAR_BITS(AON_MSIO->MSIO_A_PAD_CFG2, mask);
429 __STATIC_INLINE uint32_t ll_msio_get_pin_mode(msio_pad_t MSIOx, uint32_t pin)
431 uint32_t mask = (pin << AON_MSIO_A_PAD_AE_POS) & AON_MSIO_A_PAD_AE;
432 return ((READ_BITS(AON_MSIO->MSIO_A_PAD_CFG2, mask) == mask) ? LL_MSIO_MODE_ANALOG : LL_MSIO_MODE_DIGITAL);
458 __STATIC_INLINE
void ll_msio_set_pin_input_type(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t type)
460 pin_mask = (pin_mask << AON_MSIO_A_PAD_IS_POS) & AON_MSIO_A_PAD_IS;
461 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG1, pin_mask, (type == LL_MSIO_INPUT_TYPE_SCHMITT) ? pin_mask : 0);
488 __STATIC_INLINE uint32_t ll_msio_get_pin_input_type(msio_pad_t MSIOx, uint32_t pin)
490 pin = (pin << AON_MSIO_A_PAD_IS_POS) & AON_MSIO_A_PAD_IS;
491 return ((uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG1, pin) == pin) ?
492 LL_MSIO_INPUT_TYPE_SCHMITT : LL_MSIO_INPUT_TYPE_CMOS);
519 __STATIC_INLINE
void ll_msio_set_pin_pull(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t pull)
521 uint32_t ps_mask = (pin_mask << AON_MSIO_A_PAD_PS_POS) & AON_MSIO_A_PAD_PS;
522 uint32_t pe_mask = (pin_mask << AON_MSIO_A_PAD_PE_POS) & AON_MSIO_A_PAD_PE;
523 uint32_t ps = (pull == LL_MSIO_PULL_UP) ? ps_mask : 0x0000U;
524 uint32_t pe = (pull == LL_MSIO_PULL_NO) ? 0x0000U : pe_mask;
525 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG1, pe_mask | ps_mask, pe | ps);
552 __STATIC_INLINE uint32_t ll_msio_get_pin_pull(msio_pad_t MSIOx, uint32_t pin)
554 uint32_t ps_mask = (pin << AON_MSIO_A_PAD_PS_POS) & AON_MSIO_A_PAD_PS;
555 uint32_t pe_mask = (pin << AON_MSIO_A_PAD_PE_POS) & AON_MSIO_A_PAD_PE;
556 return ((READ_BITS(AON_MSIO->MSIO_A_PAD_CFG1, pe_mask) == RESET) ? LL_MSIO_PULL_NO :
557 ((READ_BITS(AON_MSIO->MSIO_A_PAD_CFG1, ps_mask) == RESET) ? LL_MSIO_PULL_DOWN : LL_MSIO_PULL_UP));
592 __STATIC_INLINE
void ll_msio_set_pin_mux(msio_pad_t MSIOx, uint32_t pin, uint32_t mux)
594 uint32_t pos = POSITION_VAL(pin) << 2;
595 if (LL_MSIO_MUX_8 == mux)
597 CLEAR_BITS(AON_MSIO->MSIO_MCU_OVR, pin << AON_MSIO_MCU_OVR_MSIO_OVR_POS);
601 MODIFY_REG(MCU_RET->MSIO_A_PAD_MUX_CTL, 0xF << pos, mux << pos);
602 SET_BITS(AON_MSIO->MSIO_MCU_OVR, pin << AON_MSIO_MCU_OVR_MSIO_OVR_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))
639 uint32_t pos = POSITION_VAL(pin) << 2;
640 return (READ_BITS(MCU_RET->MSIO_A_PAD_MUX_CTL, 0xF << pos) >> pos);
644 return LL_MSIO_MUX_8;
672 __STATIC_INLINE
void ll_msio_set_pin_speed(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t speed)
675 pos = POSITION_VAL(pin_mask);
676 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG1, pin_mask << AON_MSIO_A_PAD_SR_POS, speed << pos << AON_MSIO_A_PAD_SR_POS);
700 __STATIC_INLINE uint32_t ll_msio_get_pin_speed(msio_pad_t MSIOx, uint32_t pin)
703 pos = POSITION_VAL(pin);
704 return (READ_BITS(AON_MSIO->MSIO_A_PAD_CFG1, pin << AON_MSIO_A_PAD_SR_POS) >> AON_MSIO_A_PAD_SR_POS >> pos);
735 __STATIC_INLINE
void ll_msio_set_pin_strength(msio_pad_t MSIOx, uint32_t pin_mask, uint32_t strength)
738 pos = POSITION_VAL(pin_mask);
739 uint8_t ds0 = (strength & LL_MSIO_STRENGTH_DS0_MASK) >> LL_MSIO_STRENGTH_DS0_POS;
740 uint8_t ds1 = (strength & LL_MSIO_STRENGTH_DS1_MASK) >> LL_MSIO_STRENGTH_DS1_POS;
741 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG2, pin_mask << AON_MSIO_A_PAD_DS0_POS , ds0 << pos << AON_MSIO_A_PAD_DS0_POS);
742 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG2, pin_mask << AON_MSIO_A_PAD_DS1_POS , ds1 << pos << AON_MSIO_A_PAD_DS1_POS);
770 __STATIC_INLINE uint32_t ll_msio_get_pin_strength(msio_pad_t MSIOx, uint32_t pin_mask)
773 pos = POSITION_VAL(pin_mask);
774 uint8_t ds0 = READ_BITS(AON_MSIO->MSIO_A_PAD_CFG2, pin_mask << AON_MSIO_A_PAD_DS0_POS ) >> AON_MSIO_A_PAD_DS0_POS >> pos;
775 uint8_t ds1 = READ_BITS(AON_MSIO->MSIO_A_PAD_CFG2, pin_mask << AON_MSIO_A_PAD_DS1_POS ) >> AON_MSIO_A_PAD_DS1_POS >> pos;
776 return ((ds0 << LL_MSIO_STRENGTH_DS0_POS) | (ds1 << LL_MSIO_STRENGTH_DS1_POS));
794 __STATIC_INLINE uint32_t ll_msio_read_input_port(msio_pad_t MSIOx)
796 return (uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, AON_MSIO_A_PAD_IN_VAL) >> AON_MSIO_A_PAD_IN_VAL_POS);
819 __STATIC_INLINE uint32_t ll_msio_read_input_pin(msio_pad_t MSIOx, uint32_t pin_mask)
821 pin_mask = (pin_mask << AON_MSIO_A_PAD_IN_VAL_POS) & AON_MSIO_A_PAD_IN_VAL;
822 return (uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, pin_mask) == pin_mask);
845 __STATIC_INLINE uint32_t ll_msio_read_output_pin(msio_pad_t MSIOx, uint32_t pin_mask)
847 pin_mask = (pin_mask << AON_MSIO_A_PAD_OUT_VAL_POS) & AON_MSIO_A_PAD_OUT_VAL;
848 return (uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, pin_mask) == pin_mask);
862 __STATIC_INLINE
void ll_msio_write_output_port(msio_pad_t MSIOx, uint32_t port_value)
864 MODIFY_REG(AON_MSIO->MSIO_A_PAD_CFG0, AON_MSIO_A_PAD_OUT_VAL, (port_value << AON_MSIO_A_PAD_OUT_VAL_POS) & AON_MSIO_A_PAD_OUT_VAL);
876 __STATIC_INLINE uint32_t ll_msio_read_output_port(msio_pad_t MSIOx)
878 return (uint32_t)(READ_BITS(AON_MSIO->MSIO_A_PAD_CFG0, AON_MSIO_A_PAD_OUT_VAL) >> AON_MSIO_A_PAD_OUT_VAL_POS);
901 __STATIC_INLINE
void ll_msio_set_output_pin(msio_pad_t MSIOx, uint32_t pin_mask)
903 SET_BITS(AON_MSIO->MSIO_A_PAD_CFG0, (pin_mask << AON_MSIO_A_PAD_OUT_VAL_POS) & AON_MSIO_A_PAD_OUT_VAL);
926 __STATIC_INLINE
void ll_msio_reset_output_pin(msio_pad_t MSIOx, uint32_t pin_mask)
928 CLEAR_BITS(AON_MSIO->MSIO_A_PAD_CFG0, (pin_mask << AON_MSIO_A_PAD_OUT_VAL_POS) & AON_MSIO_A_PAD_OUT_VAL);
951 __STATIC_INLINE
void ll_msio_toggle_pin(msio_pad_t MSIOx, uint32_t pin_mask)
953 WRITE_REG(AON_MSIO->MSIO_A_PAD_CFG0, (READ_REG(AON_MSIO->MSIO_A_PAD_CFG0) ^ ((pin_mask << AON_MSIO_A_PAD_OUT_VAL_POS) & AON_MSIO_A_PAD_OUT_VAL)));
972 error_status_t ll_msio_init(msio_pad_t MSIOx,ll_msio_init_t *p_msio_init);