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 <avr32/io.h>
00049 #include "compiler.h"
00050 #include "preprocessor.h"
00051 #include "eic.h"
00052
00053
00054
00055 void eic_init(volatile avr32_eic_t *eic, const eic_options_t *opt, unsigned int nb_lines)
00056 {
00057 int i;
00058 for (i = 0; i < nb_lines; i++)
00059 {
00060
00061 eic->mode = (opt[i].eic_mode == 1) ? (eic->mode | (1 << opt[i].eic_line)) : (eic->mode & ~(1 << opt[i].eic_line));
00062
00063 eic->edge = (opt[i].eic_edge == 1) ? (eic->edge | (1 << opt[i].eic_line)) : (eic->edge & ~(1 << opt[i].eic_line));
00064
00065 eic->level = (opt[i].eic_level == 1) ? (eic->level | (1 << opt[i].eic_line)) : (eic->level & ~(1 << opt[i].eic_line));
00066
00067 eic->filter = (opt[i].eic_filter == 1) ? (eic->filter | (1 << opt[i].eic_line)) : (eic->filter & ~(1 << opt[i].eic_line));
00068
00069 eic->async = (opt[i].eic_async == 1) ? (eic->async | (1 << opt[i].eic_line)) : (eic->async & ~(1 << opt[i].eic_line));
00070 }
00071 }
00072
00073 void eic_enable_lines(volatile avr32_eic_t *eic, unsigned int mask_lines)
00074 {
00075 eic->en = mask_lines;
00076 }
00077
00078 void eic_enable_line(volatile avr32_eic_t *eic, unsigned int line_number)
00079 {
00080
00081 eic->en = 1 << line_number;
00082 }
00083
00084 void eic_disable_lines(volatile avr32_eic_t *eic, unsigned int mask_lines)
00085 {
00086 eic->dis = mask_lines;
00087 }
00088
00089 void eic_disable_line(volatile avr32_eic_t *eic, unsigned int line_number)
00090 {
00091
00092 eic->dis = 1 << line_number;
00093 }
00094
00095 Bool eic_is_line_enabled(volatile avr32_eic_t *eic, unsigned int line_number)
00096 {
00097 return (eic->ctrl & (1 << line_number)) != 0;
00098 }
00099
00100 void eic_enable_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines)
00101 {
00102 eic->ier = mask_lines;
00103 }
00104
00105 void eic_enable_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number)
00106 {
00107
00108 eic->ier = 1 << line_number;
00109 }
00110
00111 void eic_disable_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines)
00112 {
00113 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00114
00115 if (global_interrupt_enabled) Disable_global_interrupt();
00116 eic->idr = mask_lines;
00117 eic->imr;
00118 if (global_interrupt_enabled) Enable_global_interrupt();
00119 }
00120
00121 void eic_disable_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number)
00122 {
00123 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00124
00125
00126 if (global_interrupt_enabled) Disable_global_interrupt();
00127 eic->idr = 1 << line_number;
00128 eic->imr;
00129 if (global_interrupt_enabled) Enable_global_interrupt();
00130 }
00131
00132 Bool eic_is_interrupt_line_enabled(volatile avr32_eic_t *eic, unsigned int line_number)
00133 {
00134 return (eic->imr & (1 << line_number)) != 0;
00135 }
00136
00137 void eic_clear_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines)
00138 {
00139 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00140
00141 if (global_interrupt_enabled) Disable_global_interrupt();
00142 eic->icr = mask_lines;
00143 eic->isr;
00144 if (global_interrupt_enabled) Enable_global_interrupt();
00145 }
00146
00147 void eic_clear_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number)
00148 {
00149 Bool global_interrupt_enabled = Is_global_interrupt_enabled();
00150
00151
00152 if (global_interrupt_enabled) Disable_global_interrupt();
00153 eic->icr = 1 << line_number;
00154 eic->isr;
00155 if (global_interrupt_enabled) Enable_global_interrupt();
00156 }
00157
00158 Bool eic_is_interrupt_line_pending(volatile avr32_eic_t *eic, unsigned int line_number)
00159 {
00160 return (eic->isr & (1 << line_number)) != 0;
00161 }
00162
00163 #if !defined(AVR32_EIC_301_H_INCLUDED)
00164 void eic_enable_interrupt_scan(volatile avr32_eic_t *eic,unsigned int presc)
00165 {
00166
00167 eic->scan |= (presc << AVR32_EIC_SCAN_PRESC_OFFSET) | (1 << AVR32_EIC_SCAN_EN_OFFSET);
00168 }
00169
00170 void eic_disable_interrupt_scan(volatile avr32_eic_t *eic)
00171 {
00172
00173 eic->scan = 0 << AVR32_EIC_SCAN_EN_OFFSET;
00174 }
00175
00176 unsigned long eic_get_interrupt_pad_scan(volatile avr32_eic_t *eic)
00177 {
00178
00179 return(eic->scan>>AVR32_EIC_SCAN_PIN_OFFSET);
00180 }
00181 #endif