Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00076 #include <dev/irqreg.h>
00077
00082
00083 static int AvrInterrupt0Ctl(int cmd, void *param);
00084
00085 IRQ_HANDLER sig_INTERRUPT0 = {
00086 #ifdef NUT_PERFMON
00087 0,
00088 #endif
00089 NULL,
00090 NULL,
00091 AvrInterrupt0Ctl
00092 };
00093
00111 static int AvrInterrupt0Ctl(int cmd, void *param)
00112 {
00113 int rc = 0;
00114 unsigned int *ival = (unsigned int *) param;
00115 int_fast8_t enabled = bit_is_set(EIMSK, INT0);
00116
00117
00118 cbi(EIMSK, INT0);
00119
00120 switch (cmd) {
00121 case NUT_IRQCTL_INIT:
00122 #ifdef __AVR_ENHANCED__
00123
00124 cbi(EICRA, ISC00);
00125 cbi(EICRA, ISC01);
00126 #endif
00127 case NUT_IRQCTL_CLEAR:
00128 #ifdef __AVR_ENHANCED__
00129
00130 outb(EIFR, _BV(INTF0));
00131 #endif
00132 break;
00133 case NUT_IRQCTL_STATUS:
00134 #ifdef __AVR_ENHANCED__
00135 if (bit_is_set(EIFR, INTF0)) {
00136 *ival = 1;
00137 } else {
00138 *ival = 0;
00139 }
00140 #else
00141 *ival = 0;
00142 #endif
00143 if (enabled) {
00144 *ival |= 0x80;
00145 }
00146 break;
00147 case NUT_IRQCTL_ENABLE:
00148 enabled = 1;
00149 break;
00150 case NUT_IRQCTL_DISABLE:
00151 enabled = 0;
00152 break;
00153 case NUT_IRQCTL_GETMODE:
00154 #ifdef __AVR_ENHANCED__
00155 {
00156 uint8_t bval = inb(EICRA) & (_BV(ISC01) | _BV(ISC00));
00157 if (bval == 0) {
00158 *ival = NUT_IRQMODE_LOWLEVEL;
00159 }
00160 else if (bval == (_BV(ISC01) | _BV(ISC00))) {
00161 *ival = NUT_IRQMODE_RISINGEDGE;
00162 } else {
00163 *ival = NUT_IRQMODE_FALLINGEDGE;
00164 }
00165 }
00166 #else
00167 *ival = NUT_IRQMODE_LOWLEVEL;
00168 #endif
00169 break;
00170 case NUT_IRQCTL_SETMODE:
00171 #ifdef __AVR_ENHANCED__
00172 if (*ival == NUT_IRQMODE_LOWLEVEL) {
00173 cbi(EICRA, ISC00);
00174 cbi(EICRA, ISC01);
00175 } else if (*ival == NUT_IRQMODE_FALLINGEDGE) {
00176 cbi(EICRA, ISC00);
00177 sbi(EICRA, ISC01);
00178 } else if (*ival == NUT_IRQMODE_RISINGEDGE) {
00179 sbi(EICRA, ISC00);
00180 sbi(EICRA, ISC01);
00181 } else {
00182 rc = -1;
00183 }
00184 #else
00185 if (*ival != NUT_IRQMODE_LOWLEVEL) {
00186 rc = -1;
00187 }
00188 #endif
00189 break;
00190 case NUT_IRQCTL_GETPRIO:
00191 *ival = 0;
00192 break;
00193 #ifdef NUT_PERFMON
00194 case NUT_IRQCTL_GETCOUNT:
00195 *ival = (unsigned int) sig_INTERRUPT0.ir_count;
00196 sig_INTERRUPT0.ir_count = 0;
00197 break;
00198 #endif
00199 default:
00200 rc = -1;
00201 break;
00202 }
00203
00204
00205 if (enabled) {
00206 sbi(EIMSK, INT0);
00207 }
00208 return rc;
00209 }
00210
00215 #ifdef __IMAGECRAFT__
00216 #pragma interrupt_handler SIG_INTERRUPT0:iv_INT0
00217 #endif
00218 NUTSIGNAL(SIG_INTERRUPT0, sig_INTERRUPT0)
00219
00220