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
00090 #include <dev/irqreg.h>
00091
00092 #if defined(MCU_AT90CAN128) || defined(MCU_ATMEGA2560) || defined(MCU_ATMEGA2561)
00093 #define INT_MASK_REG TIMSK3
00094 #define INT_STATUS_REG TIFR3
00095 #define INT_ENABLE_BIT ICIE3
00096 #define INT_STATUS_BIT ICF3
00097 #define INT_PRIORITY 0
00098 #else
00099 #define INT_MASK_REG ETIMSK
00100 #define INT_STATUS_REG ETIFR
00101 #define INT_ENABLE_BIT TICIE3
00102 #define INT_STATUS_BIT ICF3
00103 #define INT_PRIORITY 0
00104 #endif
00105
00110
00111 #if defined(SIG_INPUT_CAPTURE3) || defined(iv_TIMER3_CAPT)
00112
00113 static int AvrTimer3InCaptIrqCtl(int cmd, void *param);
00114
00115 IRQ_HANDLER sig_INPUT_CAPTURE3 = {
00116 #ifdef NUT_PERFMON
00117 0,
00118 #endif
00119 NULL,
00120 NULL,
00121 AvrTimer3InCaptIrqCtl
00122 };
00123
00138 static int AvrTimer3InCaptIrqCtl(int cmd, void *param)
00139 {
00140 int rc = 0;
00141 unsigned int *ival = (unsigned int *) param;
00142 int_fast8_t enabled = bit_is_set(INT_MASK_REG, INT_ENABLE_BIT);
00143
00144
00145 cbi(INT_MASK_REG, INT_ENABLE_BIT);
00146
00147 switch (cmd) {
00148 case NUT_IRQCTL_INIT:
00149 case NUT_IRQCTL_CLEAR:
00150
00151 outb(INT_STATUS_REG, _BV(INT_STATUS_BIT));
00152 break;
00153 case NUT_IRQCTL_STATUS:
00154 if (bit_is_set(INT_STATUS_REG, INT_STATUS_BIT)) {
00155 *ival = 1;
00156 } else {
00157 *ival = 0;
00158 }
00159 if (enabled) {
00160 *ival |= 0x80;
00161 }
00162 break;
00163 case NUT_IRQCTL_ENABLE:
00164 enabled = 1;
00165 break;
00166 case NUT_IRQCTL_DISABLE:
00167 enabled = 0;
00168 break;
00169 case NUT_IRQCTL_GETPRIO:
00170 *ival = INT_PRIORITY;
00171 break;
00172 #ifdef NUT_PERFMON
00173 case NUT_IRQCTL_GETCOUNT:
00174 *ival = (unsigned int) sig_INPUT_CAPTURE3.ir_count;
00175 sig_INPUT_CAPTURE3.ir_count = 0;
00176 break;
00177 #endif
00178 default:
00179 rc = -1;
00180 break;
00181 }
00182
00183
00184 if (enabled) {
00185 sbi(INT_MASK_REG, INT_ENABLE_BIT);
00186 }
00187 return rc;
00188 }
00189
00193 #ifdef __IMAGECRAFT__
00194 #pragma interrupt_handler SIG_INPUT_CAPTURE3:iv_TIMER3_CAPT
00195 #endif
00196 NUTSIGNAL(SIG_INPUT_CAPTURE3, sig_INPUT_CAPTURE3)
00197 #endif
00198