00001
00016
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
00143 #include <avr32/io.h>
00144 #include "compiler.h"
00145 #include "gpio.h"
00146 #include "pm.h"
00147 #include "board.h"
00148 #include "eic.h"
00149 #include "intc.h"
00150
00151
00159
00160 #if BOARD==EVK1100
00161 #define SCAN_COL1_IDX 0
00162 #define SCAN_COL1_MUX _0
00163 #define SCAN_COL2_IDX 1
00164 #define SCAN_COL2_MUX _0
00165 #elif BOARD==EVK1101
00166 #define SCAN_COL1_IDX 4
00167 #define SCAN_COL1_MUX
00168 #define SCAN_COL2_IDX 5
00169 #define SCAN_COL2_MUX
00170 #elif BOARD==EVK1104
00171 #define SCAN_COL1_IDX 0
00172 #define SCAN_COL1_MUX _0
00173 #define SCAN_COL2_IDX 1
00174 #define SCAN_COL2_MUX _0
00175 #endif
00177
00178
00181
00182 #if BOARD==EVK1100
00183
00184
00185
00186
00187
00188
00189 #define EXT_INT_EXAMPLE_PIN_LINE1 AVR32_EIC_EXTINT_6_PIN
00190 #define EXT_INT_EXAMPLE_FUNCTION_LINE1 AVR32_EIC_EXTINT_6_FUNCTION
00191 #define EXT_INT_EXAMPLE_LINE1 EXT_INT6
00192 #define EXT_INT_EXAMPLE_IRQ_LINE1 AVR32_EIC_IRQ_6
00193 #define EXT_INT_EXAMPLE_PIN_LINE2 AVR32_EIC_EXTINT_7_PIN
00194 #define EXT_INT_EXAMPLE_FUNCTION_LINE2 AVR32_EIC_EXTINT_7_FUNCTION
00195 #define EXT_INT_EXAMPLE_LINE2 EXT_INT7
00196 #define EXT_INT_EXAMPLE_IRQ_LINE2 AVR32_EIC_IRQ_7
00197 #elif BOARD==EVK1101
00198
00199
00200
00201
00202
00203 #define EXT_INT_EXAMPLE_PIN_LINE1 AVR32_EIC_EXTINT_6_PIN
00204 #define EXT_INT_EXAMPLE_FUNCTION_LINE1 AVR32_EIC_EXTINT_6_FUNCTION
00205 #define EXT_INT_EXAMPLE_LINE1 EXT_INT6
00206 #define EXT_INT_EXAMPLE_IRQ_LINE1 AVR32_EIC_IRQ_6
00207 #define EXT_INT_EXAMPLE_PIN_LINE2 AVR32_EIC_EXTINT_7_PIN
00208 #define EXT_INT_EXAMPLE_FUNCTION_LINE2 AVR32_EIC_EXTINT_7_FUNCTION
00209 #define EXT_INT_EXAMPLE_LINE2 EXT_INT7
00210 #define EXT_INT_EXAMPLE_IRQ_LINE2 AVR32_EIC_IRQ_7
00211 #elif BOARD==EVK1104
00212
00213
00214
00215
00216
00217
00218 #define EXT_INT_EXAMPLE_PIN_LINE1 AVR32_EIC_EXTINT_6_PIN
00219 #define EXT_INT_EXAMPLE_FUNCTION_LINE1 AVR32_EIC_EXTINT_6_FUNCTION
00220 #define EXT_INT_EXAMPLE_LINE1 EXT_INT6
00221 #define EXT_INT_EXAMPLE_IRQ_LINE1 AVR32_EIC_IRQ_6
00222 #define EXT_INT_EXAMPLE_PIN_LINE2 AVR32_EIC_EXTINT_7_PIN
00223 #define EXT_INT_EXAMPLE_FUNCTION_LINE2 AVR32_EIC_EXTINT_7_FUNCTION
00224 #define EXT_INT_EXAMPLE_LINE2 EXT_INT7
00225 #define EXT_INT_EXAMPLE_IRQ_LINE2 AVR32_EIC_IRQ_7
00226 #endif
00227 #define EXT_SCAN_EXAMPLE_PIN_LINE1 ATPASTE4(AVR32_EIC_SCAN_,SCAN_COL1_IDX,SCAN_COL1_MUX,_PIN)
00228 #define EXT_SCAN_EXAMPLE_FUNCTION_LINE1 ATPASTE4(AVR32_EIC_SCAN_,SCAN_COL1_IDX,SCAN_COL1_MUX,_FUNCTION)
00229 #define EXT_SCAN_EXAMPLE_PIN_LINE2 ATPASTE4(AVR32_EIC_SCAN_,SCAN_COL2_IDX,SCAN_COL2_MUX,_PIN)
00230 #define EXT_SCAN_EXAMPLE_FUNCTION_LINE2 ATPASTE4(AVR32_EIC_SCAN_,SCAN_COL2_IDX,SCAN_COL2_MUX,_FUNCTION)
00232
00233
00235 eic_options_t eic_options[2];
00236
00238 unsigned char key_number = 0;
00239
00241 static volatile Bool bCancelSwDelay = FALSE;
00242
00243
00247 #if __GNUC__
00248 __attribute__((__interrupt__))
00249 #elif __ICCAVR32__
00250 __interrupt
00251 #endif
00252 static void eic_int_handler1(void)
00253 {
00254 int line_number;
00255 line_number = eic_get_interrupt_pad_scan(&AVR32_EIC);
00256 switch (line_number)
00257 {
00258 case SCAN_COL1_IDX :
00259 key_number = 1;
00260 break;
00261 case SCAN_COL2_IDX :
00262 key_number = 2;
00263 break;
00264 }
00265 bCancelSwDelay = TRUE;
00266 eic_clear_interrupt_line(&AVR32_EIC, EXT_INT_EXAMPLE_LINE1);
00267 }
00268
00269
00273 #if __GNUC__
00274 __attribute__((__interrupt__))
00275 #elif __ICCAVR32__
00276 __interrupt
00277 #endif
00278 static void eic_int_handler2(void)
00279 {
00280 int line_number;
00281 line_number = eic_get_interrupt_pad_scan(&AVR32_EIC);
00282 switch (line_number)
00283 {
00284 case SCAN_COL1_IDX :
00285 key_number = 3;
00286 break;
00287 case SCAN_COL2_IDX :
00288 key_number = 4;
00289 break;
00290 }
00291 bCancelSwDelay = TRUE;
00292 eic_clear_interrupt_line(&AVR32_EIC, EXT_INT_EXAMPLE_LINE2);
00293 }
00294
00295
00296
00297
00298
00299 static void software_delay(void)
00300 {
00301 volatile int i;
00302 bCancelSwDelay = FALSE;
00303 for (i=10000; (i>=0)&&(FALSE == bCancelSwDelay); i--);
00304 }
00305
00306
00307
00308
00309
00310
00311 int main(void)
00312 {
00313
00314 eic_options[0].eic_mode = EIC_MODE_EDGE_TRIGGERED;
00315
00316
00317 eic_options[0].eic_edge = EIC_EDGE_FALLING_EDGE;
00318
00319 eic_options[0].eic_async = EIC_SYNCH_MODE;
00320
00321 eic_options[0].eic_line = EXT_INT_EXAMPLE_LINE1;
00322
00323
00324
00325 eic_options[1].eic_mode = EIC_MODE_EDGE_TRIGGERED;
00326
00327
00328 eic_options[1].eic_edge = EIC_EDGE_FALLING_EDGE;
00329
00330 eic_options[1].eic_async = EIC_SYNCH_MODE;
00331
00332 eic_options[1].eic_line = EXT_INT_EXAMPLE_LINE2;
00333
00334
00335
00336 gpio_set_gpio_pin(LED0_GPIO);
00337 gpio_set_gpio_pin(LED1_GPIO);
00338 gpio_set_gpio_pin(LED2_GPIO);
00339 gpio_set_gpio_pin(LED3_GPIO);
00340
00341
00342 static const gpio_map_t EIC_GPIO_MAP =
00343 {
00344 {EXT_INT_EXAMPLE_PIN_LINE1, EXT_INT_EXAMPLE_FUNCTION_LINE1},
00345 {EXT_INT_EXAMPLE_PIN_LINE2, EXT_INT_EXAMPLE_FUNCTION_LINE2},
00346 {EXT_SCAN_EXAMPLE_PIN_LINE1, EXT_SCAN_EXAMPLE_FUNCTION_LINE1},
00347 {EXT_SCAN_EXAMPLE_PIN_LINE2, EXT_SCAN_EXAMPLE_FUNCTION_LINE2}
00348 };
00349 gpio_enable_module(EIC_GPIO_MAP, sizeof(EIC_GPIO_MAP) / sizeof(EIC_GPIO_MAP[0]));
00350
00351 gpio_enable_pin_pull_up(EXT_INT_EXAMPLE_PIN_LINE1);
00352 gpio_enable_pin_pull_up(EXT_INT_EXAMPLE_PIN_LINE2);
00353
00354
00355 Disable_global_interrupt();
00356
00357
00358 INTC_init_interrupts();
00359
00360
00361
00362
00363
00364
00365
00366 INTC_register_interrupt(&eic_int_handler1, EXT_INT_EXAMPLE_IRQ_LINE1, AVR32_INTC_INT0);
00367 INTC_register_interrupt(&eic_int_handler2, EXT_INT_EXAMPLE_IRQ_LINE2, AVR32_INTC_INT0);
00368
00369
00370 eic_init(&AVR32_EIC, eic_options, 2);
00371
00372 eic_enable_lines(&AVR32_EIC, (1<<eic_options[1].eic_line)|(1<<eic_options[0].eic_line));
00373
00374 eic_enable_interrupt_lines(&AVR32_EIC, (1<<eic_options[1].eic_line)|(1<<eic_options[0].eic_line));
00375
00376 eic_enable_interrupt_scan(&AVR32_EIC,10);
00377
00378
00379 Enable_global_interrupt();
00380
00381
00382
00383 while(1)
00384 {
00385 switch (key_number)
00386 {
00387 case 1 :
00388 gpio_clr_gpio_pin(LED0_GPIO);
00389 gpio_set_gpio_pin(LED1_GPIO);
00390 gpio_set_gpio_pin(LED2_GPIO);
00391 gpio_set_gpio_pin(LED3_GPIO);
00392 key_number = 0;
00393 software_delay();
00394 break;
00395 case 2 :
00396 gpio_set_gpio_pin(LED0_GPIO);
00397 gpio_clr_gpio_pin(LED1_GPIO);
00398 gpio_set_gpio_pin(LED2_GPIO);
00399 gpio_set_gpio_pin(LED3_GPIO);
00400 key_number = 0;
00401 software_delay();
00402 break;
00403 case 3 :
00404 gpio_set_gpio_pin(LED0_GPIO);
00405 gpio_set_gpio_pin(LED1_GPIO);
00406 gpio_clr_gpio_pin(LED2_GPIO);
00407 gpio_set_gpio_pin(LED3_GPIO);
00408 key_number = 0;
00409 software_delay();
00410 break;
00411 case 4 :
00412 gpio_set_gpio_pin(LED0_GPIO);
00413 gpio_set_gpio_pin(LED1_GPIO);
00414 gpio_set_gpio_pin(LED2_GPIO);
00415 gpio_clr_gpio_pin(LED3_GPIO);
00416 key_number = 0;
00417 software_delay();
00418 break;
00419 default :
00420 gpio_set_gpio_pin(LED0_GPIO);
00421 gpio_set_gpio_pin(LED1_GPIO);
00422 gpio_set_gpio_pin(LED2_GPIO);
00423 gpio_set_gpio_pin(LED3_GPIO);
00424 break;
00425 }
00426 }
00427 }