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 "gpio.h"
26 #include "gpio_revb.h"
27 #include "gpio_common.h"
28
29 /* **** Functions **** */
MXC_GPIO_RevB_Config(const mxc_gpio_cfg_t * cfg,uint8_t psMask)30 int MXC_GPIO_RevB_Config(const mxc_gpio_cfg_t *cfg, uint8_t psMask)
31 {
32 mxc_gpio_regs_t *gpio = cfg->port;
33
34 // Set the GPIO type
35 switch (cfg->func) {
36 case MXC_GPIO_FUNC_IN:
37 gpio->outen_clr = cfg->mask;
38 gpio->en0_set = cfg->mask;
39 gpio->en1_clr = cfg->mask;
40 gpio->en2_clr = cfg->mask;
41 break;
42
43 case MXC_GPIO_FUNC_OUT:
44 gpio->outen_set = cfg->mask;
45 gpio->en0_set = cfg->mask;
46 gpio->en1_clr = cfg->mask;
47 gpio->en2_clr = cfg->mask;
48 break;
49
50 case MXC_GPIO_FUNC_ALT1:
51 gpio->en0_clr = cfg->mask;
52 gpio->en1_clr = cfg->mask;
53 gpio->en2_clr = cfg->mask;
54 break;
55
56 case MXC_GPIO_FUNC_ALT2:
57 gpio->en0_clr = cfg->mask;
58 gpio->en1_set = cfg->mask;
59 gpio->en2_clr = cfg->mask;
60 break;
61
62 case MXC_GPIO_FUNC_ALT3:
63 gpio->en0_set = cfg->mask;
64 gpio->en1_set = cfg->mask;
65 gpio->en2_clr = cfg->mask;
66 break;
67
68 default:
69 return E_BAD_PARAM;
70 }
71
72 // Configure the pad
73 switch (cfg->pad) {
74 case MXC_GPIO_PAD_NONE:
75 gpio->padctrl0 &= ~cfg->mask;
76 gpio->padctrl1 &= ~cfg->mask;
77 if (psMask == MXC_GPIO_PS_PULL_SELECT) {
78 gpio->ps &= ~cfg->mask;
79 }
80 break;
81
82 case MXC_GPIO_PAD_PULL_UP:
83 gpio->padctrl0 |= cfg->mask;
84 gpio->padctrl1 &= ~cfg->mask;
85 if (psMask == MXC_GPIO_PS_PULL_SELECT) {
86 gpio->ps |= cfg->mask;
87 }
88 break;
89
90 case MXC_GPIO_PAD_PULL_DOWN:
91 gpio->padctrl0 &= ~cfg->mask;
92 gpio->padctrl1 |= cfg->mask;
93 if (psMask == MXC_GPIO_PS_PULL_SELECT) {
94 gpio->ps &= ~cfg->mask;
95 }
96 break;
97
98 default:
99 return E_BAD_PARAM;
100 }
101
102 // Configure the vssel
103 MXC_GPIO_SetVSSEL(gpio, cfg->vssel, cfg->mask);
104
105 return E_NO_ERROR;
106 }
107
MXC_GPIO_RevB_InGet(mxc_gpio_regs_t * port,uint32_t mask)108 uint32_t MXC_GPIO_RevB_InGet(mxc_gpio_regs_t *port, uint32_t mask)
109 {
110 return (port->in & mask);
111 }
112
MXC_GPIO_RevB_OutSet(mxc_gpio_regs_t * port,uint32_t mask)113 void MXC_GPIO_RevB_OutSet(mxc_gpio_regs_t *port, uint32_t mask)
114 {
115 port->out_set = mask;
116 }
117
MXC_GPIO_RevB_OutClr(mxc_gpio_regs_t * port,uint32_t mask)118 void MXC_GPIO_RevB_OutClr(mxc_gpio_regs_t *port, uint32_t mask)
119 {
120 port->out_clr = mask;
121 }
122
MXC_GPIO_RevB_OutGet(mxc_gpio_regs_t * port,uint32_t mask)123 uint32_t MXC_GPIO_RevB_OutGet(mxc_gpio_regs_t *port, uint32_t mask)
124 {
125 return (port->out & mask);
126 }
127
MXC_GPIO_RevB_OutPut(mxc_gpio_regs_t * port,uint32_t mask,uint32_t val)128 void MXC_GPIO_RevB_OutPut(mxc_gpio_regs_t *port, uint32_t mask, uint32_t val)
129 {
130 port->out = (port->out & ~mask) | (val & mask);
131 }
132
MXC_GPIO_RevB_OutToggle(mxc_gpio_regs_t * port,uint32_t mask)133 void MXC_GPIO_RevB_OutToggle(mxc_gpio_regs_t *port, uint32_t mask)
134 {
135 port->out ^= mask;
136 }
137
MXC_GPIO_RevB_IntConfig(const mxc_gpio_cfg_t * cfg,mxc_gpio_int_pol_t pol)138 int MXC_GPIO_RevB_IntConfig(const mxc_gpio_cfg_t *cfg, mxc_gpio_int_pol_t pol)
139 {
140 mxc_gpio_regs_t *gpio = cfg->port;
141
142 switch (pol) {
143 case MXC_GPIO_INT_HIGH:
144 gpio->intpol &= ~cfg->mask;
145 gpio->dualedge &= ~cfg->mask;
146 gpio->intmode &= ~cfg->mask;
147 break;
148
149 case MXC_GPIO_INT_FALLING: /* MXC_GPIO_INT_HIGH */
150 gpio->intpol &= ~cfg->mask;
151 gpio->dualedge &= ~cfg->mask;
152 gpio->intmode |= cfg->mask;
153 break;
154
155 case MXC_GPIO_INT_LOW: /* MXC_GPIO_INT_LOW */
156 gpio->intpol |= cfg->mask;
157 gpio->dualedge &= ~cfg->mask;
158 gpio->intmode &= ~cfg->mask;
159 break;
160
161 case MXC_GPIO_INT_RISING: /* MXC_GPIO_INT_LOW */
162 gpio->intpol |= cfg->mask;
163 gpio->dualedge &= ~cfg->mask;
164 gpio->intmode |= cfg->mask;
165 break;
166
167 case MXC_GPIO_INT_BOTH:
168 gpio->dualedge |= cfg->mask;
169 gpio->intmode |= cfg->mask;
170 break;
171
172 default:
173 return E_BAD_PARAM;
174 }
175
176 return E_NO_ERROR;
177 }
178
MXC_GPIO_RevB_EnableInt(mxc_gpio_regs_t * port,uint32_t mask)179 void MXC_GPIO_RevB_EnableInt(mxc_gpio_regs_t *port, uint32_t mask)
180 {
181 port->inten_set = mask;
182 }
183
MXC_GPIO_RevB_DisableInt(mxc_gpio_regs_t * port,uint32_t mask)184 void MXC_GPIO_RevB_DisableInt(mxc_gpio_regs_t *port, uint32_t mask)
185 {
186 port->inten_clr = mask;
187 }
188
MXC_GPIO_RevB_ClearFlags(mxc_gpio_regs_t * port,uint32_t flags)189 void MXC_GPIO_RevB_ClearFlags(mxc_gpio_regs_t *port, uint32_t flags)
190 {
191 port->intfl_clr = flags;
192 }
193
MXC_GPIO_RevB_GetFlags(mxc_gpio_regs_t * port)194 uint32_t MXC_GPIO_RevB_GetFlags(mxc_gpio_regs_t *port)
195 {
196 return port->intfl;
197 }
198
MXC_GPIO_RevB_SetVSSEL(mxc_gpio_regs_t * port,mxc_gpio_vssel_t vssel,uint32_t mask)199 int MXC_GPIO_RevB_SetVSSEL(mxc_gpio_regs_t *port, mxc_gpio_vssel_t vssel, uint32_t mask)
200 {
201 // Configure the vssel
202 switch (vssel) {
203 case MXC_GPIO_VSSEL_VDDIO:
204 port->vssel &= ~mask;
205 break;
206
207 case MXC_GPIO_VSSEL_VDDIOH:
208 port->vssel |= mask;
209 break;
210
211 default:
212 return E_BAD_PARAM;
213 }
214
215 return E_NO_ERROR;
216 }
217