00001
00002
00003
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 #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
00074 switch (function)
00075 {
00076 case 0:
00077 gpio_port->pmr0c = 1 << (pin & 0x1F);
00078 gpio_port->pmr1c = 1 << (pin & 0x1F);
00079 break;
00080
00081 case 1:
00082 gpio_port->pmr0s = 1 << (pin & 0x1F);
00083 gpio_port->pmr1c = 1 << (pin & 0x1F);
00084 break;
00085
00086 case 2:
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
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);
00169 gpio_port->oders = 1 << (pin & 0x1F);
00170 gpio_port->gpers = 1 << (pin & 0x1F);
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);
00179 gpio_port->oders = 1 << (pin & 0x1F);
00180 gpio_port->gpers = 1 << (pin & 0x1F);
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);
00189 gpio_port->oders = 1 << (pin & 0x1F);
00190 gpio_port->gpers = 1 << (pin & 0x1F);
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
00213 gpio_port->gfers = 1 << (pin & 0x1F);
00214
00215
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
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 }