1 /*
2  * Copyright (c) 2015, Freescale Semiconductor, Inc.
3  * Copyright 2016-2017 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #include "fsl_gpio.h"
10 
11 /*******************************************************************************
12  * Variables
13  ******************************************************************************/
14 static PORT_Type *const s_portBases[] = PORT_BASE_PTRS;
15 static GPIO_Type *const s_gpioBases[] = GPIO_BASE_PTRS;
16 
17 #if defined(FSL_FEATURE_SOC_FGPIO_COUNT) && FSL_FEATURE_SOC_FGPIO_COUNT
18 
19 #if defined(FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL) && FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL
20 
21 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
22 /*! @brief Array to map FGPIO instance number to clock name. */
23 static const clock_ip_name_t s_fgpioClockName[] = FGPIO_CLOCKS;
24 #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
25 
26 #endif /* FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL */
27 
28 #endif /* FSL_FEATURE_SOC_FGPIO_COUNT */
29 
30 /*******************************************************************************
31 * Prototypes
32 ******************************************************************************/
33 
34 /*!
35 * @brief Gets the GPIO instance according to the GPIO base
36 *
37 * @param base    GPIO peripheral base pointer(PTA, PTB, PTC, etc.)
38 * @retval GPIO instance
39 */
40 static uint32_t GPIO_GetInstance(GPIO_Type *base);
41 
42 /*******************************************************************************
43  * Code
44  ******************************************************************************/
45 
GPIO_GetInstance(GPIO_Type * base)46 static uint32_t GPIO_GetInstance(GPIO_Type *base)
47 {
48     uint32_t instance;
49 
50     /* Find the instance index from base address mappings. */
51     for (instance = 0; instance < ARRAY_SIZE(s_gpioBases); instance++)
52     {
53         if (s_gpioBases[instance] == base)
54         {
55             break;
56         }
57     }
58 
59     assert(instance < ARRAY_SIZE(s_gpioBases));
60 
61     return instance;
62 }
63 
GPIO_PinInit(GPIO_Type * base,uint32_t pin,const gpio_pin_config_t * config)64 void GPIO_PinInit(GPIO_Type *base, uint32_t pin, const gpio_pin_config_t *config)
65 {
66     assert(config);
67 
68     if (config->pinDirection == kGPIO_DigitalInput)
69     {
70         base->PDDR &= ~(1U << pin);
71     }
72     else
73     {
74         GPIO_WritePinOutput(base, pin, config->outputLogic);
75         base->PDDR |= (1U << pin);
76     }
77 }
78 
GPIO_GetPinsInterruptFlags(GPIO_Type * base)79 uint32_t GPIO_GetPinsInterruptFlags(GPIO_Type *base)
80 {
81     uint8_t instance;
82     PORT_Type *portBase;
83     instance = GPIO_GetInstance(base);
84     portBase = s_portBases[instance];
85     return portBase->ISFR;
86 }
87 
GPIO_ClearPinsInterruptFlags(GPIO_Type * base,uint32_t mask)88 void GPIO_ClearPinsInterruptFlags(GPIO_Type *base, uint32_t mask)
89 {
90     uint8_t instance;
91     PORT_Type *portBase;
92     instance = GPIO_GetInstance(base);
93     portBase = s_portBases[instance];
94     portBase->ISFR = mask;
95 }
96 
97 #if defined(FSL_FEATURE_GPIO_HAS_ATTRIBUTE_CHECKER) && FSL_FEATURE_GPIO_HAS_ATTRIBUTE_CHECKER
GPIO_CheckAttributeBytes(GPIO_Type * base,gpio_checker_attribute_t attribute)98 void GPIO_CheckAttributeBytes(GPIO_Type *base, gpio_checker_attribute_t attribute)
99 {
100     base->GACR = ((uint32_t)attribute << GPIO_GACR_ACB0_SHIFT) | ((uint32_t)attribute << GPIO_GACR_ACB1_SHIFT) |
101                  ((uint32_t)attribute << GPIO_GACR_ACB2_SHIFT) | ((uint32_t)attribute << GPIO_GACR_ACB3_SHIFT);
102 }
103 #endif
104 
105 #if defined(FSL_FEATURE_SOC_FGPIO_COUNT) && FSL_FEATURE_SOC_FGPIO_COUNT
106 
107 /*******************************************************************************
108  * Variables
109  ******************************************************************************/
110 static FGPIO_Type *const s_fgpioBases[] = FGPIO_BASE_PTRS;
111 
112 /*******************************************************************************
113 * Prototypes
114 ******************************************************************************/
115 /*!
116 * @brief Gets the FGPIO instance according to the GPIO base
117 *
118 * @param base    FGPIO peripheral base pointer(PTA, PTB, PTC, etc.)
119 * @retval FGPIO instance
120 */
121 static uint32_t FGPIO_GetInstance(FGPIO_Type *base);
122 
123 /*******************************************************************************
124  * Code
125  ******************************************************************************/
126 
FGPIO_GetInstance(FGPIO_Type * base)127 static uint32_t FGPIO_GetInstance(FGPIO_Type *base)
128 {
129     uint32_t instance;
130 
131     /* Find the instance index from base address mappings. */
132     for (instance = 0; instance < ARRAY_SIZE(s_fgpioBases); instance++)
133     {
134         if (s_fgpioBases[instance] == base)
135         {
136             break;
137         }
138     }
139 
140     assert(instance < ARRAY_SIZE(s_fgpioBases));
141 
142     return instance;
143 }
144 
145 #if defined(FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL) && FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL
FGPIO_Init(FGPIO_Type * base)146 void FGPIO_Init(FGPIO_Type *base)
147 {
148 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
149     /* Ungate FGPIO periphral clock */
150     CLOCK_EnableClock(s_fgpioClockName[FGPIO_GetInstance(base)]);
151 #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
152 }
153 #endif /* FSL_FEATURE_PCC_HAS_FGPIO_CLOCK_GATE_CONTROL */
154 
FGPIO_PinInit(FGPIO_Type * base,uint32_t pin,const gpio_pin_config_t * config)155 void FGPIO_PinInit(FGPIO_Type *base, uint32_t pin, const gpio_pin_config_t *config)
156 {
157     assert(config);
158 
159     if (config->pinDirection == kGPIO_DigitalInput)
160     {
161         base->PDDR &= ~(1U << pin);
162     }
163     else
164     {
165         FGPIO_WritePinOutput(base, pin, config->outputLogic);
166         base->PDDR |= (1U << pin);
167     }
168 }
169 
FGPIO_GetPinsInterruptFlags(FGPIO_Type * base)170 uint32_t FGPIO_GetPinsInterruptFlags(FGPIO_Type *base)
171 {
172     uint8_t instance;
173     instance = FGPIO_GetInstance(base);
174     PORT_Type *portBase;
175     portBase = s_portBases[instance];
176     return portBase->ISFR;
177 }
178 
FGPIO_ClearPinsInterruptFlags(FGPIO_Type * base,uint32_t mask)179 void FGPIO_ClearPinsInterruptFlags(FGPIO_Type *base, uint32_t mask)
180 {
181     uint8_t instance;
182     instance = FGPIO_GetInstance(base);
183     PORT_Type *portBase;
184     portBase = s_portBases[instance];
185     portBase->ISFR = mask;
186 }
187 
188 #if defined(FSL_FEATURE_FGPIO_HAS_ATTRIBUTE_CHECKER) && FSL_FEATURE_FGPIO_HAS_ATTRIBUTE_CHECKER
FGPIO_CheckAttributeBytes(FGPIO_Type * base,gpio_checker_attribute_t attribute)189 void FGPIO_CheckAttributeBytes(FGPIO_Type *base, gpio_checker_attribute_t attribute)
190 {
191     base->GACR = (attribute << FGPIO_GACR_ACB0_SHIFT) | (attribute << FGPIO_GACR_ACB1_SHIFT) |
192                  (attribute << FGPIO_GACR_ACB2_SHIFT) | (attribute << FGPIO_GACR_ACB3_SHIFT);
193 }
194 #endif
195 
196 #endif /* FSL_FEATURE_SOC_FGPIO_COUNT */
197