1 /**
2  * @file    gpio.h
3  * @brief   General-Purpose Input/Output (GPIO) function prototypes and data types.
4  */
5 
6 /******************************************************************************
7  *
8  * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
9  * Analog Devices, Inc.),
10  * Copyright (C) 2023-2024 Analog Devices, Inc.
11  *
12  * Licensed under the Apache License, Version 2.0 (the "License");
13  * you may not use this file except in compliance with the License.
14  * You may obtain a copy of the License at
15  *
16  *     http://www.apache.org/licenses/LICENSE-2.0
17  *
18  * Unless required by applicable law or agreed to in writing, software
19  * distributed under the License is distributed on an "AS IS" BASIS,
20  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  * See the License for the specific language governing permissions and
22  * limitations under the License.
23  *
24  ******************************************************************************/
25 
26 /* Define to prevent redundant inclusion */
27 #ifndef LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32662_GPIO_H_
28 #define LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32662_GPIO_H_
29 
30 /* **** Includes **** */
31 #include "gpio_regs.h"
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 /**
38  * @defgroup gpio General-Purpose Input/Output (GPIO)
39  * @ingroup periphlibs
40  * @{
41  */
42 
43 /* **** Definitions **** */
44 /**
45  * @defgroup gpio_port_pin Port and Pin Definitions
46  * @ingroup gpio
47  * @{
48  * @defgroup gpio_port Port Definitions
49  * @ingroup gpio_port_pin
50  * @{
51  */
52 #define MXC_GPIO_PORT_0 ((uint32_t)(1UL << 0)) /**< Port 0  Define*/
53 /**@} end of gpio_port group*/
54 
55 /**
56  * @defgroup gpio_pin Pin Definitions
57  * @ingroup gpio_port_pin
58  * @{
59  */
60 #define MXC_GPIO_PIN_0 ((uint32_t)(1UL << 0)) /**< Pin 0 Define */
61 #define MXC_GPIO_PIN_1 ((uint32_t)(1UL << 1)) /**< Pin 1 Define */
62 #define MXC_GPIO_PIN_2 ((uint32_t)(1UL << 2)) /**< Pin 2 Define */
63 #define MXC_GPIO_PIN_3 ((uint32_t)(1UL << 3)) /**< Pin 3 Define */
64 #define MXC_GPIO_PIN_4 ((uint32_t)(1UL << 4)) /**< Pin 4 Define */
65 #define MXC_GPIO_PIN_5 ((uint32_t)(1UL << 5)) /**< Pin 5 Define */
66 #define MXC_GPIO_PIN_6 ((uint32_t)(1UL << 6)) /**< Pin 6 Define */
67 #define MXC_GPIO_PIN_7 ((uint32_t)(1UL << 7)) /**< Pin 7 Define */
68 #define MXC_GPIO_PIN_8 ((uint32_t)(1UL << 8)) /**< Pin 8 Define */
69 #define MXC_GPIO_PIN_9 ((uint32_t)(1UL << 9)) /**< Pin 9 Define */
70 #define MXC_GPIO_PIN_10 ((uint32_t)(1UL << 10)) /**< Pin 10 Define */
71 #define MXC_GPIO_PIN_11 ((uint32_t)(1UL << 11)) /**< Pin 11 Define */
72 #define MXC_GPIO_PIN_12 ((uint32_t)(1UL << 12)) /**< Pin 12 Define */
73 #define MXC_GPIO_PIN_13 ((uint32_t)(1UL << 13)) /**< Pin 13 Define */
74 #define MXC_GPIO_PIN_14 ((uint32_t)(1UL << 14)) /**< Pin 14 Define */
75 #define MXC_GPIO_PIN_15 ((uint32_t)(1UL << 15)) /**< Pin 15 Define */
76 #define MXC_GPIO_PIN_16 ((uint32_t)(1UL << 16)) /**< Pin 16 Define */
77 #define MXC_GPIO_PIN_17 ((uint32_t)(1UL << 17)) /**< Pin 17 Define */
78 #define MXC_GPIO_PIN_18 ((uint32_t)(1UL << 18)) /**< Pin 18 Define */
79 #define MXC_GPIO_PIN_19 ((uint32_t)(1UL << 19)) /**< Pin 19 Define */
80 #define MXC_GPIO_PIN_20 ((uint32_t)(1UL << 20)) /**< Pin 20 Define */
81 #define MXC_GPIO_PIN_21 ((uint32_t)(1UL << 21)) /**< Pin 21 Define */
82 #define MXC_GPIO_PIN_22 ((uint32_t)(1UL << 22)) /**< Pin 22 Define */
83 #define MXC_GPIO_PIN_23 ((uint32_t)(1UL << 23)) /**< Pin 23 Define */
84 #define MXC_GPIO_PIN_24 ((uint32_t)(1UL << 24)) /**< Pin 24 Define */
85 #define MXC_GPIO_PIN_25 ((uint32_t)(1UL << 25)) /**< Pin 25 Define */
86 #define MXC_GPIO_PIN_26 ((uint32_t)(1UL << 26)) /**< Pin 26 Define */
87 #define MXC_GPIO_PIN_27 ((uint32_t)(1UL << 27)) /**< Pin 27 Define */
88 #define MXC_GPIO_PIN_28 ((uint32_t)(1UL << 28)) /**< Pin 28 Define */
89 #define MXC_GPIO_PIN_29 ((uint32_t)(1UL << 29)) /**< Pin 29 Define */
90 #define MXC_GPIO_PIN_30 ((uint32_t)(1UL << 30)) /**< Pin 30 Define */
91 #define MXC_GPIO_PIN_31 ((uint32_t)(1UL << 31)) /**< Pin 31 Define */
92 /**@} end of gpio_pin group */
93 /**@} end of gpio_port_pin group */
94 
95 /**
96  * @brief      Type alias for a GPIO callback function with prototype:
97  * @code
98     void callback_fn(void *cbdata);
99  * @endcode
100  * @param      cbdata  A void pointer to the data type as registered when
101  *                     MXC_GPIO_RegisterCallback() was called.
102  */
103 typedef void (*mxc_gpio_callback_fn)(void *cbdata);
104 
105 /**
106  * @brief   Enumeration type for the GPIO Function Type
107  */
108 typedef enum {
109     MXC_GPIO_FUNC_IN, /**< GPIO Input */
110     MXC_GPIO_FUNC_OUT, /**< GPIO Output */
111     MXC_GPIO_FUNC_ALT1, /**< Alternate Function Selection */
112     MXC_GPIO_FUNC_ALT2, /**< Alternate Function Selection */
113     MXC_GPIO_FUNC_ALT3, /**< Alternate Function Selection */
114     MXC_GPIO_FUNC_ALT4, /**< Alternate Function Selection */
115     MXC_GPIO_FUNC_ALT5, /**< Alternate Function Selection */
116 } mxc_gpio_func_t;
117 
118 /**
119  * @brief   Enumeration type for the voltage level on a given pin.
120  */
121 typedef enum {
122     MXC_GPIO_VSSEL_VDDIO, /**< Set pin to VIDDIO voltage */
123     MXC_GPIO_VSSEL_VDDIOH, /**< Set pin to VIDDIOH voltage */
124 } mxc_gpio_vssel_t;
125 
126 /**
127  * @brief   Enumeration type for drive strength on a given pin.
128  */
129 typedef enum {
130     MXC_GPIO_DRVSTR_0, /**< Drive Strength 0 */
131     MXC_GPIO_DRVSTR_1, /**< Drive Strength 1 */
132     MXC_GPIO_DRVSTR_2, /**< Drive Strength 2 */
133     MXC_GPIO_DRVSTR_3, /**< Drive Strength 3 */
134 } mxc_gpio_drvstr_t;
135 
136 /**
137  * @brief   Enumeration type for the type of GPIO pad on a given pin.
138  */
139 typedef enum {
140     MXC_GPIO_PAD_NONE, /**< No pull-up or pull-down */
141     MXC_GPIO_PAD_PULL_UP, /**< Set pad to weak pull-up */
142     MXC_GPIO_PAD_PULL_DOWN, /**< Set pad to weak pull-down */
143     MXC_GPIO_PAD_WEAK_PULL_UP = MXC_GPIO_PAD_PULL_UP, /**< Set pad to weak pull-up */
144     MXC_GPIO_PAD_WEAK_PULL_DOWN = MXC_GPIO_PAD_PULL_DOWN, /**< Set pad to weak pull-down */
145 } mxc_gpio_pad_t;
146 
147 /**
148  * @brief   Structure type for configuring a GPIO port.
149  */
150 typedef struct {
151     mxc_gpio_regs_t *port; /**< Pointer to GPIO regs */
152     uint32_t mask; /**< Pin mask (multiple pins may be set) */
153     mxc_gpio_func_t func; /**< Function type */
154     mxc_gpio_pad_t pad; /**< Pad type */
155     mxc_gpio_vssel_t vssel; /**< Voltage select */
156     mxc_gpio_drvstr_t drvstr; /**< Drive Strength select */
157 } mxc_gpio_cfg_t;
158 
159 /**
160  * @brief   Enumeration type for the interrupt modes.
161  */
162 typedef enum {
163     MXC_GPIO_INT_LEVEL, /**< Interrupt is level sensitive */
164     MXC_GPIO_INT_EDGE /**< Interrupt is edge sensitive */
165 } mxc_gpio_int_mode_t;
166 
167 /**
168  * @brief   Enumeration type for the interrupt polarity.
169  */
170 typedef enum {
171     MXC_GPIO_INT_FALLING, /**< Interrupt triggers on falling edge */
172     MXC_GPIO_INT_HIGH, /**< Interrupt triggers when level is high */
173     MXC_GPIO_INT_RISING, /**< Interrupt triggers on rising edge */
174     MXC_GPIO_INT_LOW, /**< Interrupt triggers when level is low */
175     MXC_GPIO_INT_BOTH /**< Interrupt triggers on either edge */
176 } mxc_gpio_int_pol_t;
177 
178 /* **** Function Prototypes **** */
179 
180 /**
181  * @brief      Initialize GPIO.
182  * @param      portMask     Mask for the port to be initialized
183  * @return     #E_NO_ERROR if everything is successful.
184  */
185 int MXC_GPIO_Init(uint32_t portMask);
186 
187 /**
188  * @brief      Shutdown GPIO.
189  * @param      portMask     Mask for the port to be initialized
190  * @return     #E_NO_ERROR if everything is successful.
191  */
192 int MXC_GPIO_Shutdown(uint32_t portMask);
193 
194 /**
195  * @brief      Reset GPIO.
196  * @param      portMask     Mask for the port to be initialized
197  * @return     #E_NO_ERROR if everything is successful.
198  */
199 int MXC_GPIO_Reset(uint32_t portMask);
200 
201 /**
202  * @brief      Configure GPIO pin(s).
203  * @param      cfg   Pointer to configuration structure describing the pin.
204  * @return     #E_NO_ERROR if everything is successful.
205  */
206 int MXC_GPIO_Config(const mxc_gpio_cfg_t *cfg);
207 
208 /**
209  * @brief      Gets the pin(s) input state.
210  * @param      port  Pointer to the GPIO port registers
211  * @param      mask  Mask of the pin(s) to read
212  * @return     The requested pin state.
213  */
214 uint32_t MXC_GPIO_InGet(mxc_gpio_regs_t *port, uint32_t mask);
215 
216 /**
217  * @brief      Sets the pin(s) to a high level output.
218  * @param      port  Pointer to the GPIO port registers
219  * @param      mask  Mask of the pin(s) to set
220  */
221 void MXC_GPIO_OutSet(mxc_gpio_regs_t *port, uint32_t mask);
222 
223 /**
224  * @brief      Clears the pin(s) to a low level output.
225  * @param      port  Pointer to the GPIO port registers
226  * @param      mask  Mask of the pin(s) to clear
227  */
228 void MXC_GPIO_OutClr(mxc_gpio_regs_t *port, uint32_t mask);
229 
230 /**
231  * @brief      Gets the pin(s) output state.
232  * @param      port  Pointer to the GPIO port registers
233  * @param      mask  Mask of the pin(s) to read the output state of
234  * @return     The state of the requested pin.
235  *
236  */
237 uint32_t MXC_GPIO_OutGet(mxc_gpio_regs_t *port, uint32_t mask);
238 
239 /**
240  * @brief      Write the pin(s) to a desired output level.
241  * @param      port  Pointer to the GPIO port registers
242  * @param      mask  Mask of the pin(s) to set output level of
243  * @param      val   Desired output level of the pin(s). This will be masked
244  *                   with the configuration mask.
245  */
246 void MXC_GPIO_OutPut(mxc_gpio_regs_t *port, uint32_t mask, uint32_t val);
247 
248 /**
249  * @brief      Toggles the the pin(s) output level.
250  * @param      port  Pointer to the GPIO port registers
251  * @param      mask  Mask of the pin(s) to toggle the output
252  */
253 void MXC_GPIO_OutToggle(mxc_gpio_regs_t *port, uint32_t mask);
254 
255 /**
256  * @brief      Configure GPIO interrupt(s)
257  * @param      cfg   Pointer to configuration structure describing the pin.
258  * @param      pol   Requested interrupt polarity.
259  * @return     #E_NO_ERROR if everything is successful.
260  */
261 int MXC_GPIO_IntConfig(const mxc_gpio_cfg_t *cfg, mxc_gpio_int_pol_t pol);
262 
263 /**
264  * @brief      Enables the specified GPIO interrupt
265  * @param      port  Pointer to the GPIO port registers
266  * @param      mask  Mask of the pin(s) to enable interrupts for
267  *
268  */
269 void MXC_GPIO_EnableInt(mxc_gpio_regs_t *port, uint32_t mask);
270 
271 /**
272  * @brief      Disables the specified GPIO interrupt.
273  * @param      port  Pointer to the GPIO port registers
274  * @param      mask  Mask of the pin(s) to disable interrupts for
275  */
276 void MXC_GPIO_DisableInt(mxc_gpio_regs_t *port, uint32_t mask);
277 
278 /**
279  * @brief      Gets the interrupt(s) status on a GPIO port
280  *
281  * @param      port  Pointer to the GPIO port registers
282  *
283  * @return     The requested interrupt status.
284  */
285 uint32_t MXC_GPIO_GetFlags(mxc_gpio_regs_t *port);
286 
287 /**
288  * @brief      Gets the interrupt(s) status on a GPIO port
289  *
290  * @param      port  Pointer to the GPIO port registers
291  * @param      flags  The flags to clear
292  */
293 void MXC_GPIO_ClearFlags(mxc_gpio_regs_t *port, uint32_t flags);
294 
295 /**
296  * @brief      Registers a callback for the interrupt on a given port and pin.
297  * @param      cfg       Pointer to configuration structure describing the pin
298  * @param      callback  A pointer to a function of type #callback_fn.
299  * @param      cbdata    The parameter to be passed to the callback function, #callback_fn, when an interrupt occurs.
300  *
301  */
302 void MXC_GPIO_RegisterCallback(const mxc_gpio_cfg_t *cfg, mxc_gpio_callback_fn callback,
303                                void *cbdata);
304 
305 /**
306  * @brief      GPIO IRQ Handler. @note If a callback is registered for a given
307  *             interrupt, the callback function will be called.
308  *
309  * @param      port Number of the port that generated the interrupt service routine.
310  *
311  */
312 void MXC_GPIO_Handler(unsigned int port);
313 
314 /**
315  * @brief      Set Voltage select for pins to VDDIO or VDDIOH
316  *
317  * @param      port  Pointer to the GPIO port registers
318  * @param[in]  vssel  VDDIO or VDDIOH to set the voltatge to
319  * @param[in]  mask   Pins in the GPIO port that will be set to the voltage.
320  */
321 int MXC_GPIO_SetVSSEL(mxc_gpio_regs_t *port, mxc_gpio_vssel_t vssel, uint32_t mask);
322 
323 /**
324  * @brief      Enables GPIO pins to be used as a wakeup source.
325  *
326  * @param      port   The GPIO port
327  * @param      mask   Pins in the GPIO port that will be enabled as a wakeup source.
328  */
329 void MXC_GPIO_SetWakeEn(mxc_gpio_regs_t *port, uint32_t mask);
330 
331 /**
332  * @brief      Disables GPIO pins from being used as a wakeup source.
333  *
334  * @param      port   The GPIO port
335  * @param      mask   Pins in the GPIO port that will be disabled as a wakeup source.
336  */
337 void MXC_GPIO_ClearWakeEn(mxc_gpio_regs_t *port, uint32_t mask);
338 
339 /**
340  * @brief      Returns the pins currently enabled as wakeup sources.
341  *
342  * @param      port   The GPIO port to check.
343  *
344  * @returns    The value of the wake enable register.
345  */
346 uint32_t MXC_GPIO_GetWakeEn(mxc_gpio_regs_t *port);
347 
348 /**
349  * @brief      Set Drive Strength for pins.
350  *
351  * @param      port   The GPIO port.
352  * @param[in]  ds     Drive strength level. Ref /mxc_gpio_ds_t enum type.
353  * @param[in]  mask   Pins in the GPIO port that will be set to the voltage.
354  */
355 int MXC_GPIO_SetDriveStrength(mxc_gpio_regs_t *port, mxc_gpio_drvstr_t drvstr, uint32_t mask);
356 
357 /**@} end of group gpio */
358 
359 #ifdef __cplusplus
360 }
361 #endif
362 
363 #endif // LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32662_GPIO_H_
364