00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #include "gpio.h"
00049
00051 #define GPIO AVR32_GPIO
00052
00053
00056
00057
00058
00059 int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size)
00060 {
00061 int status = GPIO_SUCCESS;
00062 unsigned int i;
00063
00064 for (i = 0; i < size; i++)
00065 {
00066 status |= gpio_enable_module_pin(gpiomap->pin, gpiomap->function);
00067 gpiomap++;
00068 }
00069
00070 return status;
00071 }
00072
00073
00074 int gpio_enable_module_pin(unsigned int pin, unsigned int function)
00075 {
00076 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00077
00078
00079 switch (function)
00080 {
00081 case 0:
00082 gpio_port->pmr0c = 1 << (pin & 0x1F);
00083 gpio_port->pmr1c = 1 << (pin & 0x1F);
00084 #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED)
00085 gpio_port->pmr2c = 1 << (pin & 0x1F);
00086 #endif
00087 break;
00088
00089 case 1:
00090 gpio_port->pmr0s = 1 << (pin & 0x1F);
00091 gpio_port->pmr1c = 1 << (pin & 0x1F);
00092 #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED)
00093 gpio_port->pmr2c = 1 << (pin & 0x1F);
00094 #endif
00095 break;
00096
00097 case 2:
00098 gpio_port->pmr0c = 1 << (pin & 0x1F);
00099 gpio_port->pmr1s = 1 << (pin & 0x1F);
00100 #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED)
00101 gpio_port->pmr2c = 1 << (pin & 0x1F);
00102 #endif
00103 break;
00104
00105 case 3:
00106 gpio_port->pmr0s = 1 << (pin & 0x1F);
00107 gpio_port->pmr1s = 1 << (pin & 0x1F);
00108 #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED)
00109 gpio_port->pmr2c = 1 << (pin & 0x1F);
00110 #endif
00111 break;
00112
00113 #if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED)
00114 case 4:
00115 gpio_port->pmr0c = 1 << (pin & 0x1F);
00116 gpio_port->pmr1c = 1 << (pin & 0x1F);
00117 gpio_port->pmr2s = 1 << (pin & 0x1F);
00118 break;
00119
00120 case 5:
00121 gpio_port->pmr0s = 1 << (pin & 0x1F);
00122 gpio_port->pmr1c = 1 << (pin & 0x1F);
00123 gpio_port->pmr2s = 1 << (pin & 0x1F);
00124 break;
00125
00126 case 6:
00127 gpio_port->pmr0c = 1 << (pin & 0x1F);
00128 gpio_port->pmr1s = 1 << (pin & 0x1F);
00129 gpio_port->pmr2s = 1 << (pin & 0x1F);
00130 break;
00131
00132 case 7:
00133 gpio_port->pmr0s = 1 << (pin & 0x1F);
00134 gpio_port->pmr1s = 1 << (pin & 0x1F);
00135 gpio_port->pmr2s = 1 << (pin & 0x1F);
00136 break;
00137 #endif
00138
00139 default:
00140 return GPIO_INVALID_ARGUMENT;
00141 }
00142
00143
00144 gpio_port->gperc = 1 << (pin & 0x1F);
00145
00146 return GPIO_SUCCESS;
00147 }
00148
00149
00150 void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size)
00151 {
00152 unsigned int i;
00153
00154 for (i = 0; i < size; i++)
00155 {
00156 gpio_enable_gpio_pin(gpiomap->pin);
00157 gpiomap++;
00158 }
00159 }
00160
00161
00162 void gpio_enable_gpio_pin(unsigned int pin)
00163 {
00164 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00165 gpio_port->oderc = 1 << (pin & 0x1F);
00166 gpio_port->gpers = 1 << (pin & 0x1F);
00167 }
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 #if 0
00178
00179
00180 void gpio_enable_pin_open_drain(unsigned int pin)
00181 {
00182 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00183 gpio_port->odmers = 1 << (pin & 0x1F);
00184 }
00185
00186
00187 void gpio_disable_pin_open_drain(unsigned int pin)
00188 {
00189 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00190 gpio_port->odmerc = 1 << (pin & 0x1F);
00191 }
00192
00193
00194 #endif
00195
00196
00197 void gpio_enable_pin_pull_up(unsigned int pin)
00198 {
00199 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00200 gpio_port->puers = 1 << (pin & 0x1F);
00201 #if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED)
00202 gpio_port->pderc = 1 << (pin & 0x1F);
00203 #endif
00204 }
00205
00206
00207 void gpio_disable_pin_pull_up(unsigned int pin)
00208 {
00209 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00210 gpio_port->puerc = 1 << (pin & 0x1F);
00211 }
00212
00213 #if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED)
00214
00215
00220 void gpio_enable_pin_pull_down(unsigned int pin)
00221 {
00222 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00223 gpio_port->puerc = 1 << (pin & 0x1F);
00224 gpio_port->pders = 1 << (pin & 0x1F);
00225 }
00226
00231 void gpio_disable_pin_pull_down(unsigned int pin)
00232 {
00233 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00234 gpio_port->pderc = 1 << (pin & 0x1F);
00235 }
00236
00241 void gpio_enable_pin_buskeeper(unsigned int pin)
00242 {
00243 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00244 gpio_port->puers = 1 << (pin & 0x1F);
00245 gpio_port->pders = 1 << (pin & 0x1F);
00246 }
00247
00252 void gpio_disable_pin_buskeeper(unsigned int pin)
00253 {
00254 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00255 gpio_port->puerc = 1 << (pin & 0x1F);
00256 gpio_port->pderc = 1 << (pin & 0x1F);
00257 }
00258
00259 #endif
00260
00261 int gpio_get_pin_value(unsigned int pin)
00262 {
00263 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00264 return (gpio_port->pvr >> (pin & 0x1F)) & 1;
00265 }
00266
00267
00268 int gpio_get_gpio_pin_output_value(unsigned int pin)
00269 {
00270 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00271 return (gpio_port->ovr >> (pin & 0x1F)) & 1;
00272 }
00273
00274
00275 int gpio_get_gpio_open_drain_pin_output_value(unsigned int pin)
00276 {
00277 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00278 return ((gpio_port->oder >> (pin & 0x1F)) & 1) ^ 1;
00279 }
00280
00281
00282 void gpio_set_gpio_pin(unsigned int pin)
00283 {
00284 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00285
00286 gpio_port->ovrs = 1 << (pin & 0x1F);
00287 gpio_port->oders = 1 << (pin & 0x1F);
00288 gpio_port->gpers = 1 << (pin & 0x1F);
00289 }
00290
00291
00292 void gpio_clr_gpio_pin(unsigned int pin)
00293 {
00294 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00295
00296 gpio_port->ovrc = 1 << (pin & 0x1F);
00297 gpio_port->oders = 1 << (pin & 0x1F);
00298 gpio_port->gpers = 1 << (pin & 0x1F);
00299 }
00300
00301
00302 void gpio_tgl_gpio_pin(unsigned int pin)
00303 {
00304 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00305
00306 gpio_port->ovrt = 1 << (pin & 0x1F);
00307 gpio_port->oders = 1 << (pin & 0x1F);
00308 gpio_port->gpers = 1 << (pin & 0x1F);
00309 }
00310
00311
00312 void gpio_set_gpio_open_drain_pin(unsigned int pin)
00313 {
00314 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00315
00316 gpio_port->oderc = 1 << (pin & 0x1F);
00317 gpio_port->gpers = 1 << (pin & 0x1F);
00318 }
00319
00320
00321 void gpio_clr_gpio_open_drain_pin(unsigned int pin)
00322 {
00323 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00324
00325 gpio_port->ovrc = 1 << (pin & 0x1F);
00326 gpio_port->oders = 1 << (pin & 0x1F);
00327 gpio_port->gpers = 1 << (pin & 0x1F);
00328 }
00329
00330
00331 void gpio_tgl_gpio_open_drain_pin(unsigned int pin)
00332 {
00333 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00334
00335 gpio_port->ovrc = 1 << (pin & 0x1F);
00336 gpio_port->odert = 1 << (pin & 0x1F);
00337 gpio_port->gpers = 1 << (pin & 0x1F);
00338 }
00339
00340
00341 void gpio_enable_pin_glitch_filter(unsigned int pin)
00342 {
00343 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00344 gpio_port->gfers = 1 << (pin & 0x1F);
00345 }
00346
00347
00348 void gpio_disable_pin_glitch_filter(unsigned int pin)
00349 {
00350 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00351 gpio_port->gferc = 1 << (pin & 0x1F);
00352 }
00353
00362 static int gpio_configure_edge_detector(unsigned int pin, unsigned int mode)
00363 {
00364 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00365
00366
00367 switch (mode)
00368 {
00369 case GPIO_PIN_CHANGE:
00370 gpio_port->imr0c = 1 << (pin & 0x1F);
00371 gpio_port->imr1c = 1 << (pin & 0x1F);
00372 break;
00373
00374 case GPIO_RISING_EDGE:
00375 gpio_port->imr0s = 1 << (pin & 0x1F);
00376 gpio_port->imr1c = 1 << (pin & 0x1F);
00377 break;
00378
00379 case GPIO_FALLING_EDGE:
00380 gpio_port->imr0c = 1 << (pin & 0x1F);
00381 gpio_port->imr1s = 1 << (pin & 0x1F);
00382 break;
00383
00384 default:
00385 return GPIO_INVALID_ARGUMENT;
00386 }
00387
00388 return GPIO_SUCCESS;
00389 }
00390
00391
00392 int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode)
00393 {
00394 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00395
00396
00397 gpio_port->gfers = 1 << (pin & 0x1F);
00398
00399
00400 if(GPIO_INVALID_ARGUMENT == gpio_configure_edge_detector(pin, mode))
00401 return(GPIO_INVALID_ARGUMENT);
00402
00403
00404 gpio_port->iers = 1 << (pin & 0x1F);
00405
00406 return GPIO_SUCCESS;
00407 }
00408
00409
00410 void gpio_disable_pin_interrupt(unsigned int pin)
00411 {
00412 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00413 gpio_port->ierc = 1 << (pin & 0x1F);
00414 }
00415
00416
00417 int gpio_get_pin_interrupt_flag(unsigned int pin)
00418 {
00419 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00420 return (gpio_port->ifr >> (pin & 0x1F)) & 1;
00421 }
00422
00423
00424 void gpio_clear_pin_interrupt_flag(unsigned int pin)
00425 {
00426 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00427 gpio_port->ifrc = 1 << (pin & 0x1F);
00428 }
00429
00430
00431
00432
00433
00434 #if UC3L
00435 int gpio_configure_pin_periph_event_mode(unsigned int pin, unsigned int mode, unsigned int use_igf)
00436 {
00437 volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5];
00438
00439 if(TRUE == use_igf)
00440 {
00441
00442 gpio_port->gfers = 1 << (pin & 0x1F);
00443 }
00444 else
00445 {
00446
00447 gpio_port->gferc = 1 << (pin & 0x1F);
00448 }
00449
00450
00451 return(gpio_configure_edge_detector(pin, mode));
00452 }
00453
00454 #endif
00455