]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_MPU_M33F_NXP_LPC55S69_MCUXpresso/NXP_Code/drivers/fsl_gpio.c
commit 9f316c246baafa15c542a5aea81a94f26e3d6507
[freertos] / FreeRTOS / Demo / CORTEX_MPU_M33F_NXP_LPC55S69_MCUXpresso / NXP_Code / drivers / fsl_gpio.c
1 /*\r
2  * Copyright (c) 2016, Freescale Semiconductor, Inc.\r
3  * Copyright 2016-2019 NXP\r
4  * All rights reserved.\r
5  *\r
6  * SPDX-License-Identifier: BSD-3-Clause\r
7  */\r
8 \r
9 #include "fsl_gpio.h"\r
10 \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
14 #endif\r
15 \r
16 /*******************************************************************************\r
17  * Variables\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
23 \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
27 #endif\r
28 /*******************************************************************************\r
29  * Prototypes\r
30  ************ ******************************************************************/\r
31 \r
32 /*******************************************************************************\r
33  * Code\r
34  ******************************************************************************/\r
35 /*!\r
36  * brief Initializes the GPIO peripheral.\r
37  *\r
38  * This function ungates the GPIO clock.\r
39  *\r
40  * param base   GPIO peripheral base pointer.\r
41  * param port   GPIO port number.\r
42  */\r
43 void GPIO_PortInit(GPIO_Type *base, uint32_t port)\r
44 {\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
47 \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
54 #endif\r
55 }\r
56 \r
57 /*!\r
58  * brief Initializes a GPIO pin used by the board.\r
59  *\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
62  *\r
63  * This is an example to define an input pin or output pin configuration:\r
64  * code\r
65  * Define a digital input pin configuration,\r
66  * gpio_pin_config_t config =\r
67  * {\r
68  *   kGPIO_DigitalInput,\r
69  *   0,\r
70  * }\r
71  * Define a digital output pin configuration,\r
72  * gpio_pin_config_t config =\r
73  * {\r
74  *   kGPIO_DigitalOutput,\r
75  *   0,\r
76  * }\r
77  * endcode\r
78  *\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
83  */\r
84 void GPIO_PinInit(GPIO_Type *base, uint32_t port, uint32_t pin, const gpio_pin_config_t *config)\r
85 {\r
86     if (config->pinDirection == kGPIO_DigitalInput)\r
87     {\r
88 #if defined(FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR) && (FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR)\r
89         base->DIRCLR[port] = 1UL << pin;\r
90 #else\r
91         base->DIR[port] &= ~(1UL << pin);\r
92 #endif /*FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR*/\r
93     }\r
94     else\r
95     {\r
96         /* Set default output value */\r
97         if (config->outputLogic == 0U)\r
98         {\r
99             base->CLR[port] = (1UL << pin);\r
100         }\r
101         else\r
102         {\r
103             base->SET[port] = (1UL << pin);\r
104         }\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] = 1UL << pin;\r
108 #else\r
109         base->DIR[port] |= 1UL << pin;\r
110 #endif /*FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR*/\r
111     }\r
112 }\r
113 \r
114 #if defined(FSL_FEATURE_GPIO_HAS_INTERRUPT) && FSL_FEATURE_GPIO_HAS_INTERRUPT\r
115 /*!\r
116  * @brief Configures the gpio pin interrupt.\r
117  *\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
122  */\r
123 void GPIO_SetPinInterruptConfig(GPIO_Type *base, uint32_t port, uint32_t pin, gpio_interrupt_config_t *config)\r
124 {\r
125     base->INTEDG[port] = base->INTEDG[port] | ((uint32_t)config->mode << pin);\r
126 \r
127     base->INTPOL[port] = base->INTPOL[port] | ((uint32_t)config->polarity << pin);\r
128 }\r
129 \r
130 /*!\r
131  * @brief Enables multiple pins interrupt.\r
132  *\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
137  */\r
138 void GPIO_PortEnableInterrupts(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask)\r
139 {\r
140     if ((uint32_t)kGPIO_InterruptA == index)\r
141     {\r
142         base->INTENA[port] = base->INTENA[port] | mask;\r
143     }\r
144     else if ((uint32_t)kGPIO_InterruptB == index)\r
145     {\r
146         base->INTENB[port] = base->INTENB[port] | mask;\r
147     }\r
148     else\r
149     {\r
150         /*Should not enter here*/\r
151     }\r
152 }\r
153 \r
154 /*!\r
155  * @brief Disables multiple pins interrupt.\r
156  *\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
161  */\r
162 void GPIO_PortDisableInterrupts(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask)\r
163 {\r
164     if ((uint32_t)kGPIO_InterruptA == index)\r
165     {\r
166         base->INTENA[port] = base->INTENA[port] & ~mask;\r
167     }\r
168     else if ((uint32_t)kGPIO_InterruptB == index)\r
169     {\r
170         base->INTENB[port] = base->INTENB[port] & ~mask;\r
171     }\r
172     else\r
173     {\r
174         /*Should not enter here*/\r
175     }\r
176 }\r
177 \r
178 /*!\r
179  * @brief Clears multiple pins interrupt flag. Status flags are cleared by\r
180  *        writing a 1 to the corresponding bit position.\r
181  *\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
186  */\r
187 void GPIO_PortClearInterruptFlags(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask)\r
188 {\r
189     if ((uint32_t)kGPIO_InterruptA == index)\r
190     {\r
191         base->INTSTATA[port] = mask;\r
192     }\r
193     else if ((uint32_t)kGPIO_InterruptB == index)\r
194     {\r
195         base->INTSTATB[port] = mask;\r
196     }\r
197     else\r
198     {\r
199         /*Should not enter here*/\r
200     }\r
201 }\r
202 \r
203 /*!\r
204  * @ Read port interrupt status.\r
205  *\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
210  */\r
211 uint32_t GPIO_PortGetInterruptStatus(GPIO_Type *base, uint32_t port, uint32_t index)\r
212 {\r
213     uint32_t status = 0U;\r
214 \r
215     if ((uint32_t)kGPIO_InterruptA == index)\r
216     {\r
217         status = base->INTSTATA[port];\r
218     }\r
219     else if ((uint32_t)kGPIO_InterruptB == index)\r
220     {\r
221         status = base->INTSTATB[port];\r
222     }\r
223     else\r
224     {\r
225         /*Should not enter here*/\r
226     }\r
227     return status;\r
228 }\r
229 \r
230 /*!\r
231  * @brief Enables the specific pin interrupt.\r
232  *\r
233  * @param base GPIO base pointer.\r
234  * @param port   GPIO port number.\r
235  * @param pin GPIO pin number.\r
236  * @param index GPIO interrupt number.\r
237  */\r
238 void GPIO_PinEnableInterrupt(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index)\r
239 {\r
240     if ((uint32_t)kGPIO_InterruptA == index)\r
241     {\r
242         base->INTENA[port] = base->INTENA[port] | (1UL << pin);\r
243     }\r
244     else if ((uint32_t)kGPIO_InterruptB == index)\r
245     {\r
246         base->INTENB[port] = base->INTENB[port] | (1UL << pin);\r
247     }\r
248     else\r
249     {\r
250         /*Should not enter here*/\r
251     }\r
252 }\r
253 \r
254 /*!\r
255  * @brief Disables the specific pin interrupt.\r
256  *\r
257  * @param base GPIO base pointer.\r
258  * @param port   GPIO port number.\r
259  * @param pin GPIO pin number.\r
260  * @param index GPIO interrupt number.\r
261  */\r
262 void GPIO_PinDisableInterrupt(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index)\r
263 {\r
264     if ((uint32_t)kGPIO_InterruptA == index)\r
265     {\r
266         base->INTENA[port] = base->INTENA[port] & ~(1UL << pin);\r
267     }\r
268     else if ((uint32_t)kGPIO_InterruptB == index)\r
269     {\r
270         base->INTENB[port] = base->INTENB[port] & ~(1UL << pin);\r
271     }\r
272     else\r
273     {\r
274         /*Should not enter here*/\r
275     }\r
276 }\r
277 \r
278 /*!\r
279  * @brief Clears the specific pin interrupt flag. Status flags are cleared by\r
280  *        writing a 1 to the corresponding bit position.\r
281  *\r
282  * @param base GPIO base pointer.\r
283  * @param port GPIO port number.\r
284  * @param index GPIO interrupt number.\r
285  * @param mask GPIO pin number macro.\r
286  */\r
287 void GPIO_PinClearInterruptFlag(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index)\r
288 {\r
289     if ((uint32_t)kGPIO_InterruptA == index)\r
290     {\r
291         base->INTSTATA[port] = 1UL << pin;\r
292     }\r
293     else if ((uint32_t)kGPIO_InterruptB == index)\r
294     {\r
295         base->INTSTATB[port] = 1UL << pin;\r
296     }\r
297     else\r
298     {\r
299         /*Should not enter here*/\r
300     }\r
301 }\r
302 #endif /* FSL_FEATURE_GPIO_HAS_INTERRUPT */\r