]> begriffs open source - freertos/blob - Demo/AVR32_UC3/DRIVERS/GPIO/gpio.c
Removed outdated AVR32 demo.
[freertos] / Demo / AVR32_UC3 / DRIVERS / GPIO / gpio.c
1 /*This file has been prepared for Doxygen automatic documentation generation.*/\r
2 /*! \file *********************************************************************\r
3  *\r
4  * \brief GPIO driver for AVR32 UC3.\r
5  *\r
6  * This file defines a useful set of functions for the GPIO.\r
7  *\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
10  * - AppNote:\r
11  *\r
12  * \author               Atmel Corporation: http://www.atmel.com \n\r
13  *                       Support and FAQ: http://support.atmel.no/\r
14  *\r
15  *****************************************************************************/\r
16 \r
17 /* Copyright (c) 2007, Atmel Corporation All rights reserved.\r
18  *\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
21  *\r
22  * 1. Redistributions of source code must retain the above copyright notice,\r
23  * this list of conditions and the following disclaimer.\r
24  *\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
28  *\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
31  *\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
42  */\r
43 \r
44 \r
45 #include "gpio.h"\r
46 \r
47 \r
48 //! GPIO module instance.\r
49 #define GPIO  AVR32_GPIO\r
50 \r
51 \r
52 int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size)\r
53 {\r
54   int status = GPIO_SUCCESS;\r
55   unsigned int i;\r
56 \r
57   for (i = 0; i < size; i++)\r
58   {\r
59     status |= gpio_enable_module_pin(gpiomap->pin, gpiomap->function);\r
60     gpiomap++;\r
61   }\r
62 \r
63   return status;\r
64 }\r
65 \r
66 \r
67 int gpio_enable_module_pin(unsigned int pin, unsigned int function)\r
68 {\r
69   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
70 \r
71   // Enable the correct function.\r
72   switch (function)\r
73   {\r
74   case 0: // A function.\r
75     gpio_port->pmr0c = 1 << (pin & 0x1F);\r
76     gpio_port->pmr1c = 1 << (pin & 0x1F);\r
77     break;\r
78 \r
79   case 1: // B function.\r
80     gpio_port->pmr0s = 1 << (pin & 0x1F);\r
81     gpio_port->pmr1c = 1 << (pin & 0x1F);\r
82     break;\r
83 \r
84   case 2: // C function.\r
85     gpio_port->pmr0c = 1 << (pin & 0x1F);\r
86     gpio_port->pmr1s = 1 << (pin & 0x1F);\r
87     break;\r
88 \r
89   default:\r
90     return GPIO_INVALID_ARGUMENT;\r
91   }\r
92 \r
93   // Disable GPIO control.\r
94   gpio_port->gperc = 1 << (pin & 0x1F);\r
95 \r
96   return GPIO_SUCCESS;\r
97 }\r
98 \r
99 \r
100 void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size)\r
101 {\r
102   unsigned int i;\r
103 \r
104   for (i = 0; i < size; i++)\r
105   {\r
106     gpio_enable_gpio_pin(gpiomap->pin);\r
107     gpiomap++;\r
108   }\r
109 }\r
110 \r
111 \r
112 void gpio_enable_gpio_pin(unsigned int pin)\r
113 {\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
117 }\r
118 \r
119 \r
120 void gpio_enable_pin_open_drain(unsigned int pin)\r
121 {\r
122   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
123   gpio_port->odmers = 1 << (pin & 0x1F);\r
124 }\r
125 \r
126 \r
127 void gpio_disable_pin_open_drain(unsigned int pin)\r
128 {\r
129   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
130   gpio_port->odmerc = 1 << (pin & 0x1F);\r
131 }\r
132 \r
133 \r
134 void gpio_enable_pin_pull_up(unsigned int pin)\r
135 {\r
136   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
137   gpio_port->puers = 1 << (pin & 0x1F);\r
138 }\r
139 \r
140 \r
141 void gpio_disable_pin_pull_up(unsigned int pin)\r
142 {\r
143   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
144   gpio_port->puerc = 1 << (pin & 0x1F);\r
145 }\r
146 \r
147 \r
148 int gpio_get_pin_value(unsigned int pin)\r
149 {\r
150   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
151   return (gpio_port->pvr >> (pin & 0x1F)) & 1;\r
152 }\r
153 \r
154 \r
155 int gpio_get_gpio_pin_output_value(unsigned int pin)\r
156 {\r
157   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
158   return (gpio_port->ovr >> (pin & 0x1F)) & 1;\r
159 }\r
160 \r
161 \r
162 void gpio_set_gpio_pin(unsigned int pin)\r
163 {\r
164   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
165 \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
169 }\r
170 \r
171 \r
172 void gpio_clr_gpio_pin(unsigned int pin)\r
173 {\r
174   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
175 \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
179 }\r
180 \r
181 \r
182 void gpio_tgl_gpio_pin(unsigned int pin)\r
183 {\r
184   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
185 \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
189 }\r
190 \r
191 \r
192 void gpio_enable_pin_glitch_filter(unsigned int pin)\r
193 {\r
194   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
195   gpio_port->gfers = 1 << (pin & 0x1F);\r
196 }\r
197 \r
198 \r
199 void gpio_disable_pin_glitch_filter(unsigned int pin)\r
200 {\r
201   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
202   gpio_port->gferc = 1 << (pin & 0x1F);\r
203 }\r
204 \r
205 \r
206 int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode)\r
207 {\r
208   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
209 \r
210   // Enable the glitch filter.\r
211   gpio_port->gfers = 1 << (pin & 0x1F);\r
212 \r
213   // Configure the edge detector.\r
214   switch (mode)\r
215   {\r
216   case GPIO_PIN_CHANGE:\r
217     gpio_port->imr0c = 1 << (pin & 0x1F);\r
218     gpio_port->imr1c = 1 << (pin & 0x1F);\r
219     break;\r
220 \r
221   case GPIO_RISING_EDGE:\r
222     gpio_port->imr0s = 1 << (pin & 0x1F);\r
223     gpio_port->imr1c = 1 << (pin & 0x1F);\r
224     break;\r
225 \r
226   case GPIO_FALLING_EDGE:\r
227     gpio_port->imr0c = 1 << (pin & 0x1F);\r
228     gpio_port->imr1s = 1 << (pin & 0x1F);\r
229     break;\r
230 \r
231   default:\r
232     return GPIO_INVALID_ARGUMENT;\r
233   }\r
234 \r
235   // Enable interrupt.\r
236   gpio_port->iers = 1 << (pin & 0x1F);\r
237 \r
238   return GPIO_SUCCESS;\r
239 }\r
240 \r
241 \r
242 void gpio_disable_pin_interrupt(unsigned int pin)\r
243 {\r
244   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
245   gpio_port->ierc = 1 << (pin & 0x1F);\r
246 }\r
247 \r
248 \r
249 int gpio_get_pin_interrupt_flag(unsigned int pin)\r
250 {\r
251   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
252   return (gpio_port->ifr >> (pin & 0x1F)) & 1;\r
253 }\r
254 \r
255 \r
256 void gpio_clear_pin_interrupt_flag(unsigned int pin)\r
257 {\r
258   volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];\r
259   gpio_port->ifrc = 1 << (pin & 0x1F);\r
260 }\r