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
00077 #include <dev/irqreg.h>
00078
00079 #if defined(MCU_AT90CAN128) || defined(MCU_ATMEGA2561)
00080 #define INT_MASK_REG TIMSK2
00081 #define INT_STATUS_REG TIFR2
00082 #define INT_ENABLE_BIT OCIE2A
00083 #define INT_STATUS_BIT OCF2A
00084 #define INT_PRIORITY 8
00085 #else
00086 #define INT_MASK_REG TIMSK
00087 #define INT_STATUS_REG TIFR
00088 #define INT_ENABLE_BIT OCIE2
00089 #define INT_STATUS_BIT OCF2
00090 #define INT_PRIORITY 8
00091 #endif
00092
00097
00098 static int AvrTimer2CompIrqCtl(int cmd, void *param);
00099
00100 IRQ_HANDLER sig_OUTPUT_COMPARE2 = {
00101 #ifdef NUT_PERFMON
00102 0,
00103 #endif
00104 NULL,
00105 NULL,
00106 AvrTimer2CompIrqCtl
00107 };
00108
00124 static int AvrTimer2CompIrqCtl(int cmd, void *param)
00125 {
00126 int rc = 0;
00127 u_int *ival = (u_int *) param;
00128 int enabled = bit_is_set(INT_MASK_REG, INT_ENABLE_BIT);
00129
00130
00131 cbi(INT_MASK_REG, INT_ENABLE_BIT);
00132
00133 switch (cmd) {
00134 case NUT_IRQCTL_INIT:
00135 enabled = 0;
00136 case NUT_IRQCTL_CLEAR:
00137
00138 outb(INT_STATUS_REG, _BV(INT_STATUS_BIT));
00139 break;
00140 case NUT_IRQCTL_STATUS:
00141 if (bit_is_set(INT_STATUS_REG, INT_STATUS_BIT)) {
00142 *ival = 1;
00143 } else {
00144 *ival = 0;
00145 }
00146 if (enabled) {
00147 *ival |= 0x80;
00148 }
00149 break;
00150 case NUT_IRQCTL_ENABLE:
00151 enabled = 1;
00152 break;
00153 case NUT_IRQCTL_DISABLE:
00154 enabled = 0;
00155 break;
00156 case NUT_IRQCTL_GETPRIO:
00157 *ival = INT_PRIORITY;
00158 break;
00159 #ifdef NUT_PERFMON
00160 case NUT_IRQCTL_GETCOUNT:
00161 *ival = (u_int) sig_OUTPUT_COMPARE2.ir_count;
00162 sig_OUTPUT_COMPARE2.ir_count = 0;
00163 break;
00164 #endif
00165 default:
00166 rc = -1;
00167 break;
00168 }
00169
00170
00171 if (enabled) {
00172 sbi(INT_MASK_REG, INT_ENABLE_BIT);
00173 }
00174 return rc;
00175 }
00176
00180 #ifdef __IMAGECRAFT__
00181 #ifdef ATMega2561
00182 #pragma interrupt_handler SIG_OUTPUT_COMPARE2:iv_TIMER2_COMPA
00183 #else
00184 #pragma interrupt_handler SIG_OUTPUT_COMPARE2:iv_TIMER2_COMP
00185 #endif
00186 NUTSIGNAL(SIG_OUTPUT_COMPARE2, sig_OUTPUT_COMPARE2)
00187 #else
00188 #if defined(MCU_ATMEGA2561)
00189 NUTSIGNAL(SIG_OUTPUT_COMPARE2A, sig_OUTPUT_COMPARE2)
00190 #else
00191 NUTSIGNAL(SIG_OUTPUT_COMPARE2, sig_OUTPUT_COMPARE2)
00192 #endif
00193 #endif
00194