Initial commit, code based on LPC1224 support and LPC812-MAX CMSIS-DAP interface...
[lpc11u3x] / 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 #ifndef DRIVERS_GPIO_H
22 #define DRIVERS_GPIO_H
25 #include <stdint.h>
26 #include "core/pio.h"
29 /***************************************************************************** */
30 /*   Public access to GPIO setup   */
33 enum gpio_interrupt_senses {
34         EDGES_BOTH = 0,
35         EDGE_FALLING,
36         EDGE_RISING,
37         LEVEL_HIGH,
38         LEVEL_LOW,
39 };
41 /* GPIO Interrupts */
42 /* Add a callback on a GPIO interrupt.
43  * This call will configure the GPIO (call to config_pio()), set it as input and
44  * activate the interrupt on the given 'sense' event. use the gpio_interrupt_senses
45  * enum for 'sense' values.
46  * The callback will receive the pin number as argument (but not the port number).
47  * Note :
48  *   The interrupt hanlers are not efficient if the pin is not a low numbered one (require
49  *   32 shifts + test for pin number 31).
50  *   Use them if you place the signals generating interrupts on low numbered pins.
51  *   When possible, get in touch with the people doing the electronic design, or change
52  *   the handlers in drivers/gpio.c
53  */
54 int set_gpio_callback(void (*callback) (uint32_t), uint8_t irq, const struct pio* gpio, uint8_t sense);
55 void remove_gpio_callback(uint8_t irq);
59 /* GPIO Activation */
60 void gpio_on(void);
61 void gpio_off(void);
63 #define gpio_dir_in(gpio) \
64 { \
65         struct lpc_gpio* gpio_port = LPC_GPIO_REGS(gpio.port); \
66         gpio_port->data_dir &= ~(1 << gpio.pin);\
67 }
69 #define gpio_dir_out(gpio) \
70 { \
71         struct lpc_gpio* gpio_port = LPC_GPIO_REGS(gpio.port); \
72         gpio_port->data_dir |= (1 << gpio.pin);\
73 }
76 #define gpio_set(gpio) \
77 { \
78         struct lpc_gpio* gpio_port = LPC_GPIO_REGS(gpio.port); \
79         gpio_port->set = (1 << gpio.pin);\
80 }
82 #define gpio_clear(gpio) \
83 { \
84         struct lpc_gpio* gpio_port = LPC_GPIO_REGS(gpio.port); \
85         gpio_port->clear = (1 << gpio.pin);\
86 }
89 /* GPIO Configuration
90  * This function calls the config_pio() function for the gpio with the given
91  * mode, configures the direction of the pin and sets the initial state.
92  * Use GPIO_DIR_IN or GPIO_DIR_OUT for the direction "dir", and 0 or 1 for the initial
93  * value "ini_val".
94  */
95 void config_gpio(const struct pio* gpio, uint32_t mode, uint8_t dir, uint8_t ini_val);
98 #endif /* DRIVERS_GPIO_H */