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