Use available info from register rather than shift and mask in gpio_read()
[lpc82x] / include / drivers / gpio.h
1 /****************************************************************************
2  *  drivers/gpio.h
3  *
4  * Copyright 2012 Nathael Pajani <nathael.pajani@ed3l.fr>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  *************************************************************************** */
21 /***************************************************************************** */
22 /*                GPIOs and GPIO Interrupts                                    */
23 /***************************************************************************** */
25 /* Driver for GPIO configuration and access (including GPIO interrupts) on the LPC82x.
26  * Refer to LPC82x documentation (UM10800.pdf) for more information.
27  */
29 #ifndef DRIVERS_GPIO_H
30 #define DRIVERS_GPIO_H
33 #include "lib/stdint.h"
34 #include "core/lpc_regs.h"
35 #include "core/pio.h"
38 /***************************************************************************** */
39 /*                     General Purpose Input/Output                            */
40 /***************************************************************************** */
41 /* General Purpose Input/Output (GPIO) */
42 struct lpc_gpio
43 {
44         volatile uint8_t  bval[32];   /* 0x0000 - 0x001C : Pin value of each pin on a byte for quick access */
45         uint32_t reserved_0[1016];
46         volatile uint32_t wval[32];   /* 0x1000 - 0x1074 : Pin value of each pin on a 32bits word for quick access */
47         uint32_t reserved_1[992];
48         volatile uint32_t data_dir;   /* 0x2000 : Data direction Register (R/W) */
49         uint32_t reserved_2[31];
50         volatile uint32_t mask;       /* 0x2080 : Pin mask, affects data, out, set, clear and invert */
51         uint32_t reserved_3[31];
52         volatile uint32_t val;        /* 0x2100 : Port data Register (R/W) */
53         uint32_t reserved_4[31];
54         volatile uint32_t mval;       /* 0x2180 : Port masked data Register (R/W) */
55         uint32_t reserved_5[31];
56         volatile uint32_t set;        /* 0x2200 : Port output set Register (-/W) */
57         uint32_t reserved_6[31];
58         volatile uint32_t clear;      /* 0x2280 : Port output clear Register (-/W) */
59         uint32_t reserved_7[31];
60         volatile uint32_t toggle;     /* 0x2300 : Port output invert Register (-/W) */
61         uint32_t reserved_8[31];
62         volatile uint32_t dir_set;    /* 0x2380 : Port direction set (set as output) Register (-/W) */
63         uint32_t reserved_9[31];
64         volatile uint32_t dir_clear;  /* 0x2400 : Port direction clear (set as input) Register (-/W) */
65         uint32_t reserved_10[31];
66         volatile uint32_t dir_toggle; /* 0x2480 : Port direction toggle Register (-/W) */
67 };
68 #define LPC_GPIO_0      ((struct lpc_gpio *) LPC_GPIO_BASE)
69 #define LPC_GPIO_REGS(x)  ((struct lpc_gpio *) (LPC_GPIO_BASE))
72 /***************************************************************************** */
73 /*   Public access to GPIO setup   */
75 enum gpio_ports {
76         GPIO_PORT0 = 0,
77         GPIO_PORT1,
78         GPIO_PORT2,
79 };
81 #define GPIO_DIR_IN 0
82 #define GPIO_DIR_OUT 1
84 enum gpio_interrupt_senses {
85         EDGES_BOTH = 0,
86         EDGE_FALLING,
87         EDGE_RISING,
88         LEVEL_HIGH,
89         LEVEL_LOW,
90 };
94 /* GPIO Activation */
95 void gpio_on(void);
97 void gpio_off(void);
99 #define gpio_dir_in(gpio) \
100 { \
101         struct lpc_gpio* gpio_port = LPC_GPIO_REGS(0); \
102         gpio_port->dir_clear = (1 << gpio.pin);\
105 #define gpio_dir_out(gpio) \
106 { \
107         struct lpc_gpio* gpio_port = LPC_GPIO_REGS(0); \
108         gpio_port->dir_set = (1 << gpio.pin);\
112 #define gpio_set(gpio) \
113 { \
114         struct lpc_gpio* gpio_port = LPC_GPIO_REGS(0); \
115         gpio_port->set = (1 << gpio.pin);\
118 #define gpio_clear(gpio) \
119 { \
120         struct lpc_gpio* gpio_port = LPC_GPIO_REGS(0); \
121         gpio_port->clear = (1 << gpio.pin);\
124 #define gpio_toggle(gpio) \
125 { \
126         struct lpc_gpio* gpio_port = LPC_GPIO_REGS(0); \
127         gpio_port->toggle = (1 << gpio.pin);\
130 static inline uint32_t gpio_read(const struct pio gpio)
132     struct lpc_gpio* gpio_port = LPC_GPIO_REGS(0);
133     return (gpio_port->bval[gpio.pin]);
137 /* GPIO Configuration
138  * This function calls the config_pio() function for the gpio with the given
139  * mode, configures the direction of the pin and sets the initial state.
140  * Use GPIO_DIR_IN or GPIO_DIR_OUT for the direction "dir", and 0 or 1 for the initial
141  * value "ini_val".
142  */
143 void config_gpio(const struct pio* gpio, uint32_t mode, uint8_t dir, uint8_t ini_val);
147 /* GPIO Interrupts */
148 /* Add a callback on a GPIO interrupt.
149  * This call will configure the GPIO (call to config_pio()), set it as input and
150  * activate the interrupt on the given 'sense' event. use the gpio_interrupt_senses
151  * enum for 'sense' values.
152  * The callback will receive the irq number as argument.
153  * Returns the interrupt number if OK, or a negative value in case of error.
154  */
155 int set_gpio_callback(void (*callback) (uint32_t), const struct pio* gpio, uint8_t sense);
157 void remove_gpio_callback(unsigned int irq);
162 /***************************************************************************** */
163 /*                    Pin interrupts and patern interrupts                     */
164 /***************************************************************************** */
165 /* Pin and pattern interrupts */
166 struct lpc_pin_int
168         volatile uint32_t mode;  /* 0x000 : Pin interrupt mode (R/W) */
169         volatile uint32_t lvl_rising_enable; /* 0x004 : Pin interrupt level or rising edge int enable (R/W) */
170         volatile uint32_t lvl_rising_set_en; /* 0x008 : Pin interrupt level or rising edge int set (-/W) */
171         volatile uint32_t lvl_rising_clr_en; /* 0x00C : Pin interrupt level or rising edge int clear (-/W) */
172         volatile uint32_t lvl_falling_enable; /* 0x010 : Pin interrupt active level or falling edge int enable (R/W) */
173         volatile uint32_t lvl_falling_set_en; /* 0x014 : Pin interrupt active level or falling edge int set (-/W) */
174         volatile uint32_t lvl_falling_clr_en; /* 0x018 : Pin interrupt active level or falling edge int clear (-/W) */
175         volatile uint32_t rising;  /* 0x01C : Pin interrupt rising edge register (R/W) */
176         volatile uint32_t falling; /* 0x020 : Pin interrupt falling edge register (R/W) */
177         volatile uint32_t status;  /* 0x024 : Pin interrupt status register (R/W) */
178         volatile uint32_t pmatch_ctrl;  /* 0x028 : Pattern match interrupt control (R/W) */
179         volatile uint32_t pmatch_bitslice_src;   /* 0x02C : Pattern match interrupt bit-slice source (R/W) */
180         volatile uint32_t pmatch_bitslice_config;  /* 0x030 : Pattern match interrupt bit-slice configuration (R/W) */
181 };
182 #define LPC_GPIO_INTERRUPTS ((struct lpc_pin_int *) LPC_GPIO_INTR_BASE)
188 #endif /* DRIVERS_GPIO_H */