Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gpio_common.h « common « efm32 « libopencm3 « include - github.com/thirdpin/libopencm3.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 5099b9978f5a6ba5849c3a91b42da793c541b697 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
/** @addtogroup gpio_defines
 */
/*
 * This file is part of the libopencm3 project.
 *
 * Copyright (C) 2015 Kuldeep Singh Dhaka <kuldeepdhaka9@gmail.com>
 *
 * This library is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library.  If not, see <http://www.gnu.org/licenses/>.
 */

#pragma once

#include <libopencm3/efm32/memorymap.h>
#include <libopencm3/cm3/common.h>

/**@{*/

#define GPIO_P(i)		(GPIO_BASE + (0x24 * (i)))
#define GPIO_PA			GPIO_P(0)
#define GPIO_PB			GPIO_P(1)
#define GPIO_PC			GPIO_P(2)
#define GPIO_PD			GPIO_P(3)
#define GPIO_PE			GPIO_P(4)
#define GPIO_PF			GPIO_P(5)

#define GPIO_P_CTRL(port)	MMIO32((port) + 0x00)
#define GPIO_PA_CTRL		GPIO_P_CTRL(GPIO_PA)
#define GPIO_PB_CTRL		GPIO_P_CTRL(GPIO_PB)
#define GPIO_PC_CTRL		GPIO_P_CTRL(GPIO_PC)
#define GPIO_PD_CTRL		GPIO_P_CTRL(GPIO_PD)
#define GPIO_PE_CTRL		GPIO_P_CTRL(GPIO_PE)
#define GPIO_PF_CTRL		GPIO_P_CTRL(GPIO_PF)

#define GPIO_P_CTRL_DRIVEMODE_SHIFT	(0)
#define GPIO_P_CTRL_DRIVEMODE_MASK	(0x03 << GPIO_P_CTRL_DRIVEMODE_SHIFT)
#define GPIO_P_CTRL_DRIVEMODE(v)	\
	(((v) << GPIO_P_CTRL_DRIVEMODE_SHIFT) & GPIO_P_CTRL_DRIVEMODE_MASK)
#define GPIO_P_CTRL_DRIVEMODE_STANDARD	0
#define GPIO_P_CTRL_DRIVEMODE_LOWEST	1
#define GPIO_P_CTRL_DRIVEMODE_HIGH	2
#define GPIO_P_CTRL_DRIVEMODE_LOW	3

/* NOTE: GPIO_MODE and GPIO_MODE_MASK is generic.
 * it is used with both GPIO_Px_MODEL and GPIO_Px_MODEH */
#define GPIO_P_MODE_MODEx_MASK(x)	(0x0F << (((x) & 0x7) * 4))
/* for mode: use GPIO_MODE_* */
#define GPIO_P_MODE_MODEx(x, mode)	\
	(((mode) << (((x) & 0x7) * 4)) & GPIO_P_MODE_MODEx_MASK(x))

#define GPIO_P_MODEL(port)	MMIO32((port) + 0x04)
#define GPIO_PA_MODEL		GPIO_P_MODEL(GPIO_PA)
#define GPIO_PB_MODEL		GPIO_P_MODEL(GPIO_PB)
#define GPIO_PC_MODEL		GPIO_P_MODEL(GPIO_PC)
#define GPIO_PD_MODEL		GPIO_P_MODEL(GPIO_PD)
#define GPIO_PE_MODEL		GPIO_P_MODEL(GPIO_PE)

#define GPIO_P_MODEL_MODEx_MASK(x)	GPIO_P_MODE_MODEx_MASK(x)
#define GPIO_P_MODEL_MODEx(x, mode)	GPIO_P_MODE_MODEx(x, mode)

#define GPIO_P_MODEL_MODE0_MASK		GPIO_P_MODEL_MODEx_MASK(0)
#define GPIO_P_MODEL_MODE0(mode)	GPIO_P_MODEL_MODEx(0, mode)

#define GPIO_P_MODEL_MODE1_MASK		GPIO_P_MODEL_MODEx_MASK(1)
#define GPIO_P_MODEL_MODE1(mode)	GPIO_P_MODEL_MODEx(1, mode)

