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