libopencm3
A free/libre/open-source firmware library for various ARM Cortex-M3 microcontrollers.
gpio_common.h
Go to the documentation of this file.
1/** @addtogroup gpio_defines
2 */
3/*
4 * This file is part of the libopencm3 project.
5 *
6 * Copyright (C) 2015 Kuldeep Singh Dhaka <kuldeepdhaka9@gmail.com>
7 *
8 * This library is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU Lesser General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this library. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#pragma once
23
26
27/**@{*/
28
29#define GPIO_P(i) (GPIO_BASE + (0x24 * (i)))
30#define GPIO_PA GPIO_P(0)
31#define GPIO_PB GPIO_P(1)
32#define GPIO_PC GPIO_P(2)
33#define GPIO_PD GPIO_P(3)
34#define GPIO_PE GPIO_P(4)
35#define GPIO_PF GPIO_P(5)
36
37#define GPIO_P_CTRL(port) MMIO32((port) + 0x00)
38#define GPIO_PA_CTRL GPIO_P_CTRL(GPIO_PA)
39#define GPIO_PB_CTRL GPIO_P_CTRL(GPIO_PB)
40#define GPIO_PC_CTRL GPIO_P_CTRL(GPIO_PC)
41#define GPIO_PD_CTRL GPIO_P_CTRL(GPIO_PD)
42#define GPIO_PE_CTRL GPIO_P_CTRL(GPIO_PE)
43#define GPIO_PF_CTRL GPIO_P_CTRL(GPIO_PF)
44
45#define GPIO_P_CTRL_DRIVEMODE_SHIFT (0)
46#define GPIO_P_CTRL_DRIVEMODE_MASK (0x03 << GPIO_P_CTRL_DRIVEMODE_SHIFT)
47#define GPIO_P_CTRL_DRIVEMODE(v) \
48 (((v) << GPIO_P_CTRL_DRIVEMODE_SHIFT) & GPIO_P_CTRL_DRIVEMODE_MASK)
49#define GPIO_P_CTRL_DRIVEMODE_STANDARD 0
50#define GPIO_P_CTRL_DRIVEMODE_LOWEST 1
51#define GPIO_P_CTRL_DRIVEMODE_HIGH 2
52#define GPIO_P_CTRL_DRIVEMODE_LOW 3
53
54/* NOTE: GPIO_MODE and GPIO_MODE_MASK is generic.
55 * it is used with both GPIO_Px_MODEL and GPIO_Px_MODEH */
56#define GPIO_P_MODE_MODEx_MASK(x) (0x0F << (((x) & 0x7) * 4))
57/* for mode: use GPIO_MODE_* */
58#define GPIO_P_MODE_MODEx(x, mode) \
59 (((mode) << (((x) & 0x7) * 4)) & GPIO_P_MODE_MODEx_MASK(x))
60
61#define GPIO_P_MODEL(port) MMIO32((port) + 0x04)
62#define GPIO_PA_MODEL GPIO_P_MODEL(GPIO_PA)
63#define GPIO_PB_MODEL GPIO_P_MODEL(GPIO_PB)
64#define GPIO_PC_MODEL GPIO_P_MODEL(GPIO_PC)
65#define GPIO_PD_MODEL GPIO_P_MODEL(GPIO_PD)
66#define GPIO_PE_MODEL GPIO_P_MODEL(GPIO_PE)
67
68#define GPIO_P_MODEL_MODEx_MASK(x) GPIO_P_MODE_MODEx_MASK(x)
69#define GPIO_P_MODEL_MODEx(x, mode) GPIO_P_MODE_MODEx(x, mode)
70
71#define GPIO_P_MODEL_MODE0_MASK GPIO_P_MODEL_MODEx_MASK(0)
72#define GPIO_P_MODEL_MODE0(mode) GPIO_P_MODEL_MODEx(0, mode)
73
74#define GPIO_P_MODEL_MODE1_MASK GPIO_P_MODEL_MODEx_MASK(1)
75#define GPIO_P_MODEL_MODE1(mode) GPIO_P_MODEL_MODEx(1, mode)
76
77#define GPIO_P_MODEL_MODE2_MASK GPIO_P_MODEL_MODEx_MASK(2)
78#define GPIO_P_MODEL_MODE2(mode) GPIO_P_MODEL_MODEx(2, mode)
79
80#define GPIO_P_MODEL_MODE3_MASK GPIO_P_MODEL_MODEx_MASK(3)
81#define GPIO_P_MODEL_MODE3(mode) GPIO_P_MODEL_MODEx(3, mode)
82
83#define GPIO_P_MODEL_MODE4_MASK GPIO_P_MODEL_MODEx_MASK(4)
84#define GPIO_P_MODEL_MODE4(mode) GPIO_P_MODEL_MODEx(4, mode)
85
86#define GPIO_P_MODEL_MODE5_MASK GPIO_P_MODEL_MODEx_MASK(5)
87#define GPIO_P_MODEL_MODE5(mode) GPIO_P_MODEL_MODEx(5, mode)
88
89#define GPIO_P_MODEL_MODE6_MASK GPIO_P_MODEL_MODEx_MASK(6)
90#define GPIO_P_MODEL_MODE6(mode) GPIO_P_MODEL_MODEx(6, mode)
91
92#define GPIO_P_MODEL_MODE7_MASK GPIO_P_MODEL_MODEx_MASK(7)
93#define GPIO_P_MODEL_MODE7(mode) GPIO_P_MODEL_MODEx(7, mode)
94
95#define GPIO_P_MODEH(port) MMIO32((port) + 0x08)
96#define GPIO_PA_MODEH GPIO_P_MODEH(GPIO_PA)
97#define GPIO_PB_MODEH GPIO_P_MODEH(GPIO_PB)
98#define GPIO_PC_MODEH GPIO_P_MODEH(GPIO_PC)
99#define GPIO_PD_MODEH GPIO_P_MODEH(GPIO_PD)
100#define GPIO_PE_MODEH GPIO_P_MODEH(GPIO_PE)
101
102/* note: (x - 8) is because for MODEH, MODE8 refers to offset 0 */
103#define GPIO_P_MODEH_MODEx_MASK(x) GPIO_P_MODE_MODEx_MASK((x) - 8)
104#define GPIO_P_MODEH_MODEx(x, mode) GPIO_P_MODE_MODEx((x) - 8, mode)
105
106#define GPIO_P_MODEH_MODE8_MASK GPIO_P_MODEH_MODEx_MASK(8)
107#define GPIO_P_MODEH_MODE8(mode) GPIO_P_MODEH_MODEx(8, mode)
108
109#define GPIO_P_MODEH_MODE9_MASK GPIO_P_MODEH_MODEx_MASK(9)
110#define GPIO_P_MODEH_MODE9(mode) GPIO_P_MODEH_MODEx(9, mode)
111
112#define GPIO_P_MODEH_MODE10_MASK GPIO_P_MODEH_MODEx_MASK(10)
113#define GPIO_P_MODEH_MODE10(mode) GPIO_P_MODEH_MODEx(10, mode)
114
115#define GPIO_P_MODEH_MODE11_MASK GPIO_P_MODEH_MODEx_MASK(11)
116#define GPIO_P_MODEH_MODE11(mode) GPIO_P_MODEH_MODEx(11, mode)
117
118#define GPIO_P_MODEH_MODE12_MASK GPIO_P_MODEH_MODEx_MASK(12)
119#define GPIO_P_MODEH_MODE12(mode) GPIO_P_MODEH_MODEx(12, mode)
120
121#define GPIO_P_MODEH_MODE13_MASK GPIO_P_MODEH_MODEx_MASK(13)
122#define GPIO_P_MODEH_MODE13(mode) GPIO_P_MODEH_MODEx(13, mode)
123
124#define GPIO_P_MODEH_MODE14_MASK GPIO_P_MODEH_MODEx_MASK(14)
125#define GPIO_P_MODEH_MODE14(mode) GPIO_P_MODEH_MODEx(14, mode)
126
127#define GPIO_P_MODEH_MODE15_MASK GPIO_P_MODEH_MODEx_MASK(15)
128#define GPIO_P_MODEH_MODE15(mode) GPIO_P_MODEH_MODEx(15, mode)
129
130#define GPIO_P_DOUT(port) MMIO32((port) + 0x0C)
131#define GPIO_PA_DOUT GPIO_P_DOUT(GPIO_PA)
132#define GPIO_PB_DOUT GPIO_P_DOUT(GPIO_PB)
133#define GPIO_PC_DOUT GPIO_P_DOUT(GPIO_PC)
134#define GPIO_PD_DOUT GPIO_P_DOUT(GPIO_PD)
135#define GPIO_PE_DOUT GPIO_P_DOUT(GPIO_PE)
136
137#define GPIO_P_DOUTSET(port) MMIO32((port) + 0x10)
138#define GPIO_PA_DOUTSET GPIO_P_DOUTSET(GPIO_PA)
139#define GPIO_PB_DOUTSET GPIO_P_DOUTSET(GPIO_PB)
140#define GPIO_PC_DOUTSET GPIO_P_DOUTSET(GPIO_PC)
141#define GPIO_PD_DOUTSET GPIO_P_DOUTSET(GPIO_PD)
142#define GPIO_PE_DOUTSET GPIO_P_DOUTSET(GPIO_PE)
143
144#define GPIO_P_DOUTCLR(port) MMIO32((port) + 0x14)
145#define GPIO_PA_DOUTCLR GPIO_P_DOUTCLR(GPIO_PA)
146#define GPIO_PB_DOUTCLR GPIO_P_DOUTCLR(GPIO_PB)
147#define GPIO_PC_DOUTCLR GPIO_P_DOUTCLR(GPIO_PC)
148#define GPIO_PD_DOUTCLR GPIO_P_DOUTCLR(GPIO_PD)
149#define GPIO_PE_DOUTCLR GPIO_P_DOUTCLR(GPIO_PE)
150
151#define GPIO_P_DOUTTGL(port) MMIO32((port) + 0x18)
152#define GPIO_PA_DOUTTGL GPIO_P_DOUTTGL(GPIO_PA)
153#define GPIO_PB_DOUTTGL GPIO_P_DOUTTGL(GPIO_PB)
154#define GPIO_PC_DOUTTGL GPIO_P_DOUTTGL(GPIO_PC)
155#define GPIO_PD_DOUTTGL GPIO_P_DOUTTGL(GPIO_PD)
156#define GPIO_PE_DOUTTGL GPIO_P_DOUTTGL(GPIO_PE)
157
158#define GPIO_P_DIN(port) MMIO32((port) + 0x1C)
159#define GPIO_PA_DIN GPIO_P_DIN(GPIO_PA)
160#define GPIO_PB_DIN GPIO_P_DIN(GPIO_PB)
161#define GPIO_PC_DIN GPIO_P_DIN(GPIO_PC)
162#define GPIO_PD_DIN GPIO_P_DIN(GPIO_PD)
163#define GPIO_PE_DIN GPIO_P_DIN(GPIO_PE)
164
165#define GPIO_P_PINLOCKN(port) MMIO32((port) + 0x20)
166#define GPIO_PA_PINLOCKN GPIO_P_PINLOCKN(GPIO_PA)
167#define GPIO_PB_PINLOCKN GPIO_P_PINLOCKN(GPIO_PB)
168#define GPIO_PC_PINLOCKN GPIO_P_PINLOCKN(GPIO_PC)
169#define GPIO_PD_PINLOCKN GPIO_P_PINLOCKN(GPIO_PD)
170#define GPIO_PE_PINLOCKN GPIO_P_PINLOCKN(GPIO_PE)
171
172#define GPIO_EXTIPSELL MMIO32(GPIO_BASE + 0x100)
173#define GPIO_EXTIPSELH MMIO32(GPIO_BASE + 0x104)
174#define GPIO_EXTIRISE MMIO32(GPIO_BASE + 0x108)
175#define GPIO_EXTIFALL MMIO32(GPIO_BASE + 0x10C)
176#define GPIO_IEN MMIO32(GPIO_BASE + 0x110)
177#define GPIO_IF MMIO32(GPIO_BASE + 0x114)
178#define GPIO_IFS MMIO32(GPIO_BASE + 0x118)
179#define GPIO_IFC MMIO32(GPIO_BASE + 0x11C)
180#define GPIO_ROUTE MMIO32(GPIO_BASE + 0x120)
181#define GPIO_INSENSE MMIO32(GPIO_BASE + 0x124)
182#define GPIO_LOCK MMIO32(GPIO_BASE + 0x128)
183#define GPIO_CTRL MMIO32(GPIO_BASE + 0x12C)
184#define GPIO_CMD MMIO32(GPIO_BASE + 0x130)
185#define GPIO_EM4WUEN MMIO32(GPIO_BASE + 0x134)
186#define GPIO_EM4WUPOL MMIO32(GPIO_BASE + 0x138)
187#define GPIO_EM4WUCAUSE MMIO32(GPIO_BASE + 0x13C)
188
189/* mask is performed so that can be used with L and H */
190#define GPIO_EXTIPSEL_MASK(n) (0x7 << ((n) & 0xF))
191#define GPIO_EXTIPSEL_PORTMASK(n, v) ((v) << ((n) & 0xF))
192#define GPIO_EXTIPSEL_PORTA 0x0
193#define GPIO_EXTIPSEL_PORTB 0x1
194#define GPIO_EXTIPSEL_PORTC 0x2
195#define GPIO_EXTIPSEL_PORTD 0x3
196#define GPIO_EXTIPSEL_PORTE 0x4
197#define GPIO_EXTIPSEL_PORTF 0x5
198
199#define GPIO_ROUTE_SWCLKPEN (1 << 0)
200#define GPIO_ROUTE_SWDIOPEN (1 << 1)
201#define GPIO_ROUTE_SWOPEN (1 << 3)
202
203#define GPIO_ROUTE_SWLOCATION_SHIFT (8)
204#define GPIO_ROUTE_SWLOCATION_MASK (0x3 << GPIO_ROUTE_SWLOCATION_SHIFT)
205#define GPIO_ROUTE_SWLOCATION(v) \
206 (((v) << GPIO_ROUTE_SWLOCATION_SHIFT) & GPIO_ROUTE_SWLOCATION_MASK)
207
208#define GPIO_ROUTE_TCLKPEN (1 << 12)
209#define GPIO_ROUTE_TD0PEN (1 << 13)
210#define GPIO_ROUTE_TD1PEN (1 << 14)
211#define GPIO_ROUTE_TD2PEN (1 << 15)
212#define GPIO_ROUTE_TD3PEN (1 << 16)
213
214#define GPIO_ROUTE_ETMLOCATION_SHIFT (24)
215#define GPIO_ROUTE_ETMLOCATION_MASK (0x3 << GPIO_ROUTE_ETMLOCATION_SHIFT)
216#define GPIO_ROUTE_ETMLOCATION(v) \
217 (((v) << GPIO_ROUTE_ETMLOCATION_SHIFT) & GPIO_ROUTE_ETMLOCATION_MASK)
218#define GPIO_ROUTE_ETMLOCATION_LOCx(x) GPIO_ROUTE_ETMLOCATION(x)
219#define GPIO_ROUTE_ETMLOCATION_LOC0 0
220#define GPIO_ROUTE_ETMLOCATION_LOC1 1
221#define GPIO_ROUTE_ETMLOCATION_LOC2 2
222#define GPIO_ROUTE_ETMLOCATION_LOC3 3
223
224#define GPIO_INSENSE_INT (1 << 0)
225#define GPIO_INSENSE_PRS (1 << 1)
226
227#define GPIO_LOCK_LOCKKEY_SHIFT (0)
228#define GPIO_LOCK_LOCKKEY_MASK (0xFFFF << GPIO_LOCK_LOCKKEY_SHIFT)
229#define GPIO_LOCK_LOCKKEY_UNLOCKED (0x0000 << GPIO_LOCK_LOCKKEY_SHIFT)
230#define GPIO_LOCK_LOCKKEY_LOCKED (0x0001 << GPIO_LOCK_LOCKKEY_SHIFT)
231#define GPIO_LOCK_LOCKKEY_LOCK (0x0000 << GPIO_LOCK_LOCKKEY_SHIFT)
232#define GPIO_LOCK_LOCKKEY_UNLOCK (0xA534 << GPIO_LOCK_LOCKKEY_SHIFT)
233
234#define GPIO_CTRL_EM4RET (1 << 0)
235
236#define GPIO_CMD_EM4WUCLR (1 << 0)
237
238#define GPIO_EM4WUEN_EM4WUEN_A0 (1 << 0)
239#define GPIO_EM4WUEN_EM4WUEN_A6 (1 << 1)
240#define GPIO_EM4WUEN_EM4WUEN_C9 (1 << 2)
241#define GPIO_EM4WUEN_EM4WUEN_F1 (1 << 3)
242#define GPIO_EM4WUEN_EM4WUEN_F2 (1 << 4)
243#define GPIO_EM4WUEN_EM4WUEN_E13 (1 << 5)
244
245#define GPIO_EM4WUPOL_EM4WUPOL_A0 (1 << 0)
246#define GPIO_EM4WUPOL_EM4WUPOL_A6 (1 << 1)
247#define GPIO_EM4WUPOL_EM4WUPOL_C9 (1 << 2)
248#define GPIO_EM4WUPOL_EM4WUPOL_F1 (1 << 3)
249#define GPIO_EM4WUPOL_EM4WUPOL_F2 (1 << 4)
250#define GPIO_EM4WUPOL_EM4WUPOL_E13 (1 << 5)
251
252#define GPIO0 (1 << 0)
253#define GPIO1 (1 << 1)
254#define GPIO2 (1 << 2)
255#define GPIO3 (1 << 3)
256#define GPIO4 (1 << 4)
257#define GPIO5 (1 << 5)
258#define GPIO6 (1 << 6)
259#define GPIO7 (1 << 7)
260#define GPIO8 (1 << 8)
261#define GPIO9 (1 << 9)
262#define GPIO10 (1 << 10)
263#define GPIO11 (1 << 11)
264#define GPIO12 (1 << 12)
265#define GPIO13 (1 << 13)
266#define GPIO14 (1 << 14)
267#define GPIO15 (1 << 15)
268#define GPIO_ALL (0xFFFF)
269
270/* These are the acceptable mode values.
271 * (+ readable counterparts)
272 * do not confuse GPIO_MODE_* for GPIO_P_MODE_MODEx.
273 */
292
293/* for readability. */
300
301/* for readability */
302#define GPIOA GPIO_PA
303#define GPIOB GPIO_PB
304#define GPIOC GPIO_PC
305#define GPIOD GPIO_PD
306#define GPIOE GPIO_PE
307#define GPIOF GPIO_PF
308
309/* --- Function prototypes ------------------------------------------------- */
310
312
313void gpio_enable_lock(void);
314void gpio_disable_lock(void);
315bool gpio_get_lock_flag(void);
316
317void gpio_set_drive_strength(uint32_t gpio_port,
318 enum gpio_drive_strength driver_stength);
319void gpio_mode_setup(uint32_t gpio_port, enum gpio_mode mode, uint16_t gpios);
320
321void gpio_set(uint32_t gpio_port, uint16_t gpios);
322void gpio_clear(uint32_t gpio_port, uint16_t gpios);
323uint16_t gpio_get(uint32_t gpio_port, uint16_t gpios);
324void gpio_toggle(uint32_t gpio_port, uint16_t gpios);
325uint16_t gpio_port_read(uint32_t gpio_port);
326void gpio_port_write(uint32_t gpio_port, uint16_t data);
327
328void gpio_port_config_lock(uint32_t gpio_port, uint16_t gpios);
329
331
332/**@}*/
#define END_DECLS
Definition: common.h:34
#define BEGIN_DECLS
Definition: common.h:33
Dispatcher for the base address definitions, depending on the particular Gecko family.
gpio_drive_strength
Definition: gpio_common.h:294
void gpio_port_write(uint32_t gpio_port, uint16_t data)
Set port (all) output value's.
Definition: gpio_common.c:161
gpio_mode
Definition: gpio_common.h:274
void gpio_enable_lock(void)
Enable GPIO registers lock.
Definition: gpio_common.c:32
bool gpio_get_lock_flag(void)
Get GPIO register lock flag.
Definition: gpio_common.c:54
void gpio_clear(uint32_t gpio_port, uint16_t gpios)
Set port pins output value (Atomic)
Definition: gpio_common.c:118
void gpio_disable_lock(void)
Disable GPIO registers lock.
Definition: gpio_common.c:42
void gpio_mode_setup(uint32_t gpio_port, enum gpio_mode mode, uint16_t gpios)
Set port pins mode.
Definition: gpio_common.c:78
void gpio_set_drive_strength(uint32_t gpio_port, enum gpio_drive_strength driver_stength)
Set port pins drive strength.
Definition: gpio_common.c:65
void gpio_toggle(uint32_t gpio_port, uint16_t gpios)
Toggle port pins output value (Atomic)
Definition: gpio_common.c:141
uint16_t gpio_port_read(uint32_t gpio_port)
Get port (all) input value's.
Definition: gpio_common.c:151
void gpio_set(uint32_t gpio_port, uint16_t gpios)
Set port pins output value (Atomic)
Definition: gpio_common.c:107
void gpio_port_config_lock(uint32_t gpio_port, uint16_t gpios)
Lock the Configuration of a Group of Pins.
Definition: gpio_common.c:177
uint16_t gpio_get(uint32_t gpio_port, uint16_t gpios)
Get port pins input value.
Definition: gpio_common.c:130
@ GPIO_STRENGTH_HIGH
Definition: gpio_common.h:297
@ GPIO_STRENGTH_LOWEST
Definition: gpio_common.h:296
@ GPIO_STRENGTH_LOW
Definition: gpio_common.h:298
@ GPIO_STRENGTH_STANDARD
Definition: gpio_common.h:295
@ GPIO_MODE_WIRED_AND_DRIVE_PULLUP
Definition: gpio_common.h:289
@ GPIO_MODE_WIRED_OR_PULL_DOWN
Definition: gpio_common.h:282
@ GPIO_MODE_PUSH_PULL
Definition: gpio_common.h:279
@ GPIO_MODE_INPUT
Definition: gpio_common.h:276
@ GPIO_MODE_WIRED_AND_PULLUP
Definition: gpio_common.h:285
@ GPIO_MODE_INPUT_PULL
Definition: gpio_common.h:277
@ GPIO_MODE_PUSH_PULL_DRIVE
Definition: gpio_common.h:280
@ GPIO_MODE_WIRED_AND_DRIVE_PULLUP_FILTER
Definition: gpio_common.h:290
@ GPIO_MODE_WIRED_AND_DRIVE_FILTER
Definition: gpio_common.h:288
@ GPIO_MODE_WIRED_OR
Definition: gpio_common.h:281
@ GPIO_MODE_WIRED_AND_DRIVE
Definition: gpio_common.h:287
@ GPIO_MODE_INPUT_PULL_FILTER
Definition: gpio_common.h:278
@ GPIO_MODE_DISABLE
Definition: gpio_common.h:275
@ GPIO_MODE_WIRED_AND_PULLUP_FILTER
Definition: gpio_common.h:286
@ GPIO_MODE_WIRED_AND_FILTER
Definition: gpio_common.h:284
@ GPIO_MODE_WIRED_AND
Definition: gpio_common.h:283