#define GPIO_P_MODEL_MODE2_MASK		GPIO_P_MODEL_MODEx_MASK(2)
#define GPIO_P_MODEL_MODE2(mode)	GPIO_P_MODEL_MODEx(2, mode)

#define GPIO_P_MODEL_MODE3_MASK		GPIO_P_MODEL_MODEx_MASK(3)
#define GPIO_P_MODEL_MODE3(mode)	GPIO_P_MODEL_MODEx(3, mode)

#define GPIO_P_MODEL_MODE4_MASK		GPIO_P_MODEL_MODEx_MASK(4)
#define GPIO_P_MODEL_MODE4(mode)	GPIO_P_MODEL_MODEx(4, mode)

#define GPIO_P_MODEL_MODE5_MASK		GPIO_P_MODEL_MODEx_MASK(5)
#define GPIO_P_MODEL_MODE5(mode)	GPIO_P_MODEL_MODEx(5, mode)

#define GPIO_P_MODEL_MODE6_MASK		GPIO_P_MODEL_MODEx_MASK(6)
#define GPIO_P_MODEL_MODE6(mode)	GPIO_P_MODEL_MODEx(6, mode)

#define GPIO_P_MODEL_MODE7_MASK		GPIO_P_MODEL_MODEx_MASK(7)
#define GPIO_P_MODEL_MODE7(mode)	GPIO_P_MODEL_MODEx(7, mode)

#define GPIO_P_MODEH(port)		MMIO32((port) + 0x08)
#define GPIO_PA_MODEH			GPIO_P_MODEH(GPIO_PA)
#define GPIO_PB_MODEH			GPIO_P_MODEH(GPIO_PB)
#define GPIO_PC_MODEH			GPIO_P_MODEH(GPIO_PC)
#define GPIO_PD_MODEH			GPIO_P_MODEH(GPIO_PD)
#define GPIO_PE_MODEH			GPIO_P_MODEH(GPIO_PE)

/* note: (x - 8) is because for MODEH, MODE8 refers to offset 0 */
#define GPIO_P_MODEH_MODEx_MASK(x)	GPIO_P_MODE_MODEx_MASK((x) - 8)
#define GPIO_P_MODEH_MODEx(x, mode)	GPIO_P_MODE_MODEx((x) - 8, mode)

#define GPIO_P_MODEH_MODE8_MASK		GPIO_P_MODEH_MODEx_MASK(8)
#define GPIO_P_MODEH_MODE8(mode)	GPIO_P_MODEH_MODEx(8, mode)

#define GPIO_P_MODEH_MODE9_MASK		GPIO_P_MODEH_MODEx_MASK(9)
#define GPIO_P_MODEH_MODE9(mode)	GPIO_P_MODEH_MODEx(9, mode)

#define GPIO_P_MODEH_MODE10_MASK	GPIO_P_MODEH_MODEx_MASK(10)
#define GPIO_P_MODEH_MODE10(mode)	GPIO_P_MODEH_MODEx(10, mode)

#define GPIO_P_MODEH_MODE11_MASK	GPIO_P_MODEH_MODEx_MASK(11)
#define GPIO_P_MODEH_MODE11(mode)	GPIO_P_MODEH_MODEx(11, mode)

#define GPIO_P_MODEH_MODE12_MASK	GPIO_P_MODEH_MODEx_MASK(12)
#define GPIO_P_MODEH_MODE12(mode)	GPIO_P_MODEH_MODEx(12, mode)

#define GPIO_P_MODEH_MODE13_MASK	GPIO_P_MODEH_MODEx_MASK(13)
#define GPIO_P_MODEH_MODE13(mode)	GPIO_P_MODEH_MODEx(13, mode)

#define GPIO_P_MODEH_MODE14_MASK	GPIO_P_MODEH_MODEx_MASK(14)
#define GPIO_P_MODEH_MODE14(mode)	GPIO_P_MODEH_MODEx(14, mode)

#define GPIO_P_MODEH_MODE15_MASK	GPIO_P_MODEH_MODEx_MASK(15)
#define GPIO_P_MODEH_MODE15(mode)	GPIO_P_MODEH_MODEx(15, mode)

