gpio.c

Go to the documentation of this file.
00001 /* This source file is part of the ATMEL AT32UC3A-SoftwareFramework-1.1.1 Release */
00002 
00003 /*This file has been prepared for Doxygen automatic documentation generation.*/
00019 /* Copyright (c) 2007, Atmel Corporation All rights reserved.
00020  *
00021  * Redistribution and use in source and binary forms, with or without
00022  * modification, are permitted provided that the following conditions are met:
00023  *
00024  * 1. Redistributions of source code must retain the above copyright notice,
00025  * this list of conditions and the following disclaimer.
00026  *
00027  * 2. Redistributions in binary form must reproduce the above copyright notice,
00028  * this list of conditions and the following disclaimer in the documentation
00029  * and/or other materials provided with the distribution.
00030  *
00031  * 3. The name of ATMEL may not be used to endorse or promote products derived
00032  * from this software without specific prior written permission.
00033  *
00034  * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED
00035  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00036  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
00037  * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
00038  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00039  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00040  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00041  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00042  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
00043  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00044  */
00045 
00046 
00047 #include "gpio.h"
00048 
00049 
00051 #define GPIO  AVR32_GPIO
00052 
00053 
00054 int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size)
00055 {
00056   int status = GPIO_SUCCESS;
00057   unsigned int i;
00058 
00059   for (i = 0; i < size; i++)
00060   {
00061     status |= gpio_enable_module_pin(gpiomap->pin, gpiomap->function);
00062     gpiomap++;
00063   }
00064 
00065   return status;
00066 }
00067 
00068 
00069 int gpio_enable_module_pin(unsigned int pin, unsigned int function)
00070 {
00071   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00072 
00073   // Enable the correct function.
00074   switch (function)
00075   {
00076   case 0: // A function.
00077     gpio_port->pmr0c = 1 << (pin & 0x1F);
00078     gpio_port->pmr1c = 1 << (pin & 0x1F);
00079     break;
00080 
00081   case 1: // B function.
00082     gpio_port->pmr0s = 1 << (pin & 0x1F);
00083     gpio_port->pmr1c = 1 << (pin & 0x1F);
00084     break;
00085 
00086   case 2: // C function.
00087     gpio_port->pmr0c = 1 << (pin & 0x1F);
00088     gpio_port->pmr1s = 1 << (pin & 0x1F);
00089     break;
00090 
00091   default:
00092     return GPIO_INVALID_ARGUMENT;
00093   }
00094 
00095   // Disable GPIO control.
00096   gpio_port->gperc = 1 << (pin & 0x1F);
00097 
00098   return GPIO_SUCCESS;
00099 }
00100 
00101 
00102 void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size)
00103 {
00104   unsigned int i;
00105 
00106   for (i = 0; i < size; i++)
00107   {
00108     gpio_enable_gpio_pin(gpiomap->pin);
00109     gpiomap++;
00110   }
00111 }
00112 
00113 
00114 void gpio_enable_gpio_pin(unsigned int pin)
00115 {
00116   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00117   gpio_port->oderc = 1 << (pin & 0x1F);
00118   gpio_port->gpers = 1 << (pin & 0x1F);
00119 }
00120 
00121 
00122 void gpio_enable_pin_open_drain(unsigned int pin)
00123 {
00124   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00125   gpio_port->odmers = 1 << (pin & 0x1F);
00126 }
00127 
00128 
00129 void gpio_disable_pin_open_drain(unsigned int pin)
00130 {
00131   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00132   gpio_port->odmerc = 1 << (pin & 0x1F);
00133 }
00134 
00135 
00136 void gpio_enable_pin_pull_up(unsigned int pin)
00137 {
00138   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00139   gpio_port->puers = 1 << (pin & 0x1F);
00140 }
00141 
00142 
00143 void gpio_disable_pin_pull_up(unsigned int pin)
00144 {
00145   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00146   gpio_port->puerc = 1 << (pin & 0x1F);
00147 }
00148 
00149 
00150 int gpio_get_pin_value(unsigned int pin)
00151 {
00152   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00153   return (gpio_port->pvr >> (pin & 0x1F)) & 1;
00154 }
00155 
00156 
00157 int gpio_get_gpio_pin_output_value(unsigned int pin)
00158 {
00159   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00160   return (gpio_port->ovr >> (pin & 0x1F)) & 1;
00161 }
00162 
00163 
00164 void gpio_set_gpio_pin(unsigned int pin)
00165 {
00166   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00167 
00168   gpio_port->ovrs  = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 1.
00169   gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin.
00170   gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin.
00171 }
00172 
00173 
00174 void gpio_clr_gpio_pin(unsigned int pin)
00175 {
00176   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00177 
00178   gpio_port->ovrc  = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 0.
00179   gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin.
00180   gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin.
00181 }
00182 
00183 
00184 void gpio_tgl_gpio_pin(unsigned int pin)
00185 {
00186   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00187 
00188   gpio_port->ovrt  = 1 << (pin & 0x1F); // Toggle the I/O line.
00189   gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin.
00190   gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin.
00191 }
00192 
00193 
00194 void gpio_enable_pin_glitch_filter(unsigned int pin)
00195 {
00196   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00197   gpio_port->gfers = 1 << (pin & 0x1F);
00198 }
00199 
00200 
00201 void gpio_disable_pin_glitch_filter(unsigned int pin)
00202 {
00203   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00204   gpio_port->gferc = 1 << (pin & 0x1F);
00205 }
00206 
00207 
00208 int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode)
00209 {
00210   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00211 
00212   // Enable the glitch filter.
00213   gpio_port->gfers = 1 << (pin & 0x1F);
00214 
00215   // Configure the edge detector.
00216   switch (mode)
00217   {
00218   case GPIO_PIN_CHANGE:
00219     gpio_port->imr0c = 1 << (pin & 0x1F);
00220     gpio_port->imr1c = 1 << (pin & 0x1F);
00221     break;
00222 
00223   case GPIO_RISING_EDGE:
00224     gpio_port->imr0s = 1 << (pin & 0x1F);
00225     gpio_port->imr1c = 1 << (pin & 0x1F);
00226     break;
00227 
00228   case GPIO_FALLING_EDGE:
00229     gpio_port->imr0c = 1 << (pin & 0x1F);
00230     gpio_port->imr1s = 1 << (pin & 0x1F);
00231     break;
00232 
00233   default:
00234     return GPIO_INVALID_ARGUMENT;
00235   }
00236 
00237   // Enable interrupt.
00238   gpio_port->iers = 1 << (pin & 0x1F);
00239 
00240   return GPIO_SUCCESS;
00241 }
00242 
00243 
00244 void gpio_disable_pin_interrupt(unsigned int pin)
00245 {
00246   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00247   gpio_port->ierc = 1 << (pin & 0x1F);
00248 }
00249 
00250 
00251 int gpio_get_pin_interrupt_flag(unsigned int pin)
00252 {
00253   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00254   return (gpio_port->ifr >> (pin & 0x1F)) & 1;
00255 }
00256 
00257 
00258 void gpio_clear_pin_interrupt_flag(unsigned int pin)
00259 {
00260   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00261   gpio_port->ifrc = 1 << (pin & 0x1F);
00262 }

Generated on Wed May 7 14:40:10 2008 for AVR32114 Using the AVR32 LCD Controller by  doxygen 1.5.3-20071008