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_MAX32672_GPIO_H_ 28 #define LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32672_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, /**< Reserved for future use. Included here to prevent build errors. */ 145 MXC_GPIO_PAD_WEAK_PULL_DOWN, /**< Reserved for future use. Included here to prevent build errors. */ 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 be initialized 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 be initialized 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 cfg Pointer to configuration structure describing the pin. 212 * @param mask Mask of the pin to read 213 * @return The requested pin state. 214 */ 215 uint32_t MXC_GPIO_InGet(mxc_gpio_regs_t *port, uint32_t mask); 216 217 /** 218 * @brief Sets the pin(s) to a high level output. 219 * @param cfg Pointer to configuration structure describing the pin. 220 * @param mask Mask of the pin to set 221 */ 222 void MXC_GPIO_OutSet(mxc_gpio_regs_t *port, uint32_t mask); 223 224 /** 225 * @brief Clears the pin(s) to a low level output. 226 * @param cfg Pointer to configuration structure describing the pin. 227 * @param mask Mask of the pin to clear 228 */ 229 void MXC_GPIO_OutClr(mxc_gpio_regs_t *port, uint32_t mask); 230 231 /** 232 * @brief Gets the pin(s) output state. 233 * @param cfg Pointer to configuration structure describing the pin. 234 * @param mask Mask of the pin to read the output state of 235 * @return The state of the requested pin. 236 * 237 */ 238 uint32_t MXC_GPIO_OutGet(mxc_gpio_regs_t *port, uint32_t mask); 239 240 /** 241 * @brief Write the pin(s) to a desired output level. 242 * @param cfg Pointer to configuration structure describing the pin. 243 * @param mask Mask of the pin to set output level of 244 * @param val Desired output level of the pin(s). This will be masked 245 * with the configuration mask. 246 */ 247 void MXC_GPIO_OutPut(mxc_gpio_regs_t *port, uint32_t mask, uint32_t val); 248 249 /** 250 * @brief Toggles the the pin(s) output level. 251 * @param cfg Pointer to configuration structure describing the pin. 252 * @param mask Mask of the pin to toggle the output 253 */ 254 void MXC_GPIO_OutToggle(mxc_gpio_regs_t *port, uint32_t mask); 255 256 /** 257 * @brief Configure GPIO interrupt(s) 258 * @param cfg Pointer to configuration structure describing the pin. 259 * @param pol Requested interrupt polarity. 260 * @return #E_NO_ERROR if everything is successful. See \ref MXC_Error_Codes for the list of error codes. 261 */ 262 int MXC_GPIO_IntConfig(const mxc_gpio_cfg_t *cfg, mxc_gpio_int_pol_t pol); 263 264 /** 265 * @brief Enables the specified GPIO interrupt 266 * @param cfg Pointer to configuration structure describing the pin. 267 * @param mask mask of the pin to enable interrupt 268 * 269 */ 270 void MXC_GPIO_EnableInt(mxc_gpio_regs_t *port, uint32_t mask); 271 272 /** 273 * @brief Disables the specified GPIO interrupt. 274 * @param cfg Pointer to configuration structure describing the pin. 275 * @param mask mask of the pin to disable interrupt 276 */ 277 void MXC_GPIO_DisableInt(mxc_gpio_regs_t *port, uint32_t mask); 278 279 /** 280 * @brief Gets the interrupt(s) status on a GPIO port 281 * 282 * @param port Pointer to the port requested 283 * 284 * @return The requested interrupt status. 285 */ 286 uint32_t MXC_GPIO_GetFlags(mxc_gpio_regs_t *port); 287 288 /** 289 * @brief Set Voltage select for pins to VDDIO or VDDIOH 290 * 291 * @param port The GPIO port 292 * @param[in] vssel VDDIO or VDDIOH to set the voltatge to 293 * @param[in] mask Pins in the GPIO port that will be set to the voltage. 294 * 295 * @return #E_NO_ERROR if everything is successful. See \ref MXC_Error_Codes for the list of error codes. 296 */ 297 int MXC_GPIO_SetVSSEL(mxc_gpio_regs_t *port, mxc_gpio_vssel_t vssel, uint32_t mask); 298 299 /** 300 * @brief Gets the interrupt(s) status on a GPIO port 301 * 302 * @param port Pointer to the port requested 303 * @param flags The flags to clear 304 */ 305 void MXC_GPIO_ClearFlags(mxc_gpio_regs_t *port, uint32_t flags); 306 307 /** 308 * @brief Registers a callback for the interrupt on a given port and pin. 309 * @param cfg Pointer to configuration structure describing the pin 310 * @param callback A pointer to a function of type #callback_fn. 311 * @param cbdata The parameter to be passed to the callback function, #callback_fn, when an interrupt occurs. 312 * 313 */ 314 void MXC_GPIO_RegisterCallback(const mxc_gpio_cfg_t *cfg, mxc_gpio_callback_fn callback, 315 void *cbdata); 316 317 /** 318 * @brief GPIO IRQ Handler. @note If a callback is registered for a given 319 * interrupt, the callback function will be called. 320 * 321 * @param port number of the port that generated the interrupt service routine. 322 * 323 */ 324 void MXC_GPIO_Handler(unsigned int port); 325 326 /** 327 * @brief Enables GPIO pins to be used as a wakeup source. 328 * 329 * @param port The GPIO port 330 * @param mask Pins in the GPIO port that will be enabled as a wakeup source. 331 */ 332 void MXC_GPIO_SetWakeEn(mxc_gpio_regs_t *port, uint32_t mask); 333 334 /** 335 * @brief Disables GPIO pins from being used as a wakeup source. 336 * 337 * @param port The GPIO port 338 * @param mask Pins in the GPIO port that will be disabled as a wakeup source. 339 */ 340 void MXC_GPIO_ClearWakeEn(mxc_gpio_regs_t *port, uint32_t mask); 341 342 /** 343 * @brief Returns the pins currently enabled as wakeup sources. 344 * 345 * @param port The GPIO port to check. 346 * 347 * @returns The value of the wake enable register. 348 */ 349 uint32_t MXC_GPIO_GetWakeEn(mxc_gpio_regs_t *port); 350 351 /** 352 * @brief Set Drive Strength for pins. 353 * 354 * @param port The GPIO port. 355 * @param[in] ds Drive strength level. Ref /mxc_gpio_ds_t enum type. 356 * @param[in] mask Pins in the GPIO port that will be set to the voltage. 357 */ 358 int MXC_GPIO_SetDriveStrength(mxc_gpio_regs_t *port, mxc_gpio_drvstr_t drvstr, uint32_t mask); 359 360 /**@} end of group gpio */ 361 362 #ifdef __cplusplus 363 } 364 #endif 365 366 #endif // LIBRARIES_PERIPHDRIVERS_INCLUDE_MAX32672_GPIO_H_ 367