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 AvrInterrupt7Ctl(int cmd, void *param);
00081
00082 IRQ_HANDLER sig_INTERRUPT7 = {
00083 #ifdef NUT_PERFMON
00084 0,
00085 #endif
00086 NULL,
00087 NULL,
00088 AvrInterrupt7Ctl
00089 };
00090
00108 static int AvrInterrupt7Ctl(int cmd, void *param)
00109 {
00110 int rc = 0;
00111 u_int *ival = (u_int *) param;
00112 int enabled = bit_is_set(EIMSK, INT7);
00113 u_char bval;
00114
00115
00116 cbi(EIMSK, INT7);
00117
00118 switch (cmd) {
00119 case NUT_IRQCTL_INIT:
00120
00121 cbi(EICR, ISC70);
00122 cbi(EICR, ISC71);
00123 case NUT_IRQCTL_CLEAR:
00124
00125 outb(EIFR, _BV(INTF7));
00126 break;
00127 case NUT_IRQCTL_STATUS:
00128 if (bit_is_set(EIFR, INTF7)) {
00129 *ival = 1;
00130 } else {
00131 *ival = 0;
00132 }
00133 if (enabled) {
00134 *ival |= 0x80;
00135 }
00136 break;
00137 case NUT_IRQCTL_ENABLE:
00138 enabled = 1;
00139 break;
00140 case NUT_IRQCTL_DISABLE:
00141 enabled = 0;
00142 break;
00143 case NUT_IRQCTL_GETMODE:
00144 bval = inb(EICR) & _BV(ISC71 | ISC70);
00145 if (bval == _BV(ISC71)) {
00146 *ival = NUT_IRQMODE_FALLINGEDGE;
00147 } else if (bval == _BV(ISC70)) {
00148 *ival = NUT_IRQMODE_EDGE;
00149 } else if (bval == _BV(ISC71 | ISC70)) {
00150 *ival = NUT_IRQMODE_RISINGEDGE;
00151 } else {
00152 *ival = NUT_IRQMODE_LOWLEVEL;
00153 }
00154 break;
00155 case NUT_IRQCTL_SETMODE:
00156 if (*ival == NUT_IRQMODE_LOWLEVEL) {
00157 cbi(EICR, ISC70);
00158 cbi(EICR, ISC71);
00159 } else if (*ival == NUT_IRQMODE_EDGE) {
00160 sbi(EICR, ISC70);
00161 cbi(EICR, ISC71);
00162 } else if (*ival == NUT_IRQMODE_FALLINGEDGE) {
00163 cbi(EICR, ISC70);
00164 sbi(EICR, ISC71);
00165 } else if (*ival == NUT_IRQMODE_RISINGEDGE) {
00166 sbi(EICR, ISC70);
00167 sbi(EICR, ISC71);
00168 } else {
00169 rc = -1;
00170 }
00171 break;
00172 case NUT_IRQCTL_GETPRIO:
00173 *ival = 7;
00174 break;
00175 #ifdef NUT_PERFMON
00176 case NUT_IRQCTL_GETCOUNT:
00177 *ival = (u_int) sig_INTERRUPT7.ir_count;
00178 sig_INTERRUPT7.ir_count = 0;
00179 break;
00180 #endif
00181 default:
00182 rc = -1;
00183 break;
00184 }
00185
00186
00187 if (enabled) {
00188 sbi(EIMSK, INT7);
00189 }
00190 return rc;
00191 }
00192
00196 #ifdef __IMAGECRAFT__
00197 #pragma interrupt_handler SIG_INTERRUPT7:iv_INT7
00198 #endif
00199 NUTSIGNAL(SIG_INTERRUPT7, sig_INTERRUPT7)
00200
00201
00202