#define GPIO_P_DOUT(port)		MMIO32((port) + 0x0C)
#define GPIO_PA_DOUT			GPIO_P_DOUT(GPIO_PA)
#define GPIO_PB_DOUT			GPIO_P_DOUT(GPIO_PB)
#define GPIO_PC_DOUT			GPIO_P_DOUT(GPIO_PC)
#define GPIO_PD_DOUT			GPIO_P_DOUT(GPIO_PD)
#define GPIO_PE_DOUT			GPIO_P_DOUT(GPIO_PE)

#define GPIO_P_DOUTSET(port)		MMIO32((port) + 0x10)
#define GPIO_PA_DOUTSET			GPIO_P_DOUTSET(GPIO_PA)
#define GPIO_PB_DOUTSET			GPIO_P_DOUTSET(GPIO_PB)
#define GPIO_PC_DOUTSET			GPIO_P_DOUTSET(GPIO_PC)
#define GPIO_PD_DOUTSET			GPIO_P_DOUTSET(GPIO_PD)
#define GPIO_PE_DOUTSET			GPIO_P_DOUTSET(GPIO_PE)

#define GPIO_P_DOUTCLR(port)		MMIO32((port) + 0x14)
#define GPIO_PA_DOUTCLR			GPIO_P_DOUTCLR(GPIO_PA)
#define GPIO_PB_DOUTCLR			GPIO_P_DOUTCLR(GPIO_PB)
#define GPIO_PC_DOUTCLR			GPIO_P_DOUTCLR(GPIO_PC)
#define GPIO_PD_DOUTCLR			GPIO_P_DOUTCLR(GPIO_PD)
#define GPIO_PE_DOUTCLR			GPIO_P_DOUTCLR(GPIO_PE)

#define GPIO_P_DOUTTGL(port)		MMIO32((port) + 0x18)
#define GPIO_PA_DOUTTGL			GPIO_P_DOUTTGL(GPIO_PA)
#define GPIO_PB_DOUTTGL			GPIO_P_DOUTTGL(GPIO_PB)
#define GPIO_PC_DOUTTGL			GPIO_P_DOUTTGL(GPIO_PC)
#define GPIO_PD_DOUTTGL			GPIO_P_DOUTTGL(GPIO_PD)
#define GPIO_PE_DOUTTGL			GPIO_P_DOUTTGL(GPIO_PE)

#define GPIO_P_DIN(port)		MMIO32((port) + 0x1C)
#define GPIO_PA_DIN			GPIO_P_DIN(GPIO_PA)
#define GPIO_PB_DIN			GPIO_P_DIN(GPIO_PB)
#define GPIO_PC_DIN			GPIO_P_DIN(GPIO_PC)
#define GPIO_PD_DIN			GPIO_P_DIN(GPIO_PD)
#define GPIO_PE_DIN			GPIO_P_DIN(GPIO_PE)

#define GPIO_P_PINLOCKN(port)		MMIO32((port) + 0x20)
#define GPIO_PA_PINLOCKN		GPIO_P_PINLOCKN(GPIO_PA)
#define GPIO_PB_PINLOCKN		GPIO_P_PINLOCKN(GPIO_PB)
#define GPIO_PC_PINLOCKN		GPIO_P_PINLOCKN(GPIO_PC)
#define GPIO_PD_PINLOCKN		GPIO_P_PINLOCKN(GPIO_PD)
#define GPIO_PE_PINLOCKN		GPIO_P_PINLOCKN(GPIO_PE)

#define GPIO_EXTIPSELL			MMIO32(GPIO_BASE + 0x100)
#define GPIO_EXTIPSELH			MMIO32(GPIO_BASE + 0x104)
#define GPIO_EXTIRISE			MMIO32(GPIO_BASE + 0x108)
#define GPIO_EXTIFALL			MMIO32(GPIO_BASE + 0x10C)
#define GPIO_IEN			MMIO32(GPIO_BASE + 0x110)
#define GPIO_IF				MMIO32(GPIO_BASE + 0x114)
#define GPIO_IFS			MMIO32(GPIO_BASE + 0x118)
#define GPIO_IFC			MMIO32(GPIO_BASE + 0x11C)
#define GPIO_ROUTE			MMIO32(GPIO_BASE + 0x120)
#define GPIO_INSENSE			MMIO32(GPIO_BASE + 0x124)
#define GPIO_LOCK			MMIO32(GPIO_BASE + 0x128)
#define GPIO_CTRL			MMIO32(GPIO_BASE + 0x12C)
#define GPIO_CMD			MMIO32(GPIO_BASE + 0x130)
#define GPIO_EM4WUEN			MMIO32(GPIO_BASE + 0x134)
#define GPIO_EM4WUPOL			MMIO32(GPIO_BASE + 0x138)
#define GPIO_EM4WUCAUSE			MMIO32(GPIO_BASE + 0x13C)

