1 /*This file has been prepared for Doxygen automatic documentation generation.*/
\r
2 /*! \file *********************************************************************
\r
4 * \brief GPIO driver for AVR32 UC3.
\r
6 * This file defines a useful set of functions for the GPIO.
\r
8 * - Compiler: IAR EWAVR32 and GNU GCC for AVR32
\r
9 * - Supported devices: All AVR32 devices with a GPIO module can be used.
\r
12 * \author Atmel Corporation: http://www.atmel.com \n
\r
13 * Support and FAQ: http://support.atmel.no/
\r
15 *****************************************************************************/
\r
17 /* Copyright (c) 2007, Atmel Corporation All rights reserved.
\r
19 * Redistribution and use in source and binary forms, with or without
\r
20 * modification, are permitted provided that the following conditions are met:
\r
22 * 1. Redistributions of source code must retain the above copyright notice,
\r
23 * this list of conditions and the following disclaimer.
\r
25 * 2. Redistributions in binary form must reproduce the above copyright notice,
\r
26 * this list of conditions and the following disclaimer in the documentation
\r
27 * and/or other materials provided with the distribution.
\r
29 * 3. The name of ATMEL may not be used to endorse or promote products derived
\r
30 * from this software without specific prior written permission.
\r
32 * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED
\r
33 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
\r
34 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
\r
35 * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
\r
36 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
\r
37 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
\r
38 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
\r
39 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
\r
40 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
\r
41 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\r
48 //! GPIO module instance.
\r
49 #define GPIO AVR32_GPIO
\r
52 int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size)
\r
54 int status = GPIO_SUCCESS;
\r
57 for (i = 0; i < size; i++)
\r
59 status |= gpio_enable_module_pin(gpiomap->pin, gpiomap->function);
\r
67 int gpio_enable_module_pin(unsigned int pin, unsigned int function)
\r
69 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
71 // Enable the correct function.
\r
74 case 0: // A function.
\r
75 gpio_port->pmr0c = 1 << (pin & 0x1F);
\r
76 gpio_port->pmr1c = 1 << (pin & 0x1F);
\r
79 case 1: // B function.
\r
80 gpio_port->pmr0s = 1 << (pin & 0x1F);
\r
81 gpio_port->pmr1c = 1 << (pin & 0x1F);
\r
84 case 2: // C function.
\r
85 gpio_port->pmr0c = 1 << (pin & 0x1F);
\r
86 gpio_port->pmr1s = 1 << (pin & 0x1F);
\r
90 return GPIO_INVALID_ARGUMENT;
\r
93 // Disable GPIO control.
\r
94 gpio_port->gperc = 1 << (pin & 0x1F);
\r
96 return GPIO_SUCCESS;
\r
100 void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size)
\r
104 for (i = 0; i < size; i++)
\r
106 gpio_enable_gpio_pin(gpiomap->pin);
\r
112 void gpio_enable_gpio_pin(unsigned int pin)
\r
114 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
115 gpio_port->oderc = 1 << (pin & 0x1F);
\r
116 gpio_port->gpers = 1 << (pin & 0x1F);
\r
120 void gpio_enable_pin_open_drain(unsigned int pin)
\r
122 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
123 gpio_port->odmers = 1 << (pin & 0x1F);
\r
127 void gpio_disable_pin_open_drain(unsigned int pin)
\r
129 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
130 gpio_port->odmerc = 1 << (pin & 0x1F);
\r
134 void gpio_enable_pin_pull_up(unsigned int pin)
\r
136 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
137 gpio_port->puers = 1 << (pin & 0x1F);
\r
141 void gpio_disable_pin_pull_up(unsigned int pin)
\r
143 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
144 gpio_port->puerc = 1 << (pin & 0x1F);
\r
148 int gpio_get_pin_value(unsigned int pin)
\r
150 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
151 return (gpio_port->pvr >> (pin & 0x1F)) & 1;
\r
155 int gpio_get_gpio_pin_output_value(unsigned int pin)
\r
157 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
158 return (gpio_port->ovr >> (pin & 0x1F)) & 1;
\r
162 void gpio_set_gpio_pin(unsigned int pin)
\r
164 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
166 gpio_port->ovrs = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 1.
\r
167 gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin.
\r
168 gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin.
\r
172 void gpio_clr_gpio_pin(unsigned int pin)
\r
174 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
176 gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 0.
\r
177 gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin.
\r
178 gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin.
\r
182 void gpio_tgl_gpio_pin(unsigned int pin)
\r
184 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
186 gpio_port->ovrt = 1 << (pin & 0x1F); // Toggle the I/O line.
\r
187 gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin.
\r
188 gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin.
\r
192 void gpio_enable_pin_glitch_filter(unsigned int pin)
\r
194 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
195 gpio_port->gfers = 1 << (pin & 0x1F);
\r
199 void gpio_disable_pin_glitch_filter(unsigned int pin)
\r
201 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
202 gpio_port->gferc = 1 << (pin & 0x1F);
\r
206 int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode)
\r
208 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
210 // Enable the glitch filter.
\r
211 gpio_port->gfers = 1 << (pin & 0x1F);
\r
213 // Configure the edge detector.
\r
216 case GPIO_PIN_CHANGE:
\r
217 gpio_port->imr0c = 1 << (pin & 0x1F);
\r
218 gpio_port->imr1c = 1 << (pin & 0x1F);
\r
221 case GPIO_RISING_EDGE:
\r
222 gpio_port->imr0s = 1 << (pin & 0x1F);
\r
223 gpio_port->imr1c = 1 << (pin & 0x1F);
\r
226 case GPIO_FALLING_EDGE:
\r
227 gpio_port->imr0c = 1 << (pin & 0x1F);
\r
228 gpio_port->imr1s = 1 << (pin & 0x1F);
\r
232 return GPIO_INVALID_ARGUMENT;
\r
235 // Enable interrupt.
\r
236 gpio_port->iers = 1 << (pin & 0x1F);
\r
238 return GPIO_SUCCESS;
\r
242 void gpio_disable_pin_interrupt(unsigned int pin)
\r
244 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
245 gpio_port->ierc = 1 << (pin & 0x1F);
\r
249 int gpio_get_pin_interrupt_flag(unsigned int pin)
\r
251 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
252 return (gpio_port->ifr >> (pin & 0x1F)) & 1;
\r
256 void gpio_clear_pin_interrupt_flag(unsigned int pin)
\r
258 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
\r
259 gpio_port->ifrc = 1 << (pin & 0x1F);
\r