1 /******************************************************************************
2 *
3 * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by
4 * Analog Devices, Inc.),
5 * Copyright (C) 2023-2024 Analog Devices, Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 ******************************************************************************/
20
21 /* **** Includes **** */
22 #include <stddef.h>
23 #include "mxc_device.h"
24 #include "mxc_assert.h"
25 #include "mxc_errors.h"
26 #include "gpio.h"
27 #include "gpio_reva.h"
28 #include "gpio_common.h"
29
30 /* **** Functions **** */
MXC_GPIO_RevA_InGet(mxc_gpio_reva_regs_t * port,uint32_t mask)31 uint32_t MXC_GPIO_RevA_InGet(mxc_gpio_reva_regs_t *port, uint32_t mask)
32 {
33 return (port->in & mask);
34 }
35
MXC_GPIO_RevA_OutSet(mxc_gpio_reva_regs_t * port,uint32_t mask)36 void MXC_GPIO_RevA_OutSet(mxc_gpio_reva_regs_t *port, uint32_t mask)
37 {
38 port->out_set = mask;
39 }
40
MXC_GPIO_RevA_OutClr(mxc_gpio_reva_regs_t * port,uint32_t mask)41 void MXC_GPIO_RevA_OutClr(mxc_gpio_reva_regs_t *port, uint32_t mask)
42 {
43 port->out_clr = mask;
44 }
45
MXC_GPIO_RevA_OutGet(mxc_gpio_reva_regs_t * port,uint32_t mask)46 uint32_t MXC_GPIO_RevA_OutGet(mxc_gpio_reva_regs_t *port, uint32_t mask)
47 {
48 return (port->out & mask);
49 }
50
MXC_GPIO_RevA_OutPut(mxc_gpio_reva_regs_t * port,uint32_t mask,uint32_t val)51 void MXC_GPIO_RevA_OutPut(mxc_gpio_reva_regs_t *port, uint32_t mask, uint32_t val)
52 {
53 port->out = (port->out & ~mask) | (val & mask);
54 }
55
MXC_GPIO_RevA_OutToggle(mxc_gpio_reva_regs_t * port,uint32_t mask)56 void MXC_GPIO_RevA_OutToggle(mxc_gpio_reva_regs_t *port, uint32_t mask)
57 {
58 port->out ^= mask;
59 }
60
MXC_GPIO_RevA_IntConfig(const mxc_gpio_cfg_t * cfg,mxc_gpio_int_pol_t pol)61 int MXC_GPIO_RevA_IntConfig(const mxc_gpio_cfg_t *cfg, mxc_gpio_int_pol_t pol)
62 {
63 mxc_gpio_reva_regs_t *gpio = (mxc_gpio_reva_regs_t *)cfg->port;
64
65 switch (pol) {
66 case MXC_GPIO_INT_HIGH:
67 gpio->intpol |= cfg->mask;
68 gpio->dualedge &= ~cfg->mask;
69 gpio->intmode &= ~cfg->mask;
70 break;
71
72 case MXC_GPIO_INT_FALLING: /* MXC_GPIO_INT_HIGH */
73 gpio->intpol &= ~cfg->mask;
74 gpio->dualedge &= ~cfg->mask;
75 gpio->intmode |= cfg->mask;
76 break;
77
78 case MXC_GPIO_INT_LOW: /* MXC_GPIO_INT_LOW */
79 gpio->intpol &= ~cfg->mask;
80 gpio->dualedge &= ~cfg->mask;
81 gpio->intmode &= ~cfg->mask;
82 break;
83
84 case MXC_GPIO_INT_RISING: /* MXC_GPIO_INT_LOW */
85 gpio->intpol |= cfg->mask;
86 gpio->dualedge &= ~cfg->mask;
87 gpio->intmode |= cfg->mask;
88 break;
89
90 case MXC_GPIO_INT_BOTH:
91 gpio->dualedge |= cfg->mask;
92 gpio->intmode |= cfg->mask;
93 break;
94
95 default:
96 return E_BAD_PARAM;
97 }
98
99 return E_NO_ERROR;
100 }
101
MXC_GPIO_RevA_EnableInt(mxc_gpio_reva_regs_t * port,uint32_t mask)102 void MXC_GPIO_RevA_EnableInt(mxc_gpio_reva_regs_t *port, uint32_t mask)
103 {
104 port->inten_set = mask;
105 }
106
MXC_GPIO_RevA_DisableInt(mxc_gpio_reva_regs_t * port,uint32_t mask)107 void MXC_GPIO_RevA_DisableInt(mxc_gpio_reva_regs_t *port, uint32_t mask)
108 {
109 port->inten_clr = mask;
110 }
111
MXC_GPIO_RevA_ClearFlags(mxc_gpio_reva_regs_t * port,uint32_t flags)112 void MXC_GPIO_RevA_ClearFlags(mxc_gpio_reva_regs_t *port, uint32_t flags)
113 {
114 port->intfl_clr = flags;
115 }
116
MXC_GPIO_RevA_GetFlags(mxc_gpio_reva_regs_t * port)117 uint32_t MXC_GPIO_RevA_GetFlags(mxc_gpio_reva_regs_t *port)
118 {
119 return port->intfl;
120 }
121
MXC_GPIO_RevA_SetVSSEL(mxc_gpio_reva_regs_t * port,mxc_gpio_vssel_t vssel,uint32_t mask)122 int MXC_GPIO_RevA_SetVSSEL(mxc_gpio_reva_regs_t *port, mxc_gpio_vssel_t vssel, uint32_t mask)
123 {
124 // Configure the vssel
125 switch (vssel) {
126 case MXC_GPIO_VSSEL_VDDIO:
127 port->vssel &= ~mask;
128 break;
129
130 case MXC_GPIO_VSSEL_VDDIOH:
131 port->vssel |= mask;
132 break;
133
134 default:
135 return E_BAD_PARAM;
136 }
137
138 return E_NO_ERROR;
139 }
140
MXC_GPIO_RevA_SetAF(mxc_gpio_reva_regs_t * port,mxc_gpio_func_t func,uint32_t mask)141 int MXC_GPIO_RevA_SetAF(mxc_gpio_reva_regs_t *port, mxc_gpio_func_t func, uint32_t mask)
142 {
143 //This is required for new devices going forward.
144 port->inen |= mask;
145
146 //Switch to I/O mode first
147 port->en0_set = mask;
148
149 switch (func) {
150 case MXC_GPIO_FUNC_IN:
151 port->outen_clr = mask;
152 port->en0_set = mask;
153 port->en1_clr = mask;
154 port->en2_clr = mask;
155 port->en3_clr = mask;
156 break;
157
158 case MXC_GPIO_FUNC_OUT:
159 port->outen_set = mask;
160 port->en0_set = mask;
161 port->en1_clr = mask;
162 port->en2_clr = mask;
163 port->en3_clr = mask;
164 break;
165
166 case MXC_GPIO_FUNC_ALT1:
167 port->en3_clr = mask;
168 port->en2_clr = mask;
169 port->en1_clr = mask;
170 port->en0_clr = mask;
171 break;
172
173 case MXC_GPIO_FUNC_ALT2:
174 port->en3_clr = mask;
175 port->en2_clr = mask;
176 port->en1_set = mask;
177 port->en0_clr = mask;
178 break;
179
180 #if TARGET_NUM != 32650
181 case MXC_GPIO_FUNC_ALT3:
182 port->en3_clr = mask;
183 port->en2_set = mask;
184 port->en1_clr = mask;
185 port->en0_clr = mask;
186 break;
187
188 case MXC_GPIO_FUNC_ALT4:
189 port->en3_clr = mask;
190 port->en2_set = mask;
191 port->en1_set = mask;
192 port->en0_clr = mask;
193 break;
194
195 #if TARGET_NUM == 32662
196 case MXC_GPIO_FUNC_ALT5:
197 port->en3_set = mask;
198 port->en2_clr = mask;
199 port->en1_clr = mask;
200 port->en0_clr = mask;
201 break;
202 #endif
203 #endif
204 default:
205 return E_BAD_PARAM;
206 }
207
208 return E_NO_ERROR;
209 }
210
MXC_GPIO_RevA_SetWakeEn(mxc_gpio_reva_regs_t * port,uint32_t mask)211 void MXC_GPIO_RevA_SetWakeEn(mxc_gpio_reva_regs_t *port, uint32_t mask)
212 {
213 port->wken_set = mask;
214 }
215
MXC_GPIO_RevA_ClearWakeEn(mxc_gpio_reva_regs_t * port,uint32_t mask)216 void MXC_GPIO_RevA_ClearWakeEn(mxc_gpio_reva_regs_t *port, uint32_t mask)
217 {
218 port->wken_clr = mask;
219 }
220
MXC_GPIO_RevA_GetWakeEn(mxc_gpio_reva_regs_t * port)221 uint32_t MXC_GPIO_RevA_GetWakeEn(mxc_gpio_reva_regs_t *port)
222 {
223 return port->wken;
224 }
225
MXC_GPIO_RevA_SetDriveStrength(mxc_gpio_reva_regs_t * port,mxc_gpio_drvstr_t drvstr,uint32_t mask)226 int MXC_GPIO_RevA_SetDriveStrength(mxc_gpio_reva_regs_t *port, mxc_gpio_drvstr_t drvstr,
227 uint32_t mask)
228 {
229 // Configure the drive strength.
230 switch (drvstr) {
231 case MXC_GPIO_DRVSTR_0:
232 port->ds0 &= ~mask;
233 port->ds1 &= ~mask;
234 break;
235
236 case MXC_GPIO_DRVSTR_1:
237 port->ds0 |= mask;
238 port->ds1 &= ~mask;
239 break;
240
241 case MXC_GPIO_DRVSTR_2:
242 port->ds0 &= ~mask;
243 port->ds1 |= mask;
244 break;
245
246 case MXC_GPIO_DRVSTR_3:
247 port->ds0 |= mask;
248 port->ds1 |= mask;
249 break;
250
251 default:
252 // Set default drive strength to type 0.
253 port->ds0 &= ~mask;
254 port->ds1 &= ~mask;
255 }
256
257 return E_NO_ERROR;
258 }
259