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
00078 #if defined(MCU_AT90CAN128) || defined(MCU_ATMEGA2561)
00079 #define INT_MASK_REG TIMSK3
00080 #define INT_STATUS_REG TIFR3
00081 #define INT_ENABLE_BIT OCIE3C
00082 #define INT_STATUS_BIT OCF3C
00083 #define INT_PRIORITY 11
00084 #else
00085 #define INT_MASK_REG ETIMSK
00086 #define INT_STATUS_REG ETIFR
00087 #define INT_ENABLE_BIT OCIE3C
00088 #define INT_STATUS_BIT OCF3C
00089 #define INT_PRIORITY 11
00090 #endif
00091
00096
00097 #if defined(SIG_OUTPUT_COMPARE3C) || defined(iv_TIMER3_COMPC)
00098
00099 static int AvrTimer3CompCIrqCtl(int cmd, void *param);
00100
00101 IRQ_HANDLER sig_OUTPUT_COMPARE3C = {
00102 #ifdef NUT_PERFMON
00103 0,
00104 #endif
00105 NULL,
00106 NULL,
00107 AvrTimer3CompCIrqCtl
00108 };
00109
00125 static int AvrTimer3CompCIrqCtl(int cmd, void *param)
00126 {
00127 int rc = 0;
00128 u_int *ival = (u_int *) param;
00129 int enabled = bit_is_set(INT_MASK_REG, INT_ENABLE_BIT);
00130
00131
00132 cbi(INT_MASK_REG, INT_ENABLE_BIT);
00133
00134 switch (cmd) {
00135 case NUT_IRQCTL_INIT:
00136 enabled = 0;
00137 case NUT_IRQCTL_CLEAR:
00138
00139 outb(INT_STATUS_REG, _BV(INT_STATUS_BIT));
00140 break;
00141 case NUT_IRQCTL_STATUS:
00142 if (bit_is_set(INT_STATUS_REG, INT_STATUS_BIT)) {
00143 *ival = 1;
00144 } else {
00145 *ival = 0;
00146 }
00147 if (enabled) {
00148 *ival |= 0x80;
00149 }
00150 break;
00151 case NUT_IRQCTL_ENABLE:
00152 enabled = 1;
00153 break;
00154 case NUT_IRQCTL_DISABLE:
00155 enabled = 0;
00156 break;
00157 case NUT_IRQCTL_GETPRIO:
00158 *ival = INT_PRIORITY;
00159 break;
00160 #ifdef NUT_PERFMON
00161 case NUT_IRQCTL_GETCOUNT:
00162 *ival = (u_int) sig_OUTPUT_COMPARE3C.ir_count;
00163 sig_OUTPUT_COMPARE3C.ir_count = 0;
00164 break;
00165 #endif
00166 default:
00167 rc = -1;
00168 break;
00169 }
00170
00171
00172 if (enabled) {
00173 sbi(INT_MASK_REG, INT_ENABLE_BIT);
00174 }
00175 return rc;
00176 }
00177
00181 #ifdef __IMAGECRAFT__
00182 #pragma interrupt_handler SIG_OUTPUT_COMPARE3C:iv_TIMER3_COMPC
00183 #endif
00184 NUTSIGNAL(SIG_OUTPUT_COMPARE3C, sig_OUTPUT_COMPARE3C)
00185 #endif
00186