/* mask is performed so that can be used with L and H */
#define GPIO_EXTIPSEL_MASK(n)		(0x7 << ((n) & 0xF))
#define GPIO_EXTIPSEL_PORTMASK(n, v)	((v) << ((n) & 0xF))
#define GPIO_EXTIPSEL_PORTA		0x0
#define GPIO_EXTIPSEL_PORTB		0x1
#define GPIO_EXTIPSEL_PORTC		0x2
#define GPIO_EXTIPSEL_PORTD		0x3
#define GPIO_EXTIPSEL_PORTE		0x4
#define GPIO_EXTIPSEL_PORTF		0x5

#define GPIO_ROUTE_SWCLKPEN		(1 << 0)
#define GPIO_ROUTE_SWDIOPEN		(1 << 1)
#define GPIO_ROUTE_SWOPEN		(1 << 3)

#define GPIO_ROUTE_SWLOCATION_SHIFT	(8)
#define GPIO_ROUTE_SWLOCATION_MASK	(0x3 << GPIO_ROUTE_SWLOCATION_SHIFT)
#define GPIO_ROUTE_SWLOCATION(v)	\
	(((v) << GPIO_ROUTE_SWLOCATION_SHIFT) & GPIO_ROUTE_SWLOCATION_MASK)

#define GPIO_ROUTE_TCLKPEN		(1 << 12)
#define GPIO_ROUTE_TD0PEN		(1 << 13)
#define GPIO_ROUTE_TD1PEN		(1 << 14)
#define GPIO_ROUTE_TD2PEN		(1 << 15)
#define GPIO_ROUTE_TD3PEN		(1 << 16)

#define GPIO_ROUTE_ETMLOCATION_SHIFT	(24)
#define GPIO_ROUTE_ETMLOCATION_MASK	(0x3 << GPIO_ROUTE_ETMLOCATION_SHIFT)
#define GPIO_ROUTE_ETMLOCATION(v)	\
	(((v) << GPIO_ROUTE_ETMLOCATION_SHIFT) & GPIO_ROUTE_ETMLOCATION_MASK)
#define GPIO_ROUTE_ETMLOCATION_LOCx(x)	GPIO_ROUTE_ETMLOCATION(x)
#define GPIO_ROUTE_ETMLOCATION_LOC0	0
#define GPIO_ROUTE_ETMLOCATION_LOC1	1
#define GPIO_ROUTE_ETMLOCATION_LOC2	2
#define GPIO_ROUTE_ETMLOCATION_LOC3	3

#define GPIO_INSENSE_INT		(1 << 0)
#define GPIO_INSENSE_PRS		(1 << 1)

#define GPIO_LOCK_LOCKKEY_SHIFT		(0)
#define GPIO_LOCK_LOCKKEY_MASK		(0xFFFF << GPIO_LOCK_LOCKKEY_SHIFT)
#define GPIO_LOCK_LOCKKEY_UNLOCKED	(0x0000 << GPIO_LOCK_LOCKKEY_SHIFT)
#define GPIO_LOCK_LOCKKEY_LOCKED	(0x0001 << GPIO_LOCK_LOCKKEY_SHIFT)
#define GPIO_LOCK_LOCKKEY_LOCK		(0x0000 << GPIO_LOCK_LOCKKEY_SHIFT)
#define GPIO_LOCK_LOCKKEY_UNLOCK	(0xA534 << GPIO_LOCK_LOCKKEY_SHIFT)

#define GPIO_CTRL_EM4RET		(1 << 0)

#define GPIO_CMD_EM4WUCLR		(1 << 0)

