2 * Copyright (c) 2016, Freescale Semiconductor, Inc.
\r
3 * Copyright 2016-2018 NXP
\r
4 * All rights reserved.
\r
6 * SPDX-License-Identifier: BSD-3-Clause
\r
9 #include "fsl_gpio.h"
\r
11 /* Component ID definition, used by tools. */
\r
12 #ifndef FSL_COMPONENT_ID
\r
13 #define FSL_COMPONENT_ID "platform.drivers.lpc_gpio"
\r
16 /*******************************************************************************
\r
18 ******************************************************************************/
\r
19 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
\r
20 /*! @brief Array to map FGPIO instance number to clock name. */
\r
21 static const clock_ip_name_t s_gpioClockName[] = GPIO_CLOCKS;
\r
22 #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
\r
24 #if !(defined(FSL_FEATURE_GPIO_HAS_NO_RESET) && FSL_FEATURE_GPIO_HAS_NO_RESET)
\r
25 /*! @brief Pointers to GPIO resets for each instance. */
\r
26 static const reset_ip_name_t s_gpioResets[] = GPIO_RSTS_N;
\r
28 /*******************************************************************************
\r
30 ************ ******************************************************************/
\r
32 /*******************************************************************************
\r
34 ******************************************************************************/
\r
36 * brief Initializes the GPIO peripheral.
\r
38 * This function ungates the GPIO clock.
\r
40 * param base GPIO peripheral base pointer.
\r
41 * param port GPIO port number.
\r
43 void GPIO_PortInit(GPIO_Type *base, uint32_t port)
\r
45 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
\r
46 assert(port < ARRAY_SIZE(s_gpioClockName));
\r
48 /* Upgate the GPIO clock */
\r
49 CLOCK_EnableClock(s_gpioClockName[port]);
\r
50 #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
\r
51 #if !(defined(FSL_FEATURE_GPIO_HAS_NO_RESET) && FSL_FEATURE_GPIO_HAS_NO_RESET)
\r
52 /* Reset the GPIO module */
\r
53 RESET_PeripheralReset(s_gpioResets[port]);
\r
58 * brief Initializes a GPIO pin used by the board.
\r
60 * To initialize the GPIO, define a pin configuration, either input or output, in the user file.
\r
61 * Then, call the GPIO_PinInit() function.
\r
63 * This is an example to define an input pin or output pin configuration:
\r
65 * // Define a digital input pin configuration,
\r
66 * gpio_pin_config_t config =
\r
68 * kGPIO_DigitalInput,
\r
71 * //Define a digital output pin configuration,
\r
72 * gpio_pin_config_t config =
\r
74 * kGPIO_DigitalOutput,
\r
79 * param base GPIO peripheral base pointer(Typically GPIO)
\r
80 * param port GPIO port number
\r
81 * param pin GPIO pin number
\r
82 * param config GPIO pin configuration pointer
\r
84 void GPIO_PinInit(GPIO_Type *base, uint32_t port, uint32_t pin, const gpio_pin_config_t *config)
\r
86 if (config->pinDirection == kGPIO_DigitalInput)
\r
88 #if defined(FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR) && (FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR)
\r
89 base->DIRCLR[port] = 1U << pin;
\r
91 base->DIR[port] &= ~(1U << pin);
\r
92 #endif /*FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR*/
\r
96 /* Set default output value */
\r
97 if (config->outputLogic == 0U)
\r
99 base->CLR[port] = (1U << pin);
\r
103 base->SET[port] = (1U << pin);
\r
105 /* Set pin direction */
\r
106 #if defined(FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR) && (FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR)
\r
107 base->DIRSET[port] = 1U << pin;
\r
109 base->DIR[port] |= 1U << pin;
\r
110 #endif /*FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR*/
\r
114 #if defined(FSL_FEATURE_GPIO_HAS_INTERRUPT) && FSL_FEATURE_GPIO_HAS_INTERRUPT
\r
116 * @brief Configures the gpio pin interrupt.
\r
118 * @param base GPIO base pointer.
\r
119 * @param port GPIO port number
\r
120 * @param pin GPIO pin number.
\r
121 * @param config GPIO pin interrupt configuration..
\r
123 void GPIO_SetPinInterruptConfig(GPIO_Type *base, uint32_t port, uint32_t pin, gpio_interrupt_config_t *config)
\r
125 base->INTEDG[port] = base->INTEDG[port] | (config->mode << pin);
\r
127 base->INTPOL[port] = base->INTPOL[port] | (config->polarity << pin);
\r
131 * @brief Enables multiple pins interrupt.
\r
133 * @param base GPIO base pointer.
\r
134 * @param port GPIO port number.
\r
135 * @param index GPIO interrupt number.
\r
136 * @param mask GPIO pin number macro.
\r
138 void GPIO_PortEnableInterrupts(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask)
\r
140 if (kGPIO_InterruptA == index)
\r
142 base->INTENA[port] = base->INTENA[port] | mask;
\r
144 else if (kGPIO_InterruptB == index)
\r
146 base->INTENB[port] = base->INTENB[port] | mask;
\r
150 /*Should not enter here*/
\r
155 * @brief Disables multiple pins interrupt.
\r
157 * @param base GPIO base pointer.
\r
158 * @param port GPIO port number.
\r
159 * @param index GPIO interrupt number.
\r
160 * @param mask GPIO pin number macro.
\r
162 void GPIO_PortDisableInterrupts(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask)
\r
164 if (kGPIO_InterruptA == index)
\r
166 base->INTENA[port] = base->INTENA[port] & ~mask;
\r
168 else if (kGPIO_InterruptB == index)
\r
170 base->INTENB[port] = base->INTENB[port] & ~mask;
\r
174 /*Should not enter here*/
\r
179 * @brief Clears multiple pins interrupt flag. Status flags are cleared by
\r
180 * writing a 1 to the corresponding bit position.
\r
182 * @param base GPIO base pointer.
\r
183 * @param port GPIO port number.
\r
184 * @param index GPIO interrupt number.
\r
185 * @param mask GPIO pin number macro.
\r
187 void GPIO_PortClearInterruptFlags(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask)
\r
189 if (kGPIO_InterruptA == index)
\r
191 base->INTSTATA[port] = mask;
\r
193 else if (kGPIO_InterruptB == index)
\r
195 base->INTSTATB[port] = mask;
\r
199 /*Should not enter here*/
\r
204 * @ Read port interrupt status.
\r
206 * @param base GPIO base pointer.
\r
207 * @param port GPIO port number
\r
208 * @param index GPIO interrupt number.
\r
209 * @retval masked GPIO status value
\r
211 uint32_t GPIO_PortGetInterruptStatus(GPIO_Type *base, uint32_t port, uint32_t index)
\r
213 uint32_t status = 0U;
\r
215 if (kGPIO_InterruptA == index)
\r
217 status = base->INTSTATA[port];
\r
219 else if (kGPIO_InterruptB == index)
\r
221 status = base->INTSTATB[port];
\r
225 /*Should not enter here*/
\r
232 * @brief Enables the specific pin interrupt.
\r
234 * @param base GPIO base pointer.
\r
235 * @param port GPIO port number.
\r
236 * @param pin GPIO pin number.
\r
237 * @param index GPIO interrupt number.
\r
239 void GPIO_PinEnableInterrupt(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index)
\r
241 if (kGPIO_InterruptA == index)
\r
243 base->INTENA[port] = base->INTENA[port] | (1U << pin);
\r
245 else if (kGPIO_InterruptB == index)
\r
247 base->INTENB[port] = base->INTENB[port] | (1U << pin);
\r
251 /*Should not enter here*/
\r
256 * @brief Disables the specific pin interrupt.
\r
258 * @param base GPIO base pointer.
\r
259 * @param port GPIO port number.
\r
260 * @param pin GPIO pin number.
\r
261 * @param index GPIO interrupt number.
\r
263 void GPIO_PinDisableInterrupt(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index)
\r
265 if (kGPIO_InterruptA == index)
\r
267 base->INTENA[port] = base->INTENA[port] & ~(1U << pin);
\r
269 else if (kGPIO_InterruptB == index)
\r
271 base->INTENB[port] = base->INTENB[port] & ~(1U << pin);
\r
275 /*Should not enter here*/
\r
280 * @brief Clears the specific pin interrupt flag. Status flags are cleared by
\r
281 * writing a 1 to the corresponding bit position.
\r
283 * @param base GPIO base pointer.
\r
284 * @param port GPIO port number.
\r
285 * @param index GPIO interrupt number.
\r
286 * @param mask GPIO pin number macro.
\r
288 void GPIO_PinClearInterruptFlag(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index)
\r
290 if (kGPIO_InterruptA == index)
\r
292 base->INTSTATA[port] = 1U << pin;
\r
294 else if (kGPIO_InterruptB == index)
\r
296 base->INTSTATB[port] = 1U << pin;
\r
300 /*Should not enter here*/
\r
303 #endif /* FSL_FEATURE_GPIO_HAS_INTERRUPT */
\r