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