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 TIMSK0
00081 #define INT_STATUS_REG TIFR0
00082 #define INT_ENABLE_BIT OCIE0A
00083 #define INT_STATUS_BIT OCF0A
00084 #define INT_PRIORITY 15
00085 #else
00086 #define INT_MASK_REG TIMSK
00087 #define INT_STATUS_REG TIFR
00088 #define INT_ENABLE_BIT OCIE0
00089 #define INT_STATUS_BIT OCF0
00090 #define INT_PRIORITY 14
00091 #endif
00092
00097
00098 static int AvrTimer0CompIrqCtl(int cmd, void *param);
00099
00100 IRQ_HANDLER sig_OUTPUT_COMPARE0 = {
00101 #ifdef NUT_PERFMON
00102 0,
00103 #endif
00104 NULL,
00105 NULL,
00106 AvrTimer0CompIrqCtl
00107 };
00108
00124 static int AvrTimer0CompIrqCtl(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_COMPARE0.ir_count;
00162 sig_OUTPUT_COMPARE0.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_COMPARE0:iv_TIMER0_COMPA
00183 #else
00184 #pragma interrupt_handler SIG_OUTPUT_COMPARE0:iv_TIMER0_COMP
00185 #endif
00186 NUTSIGNAL(SIG_OUTPUT_COMPARE0, sig_OUTPUT_COMPARE0)
00187 #else
00188 #if defined(MCU_ATMEGA2561)
00189 NUTSIGNAL(SIG_OUTPUT_COMPARE0A, sig_OUTPUT_COMPARE0)
00190 #else
00191 NUTSIGNAL(SIG_OUTPUT_COMPARE0, sig_OUTPUT_COMPARE0)
00192 #endif
00193 #endif
00194
00195