#define GPIO_EM4WUEN_EM4WUEN_A0		(1 << 0)
#define GPIO_EM4WUEN_EM4WUEN_A6		(1 << 1)
#define GPIO_EM4WUEN_EM4WUEN_C9		(1 << 2)
#define GPIO_EM4WUEN_EM4WUEN_F1		(1 << 3)
#define GPIO_EM4WUEN_EM4WUEN_F2		(1 << 4)
#define GPIO_EM4WUEN_EM4WUEN_E13	(1 << 5)

#define GPIO_EM4WUPOL_EM4WUPOL_A0	(1 << 0)
#define GPIO_EM4WUPOL_EM4WUPOL_A6	(1 << 1)
#define GPIO_EM4WUPOL_EM4WUPOL_C9	(1 << 2)
#define GPIO_EM4WUPOL_EM4WUPOL_F1	(1 << 3)
#define GPIO_EM4WUPOL_EM4WUPOL_F2	(1 << 4)
#define GPIO_EM4WUPOL_EM4WUPOL_E13	(1 << 5)

#define GPIO0				(1 << 0)
#define GPIO1				(1 << 1)
#define GPIO2				(1 << 2)
#define GPIO3				(1 << 3)
#define GPIO4				(1 << 4)
#define GPIO5				(1 << 5)
#define GPIO6				(1 << 6)
#define GPIO7				(1 << 7)
#define GPIO8				(1 << 8)
#define GPIO9				(1 << 9)
#define GPIO10				(1 << 10)
#define GPIO11				(1 << 11)
#define GPIO12				(1 << 12)
#define GPIO13				(1 << 13)
#define GPIO14				(1 << 14)
#define GPIO15				(1 << 15)
#define GPIO_ALL			(0xFFFF)

/* These are the acceptable mode values.
 *   (+ readable counterparts)
 *  do not confuse GPIO_MODE_* for GPIO_P_MODE_MODEx.
 */
enum gpio_mode {
	GPIO_MODE_DISABLE = 0,
	GPIO_MODE_INPUT,
	GPIO_MODE_INPUT_PULL,
	GPIO_MODE_INPUT_PULL_FILTER,
	GPIO_MODE_PUSH_PULL,
	GPIO_MODE_PUSH_PULL_DRIVE,
	GPIO_MODE_WIRED_OR,
	GPIO_MODE_WIRED_OR_PULL_DOWN,
	GPIO_MODE_WIRED_AND,
	GPIO_MODE_WIRED_AND_FILTER,
	GPIO_MODE_WIRED_AND_PULLUP,
	GPIO_MODE_WIRED_AND_PULLUP_FILTER,
	GPIO_MODE_WIRED_AND_DRIVE,
	GPIO_MODE_WIRED_AND_DRIVE_FILTER,
	GPIO_MODE_WIRED_AND_DRIVE_PULLUP,
	GPIO_MODE_WIRED_AND_DRIVE_PULLUP_FILTER
};

/* for readability. */
enum gpio_drive_strength {
	GPIO_STRENGTH_STANDARD = 0,
	GPIO_STRENGTH_LOWEST,
	GPIO_STRENGTH_HIGH,
	GPIO_STRENGTH_LOW
};

/* for readability */
#define GPIOA GPIO_PA
#define GPIOB GPIO_PB
#define GPIOC GPIO_PC
#define GPIOD GPIO_PD
#define GPIOE GPIO_PE
#define GPIOF GPIO_PF

/* --- Function prototypes ------------------------------------------------- */

BEGIN_DECLS

void gpio_enable_lock(void);
void gpio_disable_lock(void);
bool gpio_get_lock_flag(void);

void gpio_set_drive_strength(uint32_t gpio_port,
		enum gpio_drive_strength driver_stength);
void gpio_mode_setup(uint32_t gpio_port, enum gpio_mode mode, uint16_t gpios);

void gpio_set(uint32_t gpio_port, uint16_t gpios);
void gpio_clear(uint32_t gpio_port, uint16_t gpios);
uint16_t gpio_get(uint32_t gpio_port, uint16_t gpios);
void gpio_toggle(uint32_t gpio_port, uint16_t gpios);
uint16_t gpio_port_read(uint32_t gpio_port);
void gpio_port_write(uint32_t gpio_port, uint16_t data);

void gpio_port_config_lock(uint32_t gpio_port, uint16_t gpios);

END_DECLS

/**@}*/