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 AvrInterrupt4Ctl(int cmd, void *param);
00084
00085 IRQ_HANDLER sig_INTERRUPT4 = {
00086 #ifdef NUT_PERFMON
00087 0,
00088 #endif
00089 NULL,
00090 NULL,
00091 AvrInterrupt4Ctl
00092 };
00093
00111 static int AvrInterrupt4Ctl(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, INT4);
00116 uint8_t bval;
00117
00118
00119 cbi(EIMSK, INT4);
00120
00121 switch (cmd) {
00122 case NUT_IRQCTL_INIT:
00123
00124 cbi(EICR, ISC40);
00125 cbi(EICR, ISC41);
00126 case NUT_IRQCTL_CLEAR:
00127
00128 outb(EIFR, _BV(INTF4));
00129 break;
00130 case NUT_IRQCTL_STATUS:
00131 if (bit_is_set(EIFR, INTF4)) {
00132 *ival = 1;
00133 } else {
00134 *ival = 0;
00135 }
00136 if (enabled) {
00137 *ival |= 0x80;
00138 }
00139 break;
00140 case NUT_IRQCTL_ENABLE:
00141 enabled = 1;
00142 break;
00143 case NUT_IRQCTL_DISABLE:
00144 enabled = 0;
00145 break;
00146 case NUT_IRQCTL_GETMODE:
00147 bval = inb(EICR) & _BV(ISC41 | ISC40);
00148 if (bval == _BV(ISC41)) {
00149 *ival = NUT_IRQMODE_FALLINGEDGE;
00150 } else if (bval == _BV(ISC40)) {
00151 *ival = NUT_IRQMODE_EDGE;
00152 } else if (bval == _BV(ISC41 | ISC40)) {
00153 *ival = NUT_IRQMODE_RISINGEDGE;
00154 } else {
00155 *ival = NUT_IRQMODE_LOWLEVEL;
00156 }
00157 break;
00158 case NUT_IRQCTL_SETMODE:
00159 if (*ival == NUT_IRQMODE_LOWLEVEL) {
00160 cbi(EICR, ISC40);
00161 cbi(EICR, ISC41);
00162 } else if (*ival == NUT_IRQMODE_EDGE) {
00163 sbi(EICR, ISC40);
00164 cbi(EICR, ISC41);
00165 } else if (*ival == NUT_IRQMODE_FALLINGEDGE) {
00166 cbi(EICR, ISC40);
00167 sbi(EICR, ISC41);
00168 } else if (*ival == NUT_IRQMODE_RISINGEDGE) {
00169 sbi(EICR, ISC40);
00170 sbi(EICR, ISC41);
00171 } else {
00172 rc = -1;
00173 }
00174 break;
00175 case NUT_IRQCTL_GETPRIO:
00176 *ival = 4;
00177 break;
00178 #ifdef NUT_PERFMON
00179 case NUT_IRQCTL_GETCOUNT:
00180 *ival = (unsigned int) sig_INTERRUPT4.ir_count;
00181 sig_INTERRUPT4.ir_count = 0;
00182 break;
00183 #endif
00184 default:
00185 rc = -1;
00186 break;
00187 }
00188
00189
00190 if (enabled) {
00191 sbi(EIMSK, INT4);
00192 }
00193 return rc;
00194 }
00195
00199 #ifdef __IMAGECRAFT__
00200 #pragma interrupt_handler SIG_INTERRUPT4:iv_INT4
00201 #endif
00202 NUTSIGNAL(SIG_INTERRUPT4, sig_INTERRUPT4)
00203
00204
00205