1 /*
2  * Copyright 2018 - 2019, 2023 NXP
3  * All rights reserved.
4  *
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 #include "fsl_device_registers.h"
9 #include "fsl_gpio.h"
10 #if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \
11     defined(FSL_FEATURE_SOC_PORT_COUNT)
12 #include "fsl_port.h"
13 #endif
14 #include "fsl_adapter_gpio.h"
15 
16 /* Component ID definition, used by tools. */
17 #ifndef FSL_COMPONENT_ID
18 #define FSL_COMPONENT_ID "component.gpio_adapter"
19 #endif
20 
21 /*******************************************************************************
22  * Definitions
23  ******************************************************************************/
24 
25 #if defined(__GNUC__)
26 #define HAL_GPIO_CLZ(x) __builtin_clz(x)
27 #elif defined(__ICCARM__)
28 #define HAL_GPIO_CLZ(x) __CLZ(x)
29 #elif defined(__CC_ARM) || defined(__ARMCC_VERSION)
30 #define HAL_GPIO_CLZ(x) __builtin_clz(x)
31 #else
32 #error The tool-chain is not supported.
33 #endif
34 #define HAL_GPIO_BSR(x) (31U - (uint8_t)HAL_GPIO_CLZ(x))
35 
36 /*! @brief The pin config struct of gpio adapter. */
37 
38 typedef struct _hal_gpio_pin
39 {
40     uint16_t port : 3U;
41     uint16_t reserved : 1U;
42     uint16_t pin : 5U;
43     uint16_t direction : 1U;
44     uint16_t trigger : 3U;
45     uint16_t reserved2 : 3U;
46 } hal_gpio_pin_t;
47 
48 typedef struct _hal_gpio_state
49 {
50     struct _hal_gpio_state *next;
51     hal_gpio_callback_t callback;
52     void *callbackParam;
53     hal_gpio_direction_t direction;
54     uint8_t level;
55     uint8_t port;
56     uint8_t pin : 5U;
57     uint8_t trigger : 3U;
58 } hal_gpio_state_t;
59 
60 /*******************************************************************************
61  * Prototypes
62  ******************************************************************************/
63 
64 /*******************************************************************************
65  * Variables
66  ******************************************************************************/
67 
68 static GPIO_Type *const s_GpioPort[] = GPIO_BASE_PTRS;
69 static hal_gpio_state_t *s_GpioHead;
70 
71 /*******************************************************************************
72  * Code
73  ******************************************************************************/
74 
HAL_GpioInterruptHandle(uint8_t port)75 static void HAL_GpioInterruptHandle(uint8_t port)
76 {
77     hal_gpio_state_t *head = s_GpioHead;
78     uint32_t pinInterruptSetFlag;
79     uint8_t pin;
80 
81     while (NULL != head)
82     {
83         if (head->port == port)
84         {
85             break;
86         }
87         head = head->next;
88     }
89 
90     if (NULL == head)
91     {
92         return;
93     }
94 
95     head = s_GpioHead;
96 
97 #if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \
98     defined(FSL_FEATURE_SOC_PORT_COUNT)
99     pinInterruptSetFlag = GPIO_PortGetInterruptFlags(s_GpioPort[port]);
100     /* Clear external interrupt flag. */
101     GPIO_PortClearInterruptFlags(s_GpioPort[port], pinInterruptSetFlag);
102 #else
103     pinInterruptSetFlag = GPIO_GpioGetInterruptFlags(s_GpioPort[port]);
104     /* Clear external interrupt flag. */
105     GPIO_GpioClearInterruptFlags(s_GpioPort[port], pinInterruptSetFlag);
106 #endif
107     if (0U != pinInterruptSetFlag)
108     {
109         pin = HAL_GPIO_BSR(pinInterruptSetFlag);
110         while (NULL != head)
111         {
112             if ((pin == head->pin) && (port == head->port))
113             {
114                 if (NULL != head->callback)
115                 {
116                     head->callback(head->callbackParam);
117                 }
118                 pinInterruptSetFlag &= ~(0x01UL << pin);
119                 if (0U == pinInterruptSetFlag)
120                 {
121                     break;
122                 }
123                 pin = HAL_GPIO_BSR(pinInterruptSetFlag);
124             }
125             head = head->next;
126         }
127     }
128 }
129 
130 #if (defined(HAL_GPIO_CONFLICT_CHECK_ENABLE) && (HAL_GPIO_CONFLICT_CHECK_ENABLE > 0U))
HAL_GpioConflictSearch(hal_gpio_state_t * head,uint8_t port,uint8_t pin)131 static hal_gpio_status_t HAL_GpioConflictSearch(hal_gpio_state_t *head, uint8_t port, uint8_t pin)
132 {
133     while (NULL != head)
134     {
135         if ((head->port == port) && (head->pin == pin))
136         {
137             return kStatus_HAL_GpioPinConflict;
138         }
139         head = head->next;
140     }
141     return kStatus_HAL_GpioSuccess;
142 }
143 #endif /* HAL_GPIO_CONFLICT_CHECK_ENABLE */
144 
HAL_GpioAddItem(hal_gpio_state_t ** head,hal_gpio_state_t * node)145 static hal_gpio_status_t HAL_GpioAddItem(hal_gpio_state_t **head, hal_gpio_state_t *node)
146 {
147     hal_gpio_state_t *p = *head;
148     hal_gpio_state_t *q = *head;
149     uint32_t regPrimask;
150 
151     regPrimask = DisableGlobalIRQ();
152 
153     if (NULL == p)
154     {
155         *head = node;
156     }
157     else
158     {
159         while (NULL != p)
160         {
161             if (p == node)
162             {
163                 EnableGlobalIRQ(regPrimask);
164                 return kStatus_HAL_GpioPinConflict;
165             }
166             q = p;
167             p = p->next;
168         }
169 
170         q->next = node;
171     }
172     node->next = NULL;
173     EnableGlobalIRQ(regPrimask);
174     return kStatus_HAL_GpioSuccess;
175 }
176 
HAL_GpioRemoveItem(hal_gpio_state_t ** head,hal_gpio_state_t * node)177 static hal_gpio_status_t HAL_GpioRemoveItem(hal_gpio_state_t **head, hal_gpio_state_t *node)
178 {
179     hal_gpio_state_t *p = *head;
180     hal_gpio_state_t *q = NULL;
181     uint32_t regPrimask;
182 
183     regPrimask = DisableGlobalIRQ();
184     while (p != NULL)
185     {
186         if (p == node)
187         {
188             if (NULL == q)
189             {
190                 *head = p->next;
191             }
192             else
193             {
194                 q->next = p->next;
195             }
196             break;
197         }
198         else
199         {
200             q = p;
201             p = p->next;
202         }
203     }
204     EnableGlobalIRQ(regPrimask);
205     return kStatus_HAL_GpioSuccess;
206 }
207 
208 #if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \
209     (defined(FSL_FEATURE_SOC_PORT_COUNT))
210 
211 #if (FSL_FEATURE_SOC_GPIO_COUNT > 0U)
212 void PORTA_IRQHandler(void);
PORTA_IRQHandler(void)213 void PORTA_IRQHandler(void)
214 {
215     HAL_GpioInterruptHandle(0);
216     SDK_ISR_EXIT_BARRIER;
217 }
218 #endif
219 
220 #if (FSL_FEATURE_SOC_GPIO_COUNT > 1U)
221 void PORTB_IRQHandler(void);
PORTB_IRQHandler(void)222 void PORTB_IRQHandler(void)
223 {
224     HAL_GpioInterruptHandle(1);
225     SDK_ISR_EXIT_BARRIER;
226 }
227 #endif
228 
229 #if (FSL_FEATURE_SOC_GPIO_COUNT > 2U)
230 void PORTC_IRQHandler(void);
PORTC_IRQHandler(void)231 void PORTC_IRQHandler(void)
232 {
233     HAL_GpioInterruptHandle(2);
234     SDK_ISR_EXIT_BARRIER;
235 }
236 #endif
237 
238 #if (FSL_FEATURE_SOC_GPIO_COUNT > 2U)
239 void PORTB_PORTC_IRQHandler(void);
PORTB_PORTC_IRQHandler(void)240 void PORTB_PORTC_IRQHandler(void)
241 {
242     HAL_GpioInterruptHandle(1);
243     HAL_GpioInterruptHandle(2);
244     SDK_ISR_EXIT_BARRIER;
245 }
246 #endif
247 
248 #if (FSL_FEATURE_SOC_GPIO_COUNT > 4U)
249 void PORTB_PORTC_PORTD_PORTE_IRQHandler(void);
PORTB_PORTC_PORTD_PORTE_IRQHandler(void)250 void PORTB_PORTC_PORTD_PORTE_IRQHandler(void)
251 {
252     HAL_GpioInterruptHandle(1);
253     HAL_GpioInterruptHandle(2);
254     HAL_GpioInterruptHandle(3);
255     HAL_GpioInterruptHandle(4);
256     SDK_ISR_EXIT_BARRIER;
257 }
258 #endif
259 
260 #if (FSL_FEATURE_SOC_GPIO_COUNT > 3U)
261 void PORTC_PORTD_IRQHandler(void);
PORTC_PORTD_IRQHandler(void)262 void PORTC_PORTD_IRQHandler(void)
263 {
264     HAL_GpioInterruptHandle(2);
265     HAL_GpioInterruptHandle(3);
266     SDK_ISR_EXIT_BARRIER;
267 }
268 #endif
269 
270 #if (FSL_FEATURE_SOC_GPIO_COUNT > 3U)
271 void PORTD_IRQHandler(void);
PORTD_IRQHandler(void)272 void PORTD_IRQHandler(void)
273 {
274     HAL_GpioInterruptHandle(3);
275     SDK_ISR_EXIT_BARRIER;
276 }
277 #endif
278 
279 #if (FSL_FEATURE_SOC_GPIO_COUNT > 4U)
280 void PORTE_IRQHandler(void);
PORTE_IRQHandler(void)281 void PORTE_IRQHandler(void)
282 {
283     HAL_GpioInterruptHandle(4);
284     SDK_ISR_EXIT_BARRIER;
285 }
286 #endif
287 
288 #if (FSL_FEATURE_SOC_GPIO_COUNT > 5U)
289 void PORTF_IRQHandler(void);
PORTF_IRQHandler(void)290 void PORTF_IRQHandler(void)
291 {
292     HAL_GpioInterruptHandle(5);
293     SDK_ISR_EXIT_BARRIER;
294 }
295 #endif
296 
297 #else
298 
299 #if (FSL_FEATURE_SOC_GPIO_COUNT > 0U)
300 void GPIOA_INT0_IRQHandler(void);
GPIOA_INT0_IRQHandler(void)301 void GPIOA_INT0_IRQHandler(void)
302 {
303     HAL_GpioInterruptHandle(0);
304     SDK_ISR_EXIT_BARRIER;
305 }
306 
307 void GPIOA_INT1_IRQHandler(void);
GPIOA_INT1_IRQHandler(void)308 void GPIOA_INT1_IRQHandler(void)
309 {
310     GPIOA_INT0_IRQHandler();
311 }
312 #endif
313 
314 #if (FSL_FEATURE_SOC_GPIO_COUNT > 1U)
315 void GPIOB_INT0_IRQHandler(void);
GPIOB_INT0_IRQHandler(void)316 void GPIOB_INT0_IRQHandler(void)
317 {
318     HAL_GpioInterruptHandle(1);
319     SDK_ISR_EXIT_BARRIER;
320 }
321 void GPIOB_INT1_IRQHandler(void);
GPIOB_INT1_IRQHandler(void)322 void GPIOB_INT1_IRQHandler(void)
323 {
324     GPIOB_INT0_IRQHandler();
325 }
326 #endif
327 
328 #if (FSL_FEATURE_SOC_GPIO_COUNT > 2U)
329 void GPIOC_INT0_IRQHandler(void);
GPIOC_INT0_IRQHandler(void)330 void GPIOC_INT0_IRQHandler(void)
331 {
332     HAL_GpioInterruptHandle(2);
333     SDK_ISR_EXIT_BARRIER;
334 }
335 void GPIOC_INT1_IRQHandler(void);
GPIOC_INT1_IRQHandler(void)336 void GPIOC_INT1_IRQHandler(void)
337 {
338     GPIOC_INT0_IRQHandler();
339 }
340 #endif
341 
342 #if (FSL_FEATURE_SOC_GPIO_COUNT > 3U)
343 void GPIOD_INT0_IRQHandler(void);
GPIOD_INT0_IRQHandler(void)344 void GPIOD_INT0_IRQHandler(void)
345 {
346     HAL_GpioInterruptHandle(3);
347     SDK_ISR_EXIT_BARRIER;
348 }
349 void GPIOD_INT1_IRQHandler(void);
GPIOD_INT1_IRQHandler(void)350 void GPIOD_INT1_IRQHandler(void)
351 {
352     GPIOD_INT0_IRQHandler();
353 }
354 #endif
355 
356 #if (FSL_FEATURE_SOC_GPIO_COUNT > 0U)
357 void GPIO00_DriverIRQHandler(void);
GPIO00_DriverIRQHandler(void)358 void GPIO00_DriverIRQHandler(void)
359 {
360     HAL_GpioInterruptHandle(0);
361     SDK_ISR_EXIT_BARRIER;
362 }
363 
364 void GPIO01_DriverIRQHandler(void);
GPIO01_DriverIRQHandler(void)365 void GPIO01_DriverIRQHandler(void)
366 {
367     GPIO00_DriverIRQHandler();
368 }
369 #endif
370 
371 #if (FSL_FEATURE_SOC_GPIO_COUNT > 1U)
372 void GPIO10_DriverIRQHandler(void);
GPIO10_DriverIRQHandler(void)373 void GPIO10_DriverIRQHandler(void)
374 {
375     HAL_GpioInterruptHandle(1);
376     SDK_ISR_EXIT_BARRIER;
377 }
378 void GPIO11_DriverIRQHandler(void);
GPIO11_DriverIRQHandler(void)379 void GPIO11_DriverIRQHandler(void)
380 {
381     GPIO10_DriverIRQHandler();
382 }
383 #endif
384 
385 #if (FSL_FEATURE_SOC_GPIO_COUNT > 2U)
386 void GPIO20_DriverIRQHandler(void);
GPIO20_DriverIRQHandler(void)387 void GPIO20_DriverIRQHandler(void)
388 {
389     HAL_GpioInterruptHandle(2);
390     SDK_ISR_EXIT_BARRIER;
391 }
392 void GPIO21_DriverIRQHandler(void);
GPIO21_DriverIRQHandler(void)393 void GPIO21_DriverIRQHandler(void)
394 {
395     GPIO20_DriverIRQHandler();
396 }
397 #endif
398 
399 #if (FSL_FEATURE_SOC_GPIO_COUNT > 3U)
400 void GPIO30_DriverIRQHandler(void);
GPIO30_DriverIRQHandler(void)401 void GPIO30_DriverIRQHandler(void)
402 {
403     HAL_GpioInterruptHandle(3);
404     SDK_ISR_EXIT_BARRIER;
405 }
406 void GPIO31_DriverIRQHandler(void);
GPIO31_DriverIRQHandler(void)407 void GPIO31_DriverIRQHandler(void)
408 {
409     GPIO30_DriverIRQHandler();
410 }
411 #endif
412 
413 #if (FSL_FEATURE_SOC_GPIO_COUNT > 4U)
414 void GPIO40_DriverIRQHandler(void);
GPIO40_DriverIRQHandler(void)415 void GPIO40_DriverIRQHandler(void)
416 {
417     HAL_GpioInterruptHandle(4);
418     SDK_ISR_EXIT_BARRIER;
419 }
420 void GPIO41_DriverIRQHandler(void);
GPIO41_DriverIRQHandler(void)421 void GPIO41_DriverIRQHandler(void)
422 {
423     GPIO40_DriverIRQHandler();
424 }
425 #endif
426 
427 #if (FSL_FEATURE_SOC_GPIO_COUNT > 5U)
428 void GPIO50_DriverIRQHandler(void);
GPIO50_DriverIRQHandler(void)429 void GPIO50_DriverIRQHandler(void)
430 {
431     HAL_GpioInterruptHandle(5);
432     SDK_ISR_EXIT_BARRIER;
433 }
434 void GPIO51_DriverIRQHandler(void);
GPIO51_DriverIRQHandler(void)435 void GPIO51_DriverIRQHandler(void)
436 {
437     GPIO50_DriverIRQHandler();
438 }
439 #endif
440 
441 #if (FSL_FEATURE_SOC_GPIO_COUNT > 6U)
442 void GPIO60_DriverIRQHandler(void);
GPIO60_DriverIRQHandler(void)443 void GPIO60_DriverIRQHandler(void)
444 {
445     HAL_GpioInterruptHandle(6);
446     SDK_ISR_EXIT_BARRIER;
447 }
448 void GPIO61_DriverIRQHandler(void);
GPIO61_DriverIRQHandler(void)449 void GPIO61_DriverIRQHandler(void)
450 {
451     GPIO60_DriverIRQHandler();
452 }
453 #endif
454 
455 #if (FSL_FEATURE_SOC_GPIO_COUNT > 7U)
456 void GPIO70_DriverIRQHandler(void);
GPIO70_DriverIRQHandler(void)457 void GPIO70_DriverIRQHandler(void)
458 {
459     HAL_GpioInterruptHandle(7);
460     SDK_ISR_EXIT_BARRIER;
461 }
462 void GPIO71_DriverIRQHandler(void);
GPIO71_DriverIRQHandler(void)463 void GPIO71_DriverIRQHandler(void)
464 {
465     GPIO70_DriverIRQHandler();
466 }
467 #endif
468 
469 #if (FSL_FEATURE_SOC_GPIO_COUNT > 8U)
470 void GPIO80_DriverIRQHandler(void);
GPIO80_DriverIRQHandler(void)471 void GPIO80_DriverIRQHandler(void)
472 {
473     HAL_GpioInterruptHandle(8);
474     SDK_ISR_EXIT_BARRIER;
475 }
476 void GPIO81_DriverIRQHandler(void);
GPIO81_DriverIRQHandler(void)477 void GPIO81_DriverIRQHandler(void)
478 {
479     GPIO80_DriverIRQHandler();
480 }
481 #endif
482 
483 #if (FSL_FEATURE_SOC_GPIO_COUNT > 9U)
484 void GPIO90_DriverIRQHandler(void);
GPIO90_DriverIRQHandler(void)485 void GPIO90_DriverIRQHandler(void)
486 {
487     HAL_GpioInterruptHandle(9);
488     SDK_ISR_EXIT_BARRIER;
489 }
490 void GPIO91_DriverIRQHandler(void);
GPIO91_DriverIRQHandler(void)491 void GPIO91_DriverIRQHandler(void)
492 {
493     GPIO90_DriverIRQHandler();
494 }
495 #endif
496 
497 #if (FSL_FEATURE_SOC_GPIO_COUNT > 10U)
498 void GPIO100_DriverIRQHandler(void);
GPIO100_DriverIRQHandler(void)499 void GPIO100_DriverIRQHandler(void)
500 {
501     HAL_GpioInterruptHandle(10);
502     SDK_ISR_EXIT_BARRIER;
503 }
504 void GPIO101_DriverIRQHandler(void);
GPIO101_DriverIRQHandler(void)505 void GPIO101_DriverIRQHandler(void)
506 {
507     GPIO100_DriverIRQHandler();
508 }
509 #endif
510 
511 #if (FSL_FEATURE_SOC_GPIO_COUNT > 0U)
512 void GPIO0_IRQHandler(void);
GPIO0_IRQHandler(void)513 void GPIO0_IRQHandler(void)
514 {
515     HAL_GpioInterruptHandle(0);
516     SDK_ISR_EXIT_BARRIER;
517 }
518 #endif
519 
520 #if (FSL_FEATURE_SOC_GPIO_COUNT > 1U)
521 void GPIO1_IRQHandler(void);
GPIO1_IRQHandler(void)522 void GPIO1_IRQHandler(void)
523 {
524     HAL_GpioInterruptHandle(1);
525     SDK_ISR_EXIT_BARRIER;
526 }
527 #endif
528 
529 #if (FSL_FEATURE_SOC_GPIO_COUNT > 2U)
530 void GPIO2_IRQHandler(void);
GPIO2_IRQHandler(void)531 void GPIO2_IRQHandler(void)
532 {
533     HAL_GpioInterruptHandle(2);
534     SDK_ISR_EXIT_BARRIER;
535 }
536 #endif
537 
538 #if (FSL_FEATURE_SOC_GPIO_COUNT > 3U)
539 void GPIO3_IRQHandler(void);
GPIO3_IRQHandler(void)540 void GPIO3_IRQHandler(void)
541 {
542     HAL_GpioInterruptHandle(3);
543     SDK_ISR_EXIT_BARRIER;
544 }
545 #endif
546 
547 #endif
548 
HAL_GpioPreInit(void)549 void HAL_GpioPreInit(void)
550 {
551     s_GpioHead = NULL;
552 }
553 
HAL_GpioInit(hal_gpio_handle_t gpioHandle,hal_gpio_pin_config_t * pinConfig)554 hal_gpio_status_t HAL_GpioInit(hal_gpio_handle_t gpioHandle, hal_gpio_pin_config_t *pinConfig)
555 {
556     hal_gpio_state_t *gpioState;
557     hal_gpio_status_t status;
558 
559     assert(gpioHandle);
560     assert(pinConfig);
561     assert(HAL_GPIO_HANDLE_SIZE >= sizeof(hal_gpio_state_t));
562 
563     gpioState = (hal_gpio_state_t *)gpioHandle;
564 
565 #if (defined(HAL_GPIO_CONFLICT_CHECK_ENABLE) && (HAL_GPIO_CONFLICT_CHECK_ENABLE > 0U))
566     if ((NULL != s_GpioHead) &&
567         (kStatus_HAL_GpioSuccess != HAL_GpioConflictSearch(s_GpioHead, pinConfig->port, pinConfig->pin)))
568     {
569         return kStatus_HAL_GpioPinConflict;
570     }
571 #endif /* HAL_GPIO_CONFLICT_CHECK_ENABLE */
572 
573     status = HAL_GpioAddItem(&s_GpioHead, gpioState);
574     if (kStatus_HAL_GpioSuccess != status)
575     {
576         return status;
577     }
578 
579     (void)memcpy((void *)&gpioState->direction, (void *)pinConfig, sizeof(hal_gpio_pin_config_t));
580 
581     GPIO_PinInit(s_GpioPort[pinConfig->port], pinConfig->pin, (const gpio_pin_config_t *)(void *)&pinConfig->direction);
582     return kStatus_HAL_GpioSuccess;
583 }
584 
HAL_GpioDeinit(hal_gpio_handle_t gpioHandle)585 hal_gpio_status_t HAL_GpioDeinit(hal_gpio_handle_t gpioHandle)
586 {
587     hal_gpio_state_t *gpioState;
588 
589     assert(gpioHandle);
590 
591     gpioState = (hal_gpio_state_t *)gpioHandle;
592     if (kHAL_GpioDirectionIn == gpioState->direction)
593     {
594         (void)HAL_GpioSetTriggerMode(gpioHandle, kHAL_GpioInterruptDisable);
595     }
596     (void)HAL_GpioRemoveItem(&s_GpioHead, gpioState);
597     return kStatus_HAL_GpioSuccess;
598 }
599 
HAL_GpioGetInput(hal_gpio_handle_t gpioHandle,uint8_t * pinState)600 hal_gpio_status_t HAL_GpioGetInput(hal_gpio_handle_t gpioHandle, uint8_t *pinState)
601 {
602     hal_gpio_state_t *gpioState;
603 
604     assert(gpioHandle);
605     assert(pinState);
606 
607     gpioState = (hal_gpio_state_t *)gpioHandle;
608 
609     *pinState = (GPIO_PinRead(s_GpioPort[gpioState->port], gpioState->pin) != 0U) ? 1U : 0U;
610     return kStatus_HAL_GpioSuccess;
611 }
612 
HAL_GpioSetOutput(hal_gpio_handle_t gpioHandle,uint8_t pinState)613 hal_gpio_status_t HAL_GpioSetOutput(hal_gpio_handle_t gpioHandle, uint8_t pinState)
614 {
615     hal_gpio_state_t *gpioState;
616 
617     assert(gpioHandle);
618 
619     gpioState = (hal_gpio_state_t *)gpioHandle;
620 
621     GPIO_PinWrite(s_GpioPort[gpioState->port], gpioState->pin, (pinState != 0U) ? 1U : 0U);
622     return kStatus_HAL_GpioSuccess;
623 }
624 
HAL_GpioInstallCallback(hal_gpio_handle_t gpioHandle,hal_gpio_callback_t callback,void * callbackParam)625 hal_gpio_status_t HAL_GpioInstallCallback(hal_gpio_handle_t gpioHandle,
626                                           hal_gpio_callback_t callback,
627                                           void *callbackParam)
628 {
629     hal_gpio_state_t *gpioState;
630 
631     assert(gpioHandle);
632 
633     gpioState = (hal_gpio_state_t *)gpioHandle;
634 
635     gpioState->callbackParam = callbackParam;
636     gpioState->callback      = callback;
637 
638     return kStatus_HAL_GpioSuccess;
639 }
640 
HAL_GpioGetTriggerMode(hal_gpio_handle_t gpioHandle,hal_gpio_interrupt_trigger_t * gpioTrigger)641 hal_gpio_status_t HAL_GpioGetTriggerMode(hal_gpio_handle_t gpioHandle, hal_gpio_interrupt_trigger_t *gpioTrigger)
642 {
643     hal_gpio_state_t *gpioState;
644 
645     assert(gpioHandle);
646 
647     gpioState = (hal_gpio_state_t *)gpioHandle;
648 
649     if (kHAL_GpioDirectionOut == gpioState->direction)
650     {
651         return kStatus_HAL_GpioError;
652     }
653 
654     *gpioTrigger = (hal_gpio_interrupt_trigger_t)gpioState->trigger;
655     return kStatus_HAL_GpioSuccess;
656 }
657 
HAL_GpioSetTriggerMode(hal_gpio_handle_t gpioHandle,hal_gpio_interrupt_trigger_t gpioTrigger)658 hal_gpio_status_t HAL_GpioSetTriggerMode(hal_gpio_handle_t gpioHandle, hal_gpio_interrupt_trigger_t gpioTrigger)
659 {
660     hal_gpio_state_t *gpioState;
661 #if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \
662     defined(FSL_FEATURE_SOC_PORT_COUNT)
663     PORT_Type *portList[]          = PORT_BASE_PTRS;
664     static const IRQn_Type irqNo[] = PORT_IRQS;
665     port_interrupt_t pinInt;
666 #else
667     gpio_interrupt_config_t pinInt;
668     static const IRQn_Type irqNo[] = GPIO_IRQS;
669 #endif
670 
671     assert(gpioHandle);
672 
673     gpioState = (hal_gpio_state_t *)gpioHandle;
674     assert(kHAL_GpioDirectionOut != gpioState->direction);
675 
676     switch (gpioTrigger)
677     {
678         case kHAL_GpioInterruptLogicZero:
679 #if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \
680     defined(FSL_FEATURE_SOC_PORT_COUNT)
681             pinInt = kPORT_InterruptLogicZero;
682 #else
683             pinInt = kGPIO_InterruptLogicZero;
684 #endif
685             break;
686         case kHAL_GpioInterruptLogicOne:
687 #if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \
688     defined(FSL_FEATURE_SOC_PORT_COUNT)
689             pinInt = kPORT_InterruptLogicOne;
690 #else
691             pinInt = kGPIO_InterruptLogicOne;
692 #endif
693             break;
694         case kHAL_GpioInterruptRisingEdge:
695 #if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \
696     defined(FSL_FEATURE_SOC_PORT_COUNT)
697             pinInt = kPORT_InterruptRisingEdge;
698 #else
699             pinInt = kGPIO_InterruptRisingEdge;
700 #endif
701             break;
702         case kHAL_GpioInterruptFallingEdge:
703 #if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \
704     defined(FSL_FEATURE_SOC_PORT_COUNT)
705             pinInt = kPORT_InterruptFallingEdge;
706 #else
707             pinInt = kGPIO_InterruptFallingEdge;
708 #endif
709             break;
710         case kHAL_GpioInterruptEitherEdge:
711 #if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \
712     defined(FSL_FEATURE_SOC_PORT_COUNT)
713             pinInt = kPORT_InterruptEitherEdge;
714 #else
715             pinInt = kGPIO_InterruptEitherEdge;
716 #endif
717             break;
718         default:
719 #if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \
720     defined(FSL_FEATURE_SOC_PORT_COUNT)
721             pinInt = kPORT_InterruptOrDMADisabled;
722 #else
723             pinInt = kGPIO_InterruptStatusFlagDisabled;
724 #endif
725             break;
726     }
727 
728     gpioState->trigger = (uint8_t)gpioTrigger;
729 
730     /* initialize port interrupt */
731 #if !(defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && \
732     defined(FSL_FEATURE_SOC_PORT_COUNT)
733     PORT_SetPinInterruptConfig(portList[gpioState->port], gpioState->pin, pinInt);
734 #else
735     GPIO_SetPinInterruptConfig(s_GpioPort[gpioState->port], gpioState->pin, pinInt);
736 #endif
737     NVIC_SetPriority(irqNo[gpioState->port], HAL_GPIO_ISR_PRIORITY);
738     NVIC_EnableIRQ(irqNo[gpioState->port]);
739 
740     return kStatus_HAL_GpioSuccess;
741 }
742 
HAL_GpioWakeUpSetting(hal_gpio_handle_t gpioHandle,uint8_t enable)743 hal_gpio_status_t HAL_GpioWakeUpSetting(hal_gpio_handle_t gpioHandle, uint8_t enable)
744 {
745     hal_gpio_state_t *gpioState;
746 
747     assert(gpioHandle);
748 
749     gpioState = (hal_gpio_state_t *)gpioHandle;
750 
751     if (kHAL_GpioDirectionOut == gpioState->direction)
752     {
753         return kStatus_HAL_GpioError;
754     }
755     /* The wakeup feature of GPIO cannot be disabled. */
756     if (0U == enable)
757     {
758         return kStatus_HAL_GpioError;
759     }
760     return kStatus_HAL_GpioSuccess;
761 }
762 
HAL_GpioEnterLowpower(hal_gpio_handle_t gpioHandle)763 hal_gpio_status_t HAL_GpioEnterLowpower(hal_gpio_handle_t gpioHandle)
764 {
765     assert(gpioHandle);
766 
767     return kStatus_HAL_GpioSuccess;
768 }
769 
HAL_GpioExitLowpower(hal_gpio_handle_t gpioHandle)770 hal_gpio_status_t HAL_GpioExitLowpower(hal_gpio_handle_t gpioHandle)
771 {
772     hal_gpio_state_t *gpioState;
773     gpio_pin_config_t gpioPinconfig = {
774         kGPIO_DigitalInput,
775         0,
776     };
777 
778     assert(gpioHandle);
779 
780     gpioState                  = (hal_gpio_state_t *)gpioHandle;
781     gpioPinconfig.pinDirection = kGPIO_DigitalInput;
782     if (kHAL_GpioDirectionOut == gpioState->direction)
783     {
784         gpioPinconfig.pinDirection = kGPIO_DigitalOutput;
785     }
786 
787     GPIO_PinInit(s_GpioPort[gpioState->port], gpioState->pin, &gpioPinconfig);
788     if (kHAL_GpioDirectionIn == gpioState->direction)
789     {
790         (void)HAL_GpioSetTriggerMode(gpioHandle, (hal_gpio_interrupt_trigger_t)gpioState->trigger);
791     }
792     return kStatus_HAL_GpioSuccess;
793 }
794