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
00073 #include <dev/irqreg.h>
00074
00079
00080 static int AvrInterrupt0Ctl(int cmd, void *param);
00081
00082 IRQ_HANDLER sig_INTERRUPT0 = {
00083 #ifdef NUT_PERFMON
00084 0,
00085 #endif
00086 NULL,
00087 NULL,
00088 AvrInterrupt0Ctl
00089 };
00090
00108 static int AvrInterrupt0Ctl(int cmd, void *param)
00109 {
00110 int rc = 0;
00111 u_int *ival = (u_int *) param;
00112 int enabled = bit_is_set(EIMSK, INT0);
00113
00114
00115 cbi(EIMSK, INT0);
00116
00117 switch (cmd) {
00118 case NUT_IRQCTL_INIT:
00119 #ifdef __AVR_ENHANCED__
00120
00121 cbi(EICRA, ISC00);
00122 cbi(EICRA, ISC01);
00123 #endif
00124 case NUT_IRQCTL_CLEAR:
00125 #ifdef __AVR_ENHANCED__
00126
00127 outb(EIFR, _BV(INTF0));
00128 #endif
00129 break;
00130 case NUT_IRQCTL_STATUS:
00131 #ifdef __AVR_ENHANCED__
00132 if (bit_is_set(EIFR, INTF0)) {
00133 *ival = 1;
00134 } else {
00135 *ival = 0;
00136 }
00137 #else
00138 *ival = 0;
00139 #endif
00140 if (enabled) {
00141 *ival |= 0x80;
00142 }
00143 break;
00144 case NUT_IRQCTL_ENABLE:
00145 enabled = 1;
00146 break;
00147 case NUT_IRQCTL_DISABLE:
00148 enabled = 0;
00149 break;
00150 case NUT_IRQCTL_GETMODE:
00151 #ifdef __AVR_ENHANCED__
00152 {
00153 u_char bval = inb(EICRA) & (_BV(ISC01) | _BV(ISC00));
00154 if (bval == 0) {
00155 *ival = NUT_IRQMODE_LOWLEVEL;
00156 }
00157 else if (bval == (_BV(ISC01) | _BV(ISC00))) {
00158 *ival = NUT_IRQMODE_RISINGEDGE;
00159 } else {
00160 *ival = NUT_IRQMODE_FALLINGEDGE;
00161 }
00162 }
00163 #else
00164 *ival = NUT_IRQMODE_LOWLEVEL;
00165 #endif
00166 break;
00167 case NUT_IRQCTL_SETMODE:
00168 #ifdef __AVR_ENHANCED__
00169 if (*ival == NUT_IRQMODE_LOWLEVEL) {
00170 cbi(EICRA, ISC00);
00171 cbi(EICRA, ISC01);
00172 } else if (*ival == NUT_IRQMODE_FALLINGEDGE) {
00173 cbi(EICRA, ISC00);
00174 sbi(EICRA, ISC01);
00175 } else if (*ival == NUT_IRQMODE_RISINGEDGE) {
00176 sbi(EICRA, ISC00);
00177 sbi(EICRA, ISC01);
00178 } else {
00179 rc = -1;
00180 }
00181 #else
00182 if (*ival != NUT_IRQMODE_LOWLEVEL) {
00183 rc = -1;
00184 }
00185 #endif
00186 break;
00187 case NUT_IRQCTL_GETPRIO:
00188 *ival = 0;
00189 break;
00190 #ifdef NUT_PERFMON
00191 case NUT_IRQCTL_GETCOUNT:
00192 *ival = (u_int) sig_INTERRUPT0.ir_count;
00193 sig_INTERRUPT0.ir_count = 0;
00194 break;
00195 #endif
00196 default:
00197 rc = -1;
00198 break;
00199 }
00200
00201
00202 if (enabled) {
00203 sbi(EIMSK, INT0);
00204 }
00205 return rc;
00206 }
00207
00212 #ifdef __IMAGECRAFT__
00213 #pragma interrupt_handler SIG_INTERRUPT0:iv_INT0
00214 #endif
00215 NUTSIGNAL(SIG_INTERRUPT0, sig_INTERRUPT0)
00216
00217