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
|
/*
* File : board_gpio.h
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2008 - 2016, RT-Thread Development Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Change Logs:
* Date Author Notes
* 2015-11-19 Urey the first version
*/
#ifndef _BOARD_GPIO_H_
#define _BOARD_GPIO_H_
#include <stdint.h>
#define GPIO_PA(n) (0*32 + n)
#define GPIO_PB(n) (1*32 + n)
#define GPIO_PC(n) (2*32 + n)
#define GPIO_PD(n) (3*32 + n)
#define GPIO_PE(n) (4*32 + n)
#define GPIO_PF(n) (5*32 + n)
#define GPIO_PG(n) (6*32 + n)
#define GPIO_PIN(n) (0x01 << n)
/*************************************************************************
* GPIO (General-Purpose I/O Ports)
*************************************************************************/
#define GPIO_PORT_OFF 0x100
#define GPIO_SHADOW_OFF 0x700
#define PXPIN 0x00 /* PIN Level Register */
#define PXINT 0x10 /* Port Interrupt Register */
#define PXINTS 0x14 /* Port Interrupt Set Register */
#define PXINTC 0x18 /* Port Interrupt Clear Register */
#define PXMSK 0x20 /* Port Interrupt Mask Reg */
#define PXMSKS 0x24 /* Port Interrupt Mask Set Reg */
#define PXMSKC 0x28 /* Port Interrupt Mask Clear Reg */
#define PXPAT1 0x30 /* Port Pattern 1 Set Reg. */
#define PXPAT1S 0x34 /* Port Pattern 1 Set Reg. */
#define PXPAT1C 0x38 /* Port Pattern 1 Clear Reg. */
#define PXPAT0 0x40 /* Port Pattern 0 Register */
#define PXPAT0S 0x44 /* Port Pattern 0 Set Register */
#define PXPAT0C 0x48 /* Port Pattern 0 Clear Register */
#define PXFLG 0x50 /* Port Flag Register */
#define PXFLGC 0x58 /* Port Flag clear Register */
#define PXOENS 0x64 /* Port Output Disable Set Register */
#define PXOENC 0x68 /* Port Output Disable Clear Register */
#define PXPEN 0x70 /* Port Pull Disable Register */
#define PXPENS 0x74 /* Port Pull Disable Set Register */
#define PXPENC 0x78 /* Port Pull Disable Clear Register */
#define PXDSS 0x84 /* Port Drive Strength set Register */
#define PXDSC 0x88 /* Port Drive Strength clear Register */
#define PZGID2LD 0xF0 /* GPIOZ Group ID to load */
#define GPIO_PXPIN(n) (GPIO_BASE + (PXPIN + (n) * GPIO_PORT_OFF)) /* PIN Level Register */
#define GPIO_PXINT(n) (GPIO_BASE + (PXINT + (n) * GPIO_PORT_OFF)) /* Port Interrupt Register */
#define GPIO_PXINTS(n) (GPIO_BASE + (PXINTS + (n) * GPIO_PORT_OFF)) /* Port Interrupt Set Register */
#define GPIO_PXINTC(n) (GPIO_BASE + (PXINTC + (n) * GPIO_PORT_OFF)) /* Port Interrupt Clear Register */
#define GPIO_PXMSK(n) (GPIO_BASE + (PXMSK + (n) * GPIO_PORT_OFF)) /* Port Interrupt Mask Register */
#define GPIO_PXMSKS(n) (GPIO_BASE + (PXMSKS + (n) * GPIO_PORT_OFF)) /* Port Interrupt Mask Set Reg */
#define GPIO_PXMSKC(n) (GPIO_BASE + (PXMSKC + (n) * GPIO_PORT_OFF)) /* Port Interrupt Mask Clear Reg */
#define GPIO_PXPAT1(n) (GPIO_BASE + (PXPAT1 + (n) * GPIO_PORT_OFF)) /* Port Pattern 1 Register */
#define GPIO_PXPAT1S(n) (GPIO_BASE + (PXPAT1S + (n) * GPIO_PORT_OFF)) /* Port Pattern 1 Set Reg. */
#define GPIO_PXPAT1C(n) (GPIO_BASE + (PXPAT1C + (n) * GPIO_PORT_OFF)) /* Port Pattern 1 Clear Reg. */
#define GPIO_PXPAT0(n) (GPIO_BASE + (PXPAT0 + (n) * GPIO_PORT_OFF)) /* Port Pattern 0 Register */
#define GPIO_PXPAT0S(n) (GPIO_BASE + (PXPAT0S + (n) * GPIO_PORT_OFF)) /* Port Pattern 0 Set Register */
#define GPIO_PXPAT0C(n) (GPIO_BASE + (PXPAT0C + (n) * GPIO_PORT_OFF)) /* Port Pattern 0 Clear Register */
#define GPIO_PXFLG(n) (GPIO_BASE + (PXFLG + (n) * GPIO_PORT_OFF)) /* Port Flag Register */
#define GPIO_PXFLGC(n) (GPIO_BASE + (PXFLGC + (n) * GPIO_PORT_OFF)) /* Port Flag clear Register */
#define GPIO_PXOENS(n) (GPIO_BASE + (PXOENS + (n) * GPIO_PORT_OFF)) /* Port Output Disable Set Register */
#define GPIO_PXOENC(n) (GPIO_BASE + (PXOENC + (n) * GPIO_PORT_OFF)) /* Port Output Disable Clear Register */
#define GPIO_PXPEN(n) (GPIO_BASE + (PXPEN + (n) * GPIO_PORT_OFF)) /* Port Pull Disable Register */
#define GPIO_PXPENS(n) (GPIO_BASE + (PXPENS + (n) * GPIO_PORT_OFF)) /* Port Pull Disable Set Register */
#define GPIO_PXPENC(n) (GPIO_BASE + (PXPENC + (n) * GPIO_PORT_OFF)) /* Port Pull Disable Clear Register */
#define GPIO_PXDSS(n) (GPIO_BASE + (PXDSS + (n) * GPIO_PORT_OFF)) /* Port Drive Strength set Register */
#define GPIO_PXDSC(n) (GPIO_BASE + (PXDSC + (n) * GPIO_PORT_OFF)) /* Port Drive Strength clear Register */
#define GPIO_PZGID2LD(n) (GPIO_BASE + (PZGID2LD + (n) * GPIO_PORT_OFF)) /* GPIOZ Group ID to load */
struct jzgpio_state {
uint32_t pxint;
uint32_t pxmsk;
uint32_t pxpat1;
uint32_t pxpat0;
uint32_t pxpen;
uint32_t pxignore;
};
enum gpio_function
{
GPIO_FUNC_0 = 0x00, //0000, GPIO as function 0 / device 0
GPIO_FUNC_1 = 0x01, //0001, GPIO as function 1 / device 1
GPIO_FUNC_2 = 0x02, //0010, GPIO as function 2 / device 2
GPIO_FUNC_3 = 0x03, //0011, GPIO as function 3 / device 3
GPIO_OUTPUT0 = 0x04, //0100, GPIO output low level
GPIO_OUTPUT1 = 0x05, //0101, GPIO output high level
GPIO_INPUT = 0x06, //0110, GPIO as input
GPIO_INT_LO = 0x08, //1000, Low Level trigger interrupt
GPIO_INT_HI = 0x09, //1001, High Level trigger interrupt
GPIO_INT_FE = 0x0a, //1010, Fall Edge trigger interrupt
GPIO_INT_RE = 0x0b, //1011, Rise Edge trigger interrupt
GPIO_INPUT_PULL = 0x16, //0001 0110, GPIO as input and enable pull
};
enum gpio_irq_type
{
IRQ_TYPE_NONE = 0x00000000,
IRQ_TYPE_EDGE_RISING = 0x00000001,
IRQ_TYPE_EDGE_FALLING = 0x00000002,
IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING),
IRQ_TYPE_LEVEL_HIGH = 0x00000004,
IRQ_TYPE_LEVEL_LOW = 0x00000008,
IRQ_TYPE_LEVEL_MASK = (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH),
IRQ_TYPE_SENSE_MASK = 0x0000000f,
IRQ_TYPE_DEFAULT = IRQ_TYPE_SENSE_MASK,
IRQ_TYPE_PROBE = 0x00000010,
IRQ_LEVEL = (1 << 8),
};
enum gpio_port {
GPIO_PORT_A = 0,
GPIO_PORT_B,
GPIO_PORT_C,
GPIO_PORT_D,
/* this must be last */
GPIO_NR_PORTS,
};
#define IS_GPIO_ALL_PORT(PORT) ( (PORT) < GPIO_NR_PORTS )
enum gpio_pin {
GPIO_Pin_0 = ((uint32_t)0x00000001), /* Pin 0 selected */
GPIO_Pin_1 = ((uint32_t)0x00000002), /* Pin 1 selected */
GPIO_Pin_2 = ((uint32_t)0x00000004), /* Pin 2 selected */
GPIO_Pin_3 = ((uint32_t)0x00000008), /* Pin 3 selected */
GPIO_Pin_4 = ((uint32_t)0x00000010), /* Pin 4 selected */
GPIO_Pin_5 = ((uint32_t)0x00000020), /* Pin 5 selected */
GPIO_Pin_6 = ((uint32_t)0x00000040), /* Pin 6 selected */
GPIO_Pin_7 = ((uint32_t)0x00000080), /* Pin 7 selected */
GPIO_Pin_8 = ((uint32_t)0x00000100), /* Pin 8 selected */
GPIO_Pin_9 = ((uint32_t)0x00000200), /* Pin 9 selected */
GPIO_Pin_10 = ((uint32_t)0x00000400), /* Pin 10 selected */
GPIO_Pin_11 = ((uint32_t)0x00000800), /* Pin 11 selected */
GPIO_Pin_12 = ((uint32_t)0x00001000), /* Pin 12 selected */
GPIO_Pin_13 = ((uint32_t)0x00002000), /* Pin 13 selected */
GPIO_Pin_14 = ((uint32_t)0x00004000), /* Pin 14 selected */
GPIO_Pin_15 = ((uint32_t)0x00008000), /* Pin 15 selected */
GPIO_Pin_16 = ((uint32_t)0x00010000), /* Pin 16 selected */
GPIO_Pin_17 = ((uint32_t)0x00020000), /* Pin 17 selected */
GPIO_Pin_18 = ((uint32_t)0x00040000), /* Pin 18 selected */
GPIO_Pin_19 = ((uint32_t)0x00080000), /* Pin 19 selected */
GPIO_Pin_20 = ((uint32_t)0x00100000), /* Pin 20 selected */
GPIO_Pin_21 = ((uint32_t)0x00200000), /* Pin 21 selected */
GPIO_Pin_22 = ((uint32_t)0x00400000), /* Pin 22 selected */
GPIO_Pin_23 = ((uint32_t)0x00800000), /* Pin 23 selected */
GPIO_Pin_24 = ((uint32_t)0x01000000), /* Pin 24 selected */
GPIO_Pin_25 = ((uint32_t)0x02000000), /* Pin 25 selected */
GPIO_Pin_26 = ((uint32_t)0x04000000), /* Pin 26 selected */
GPIO_Pin_27 = ((uint32_t)0x08000000), /* Pin 27 selected */
GPIO_Pin_28 = ((uint32_t)0x10000000), /* Pin 28 selected */
GPIO_Pin_29 = ((uint32_t)0x20000000), /* Pin 29 selected */
GPIO_Pin_30 = ((uint32_t)0x40000000), /* Pin 30 selected */
GPIO_Pin_31 = ((uint32_t)0x80000000), /* Pin 31 selected */
GPIO_Pin_All = ((uint32_t)0xFFFFFFFF), /* All pins selected */
};
struct jz_gpio_irq_def
{
void *irq_arg[32];
void (*irq_cb[32]) (void *param);
};
void gpio_set_func (enum gpio_port port, uint32_t pins, enum gpio_function func);
void gpio_set_value (enum gpio_port port, enum gpio_pin pin,int value);
int gpio_get_value (enum gpio_port port, enum gpio_pin pin);
int gpio_get_flag (enum gpio_port port, enum gpio_pin pin);
void gpio_clear_flag (enum gpio_port port, enum gpio_pin pin);
void gpio_direction_input (enum gpio_port port, enum gpio_pin pin);
void gpio_direction_output (enum gpio_port port, enum gpio_pin pin,int value);
void gpio_enable_pull (enum gpio_port port, enum gpio_pin pin);
void gpio_disable_pull (enum gpio_port port, enum gpio_pin pin);
void gpio_as_irq_high_level (enum gpio_port port, enum gpio_pin pin);
void gpio_as_irq_rise_edge (enum gpio_port port, enum gpio_pin pin);
void gpio_as_irq_fall_edge (enum gpio_port port, enum gpio_pin pin);
void gpio_ack_irq (enum gpio_port port, enum gpio_pin pin);
void gpio_set_irq_callback(enum gpio_port port, enum gpio_pin pin, void (*irq_cb)(void *),void *irq_arg);
#endif /* _BOARD_GPIO_H_ */
|