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
00087 #include <dev/irqreg.h>
00088
00089 #if defined(MCU_AT90CAN128) || defined(MCU_ATMEGA2560) || defined(MCU_ATMEGA2561)
00090 #define INT_MASK_REG TIMSK3
00091 #define INT_STATUS_REG TIFR3
00092 #define INT_PRIORITY 30
00093 #else
00094 #define INT_MASK_REG ETIMSK
00095 #define INT_STATUS_REG ETIFR
00096 #define INT_PRIORITY 28
00097 #endif
00098
00103
00104 #if defined(SIG_OVERFLOW3) || defined(iv_TIMER3_OVF)
00105
00106 static int AvrTimer3OvfIrqCtl(int cmd, void *param);
00107
00108 IRQ_HANDLER sig_OVERFLOW3 = {
00109 #ifdef NUT_PERFMON
00110 0,
00111 #endif
00112 NULL,
00113 NULL,
00114 AvrTimer3OvfIrqCtl
00115 };
00116
00132 static int AvrTimer3OvfIrqCtl(int cmd, void *param)
00133 {
00134 int rc = 0;
00135 unsigned int *ival = (unsigned int *) param;
00136 int_fast8_t enabled = bit_is_set(INT_MASK_REG, TOIE3);
00137
00138
00139 cbi(INT_MASK_REG, TOIE3);
00140
00141 switch (cmd) {
00142 case NUT_IRQCTL_INIT:
00143 enabled = 0;
00144 case NUT_IRQCTL_CLEAR:
00145
00146 outb(INT_STATUS_REG, _BV(TOV3));
00147 break;
00148 case NUT_IRQCTL_STATUS:
00149 if (bit_is_set(INT_STATUS_REG, TOV3)) {
00150 *ival = 1;
00151 } else {
00152 *ival = 0;
00153 }
00154 if (enabled) {
00155 *ival |= 0x80;
00156 }
00157 break;
00158 case NUT_IRQCTL_ENABLE:
00159 enabled = 1;
00160 break;
00161 case NUT_IRQCTL_DISABLE:
00162 enabled = 0;
00163 break;
00164 case NUT_IRQCTL_GETPRIO:
00165 *ival = INT_PRIORITY;
00166 break;
00167 #ifdef NUT_PERFMON
00168 case NUT_IRQCTL_GETCOUNT:
00169 *ival = (unsigned int) sig_OVERFLOW3.ir_count;
00170 sig_OVERFLOW3.ir_count = 0;
00171 break;
00172 #endif
00173 default:
00174 rc = -1;
00175 break;
00176 }
00177
00178
00179 if (enabled) {
00180 sbi(INT_MASK_REG, TOIE3);
00181 }
00182 return rc;
00183 }
00184
00188 #ifdef __IMAGECRAFT__
00189 #pragma interrupt_handler SIG_OVERFLOW3:iv_TIMER3_OVF
00190 #endif
00191 NUTSIGNAL(SIG_OVERFLOW3, sig_OVERFLOW3)
00192 #endif
00193