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
00073 #include <dev/irqreg.h>
00074
00075 #if defined(MCU_AT90CAN128) || defined(MCU_ATMEGA2561)
00076 #define INT_MASK_REG TIMSK1
00077 #define INT_STATUS_REG TIFR1
00078 #define INT_ENABLE_BIT ICIE1
00079 #define INT_STATUS_BIT ICF1
00080 #define INT_PRIORITY 10
00081 #else
00082 #define INT_MASK_REG TIMSK
00083 #define INT_STATUS_REG TIFR
00084 #define INT_ENABLE_BIT TICIE1
00085 #define INT_STATUS_BIT ICF1
00086 #define INT_PRIORITY 10
00087 #endif
00088
00093
00094 static int AvrTimer1CaptIrqCtl(int cmd, void *param);
00095
00096 IRQ_HANDLER sig_INPUT_CAPTURE1 = {
00097 #ifdef NUT_PERFMON
00098 0,
00099 #endif
00100 NULL,
00101 NULL,
00102 AvrTimer1CaptIrqCtl
00103 };
00104
00120 static int AvrTimer1CaptIrqCtl(int cmd, void *param)
00121 {
00122 int rc = 0;
00123 u_int *ival = (u_int *) param;
00124 int enabled = bit_is_set(INT_MASK_REG, INT_ENABLE_BIT);
00125
00126
00127 cbi(INT_MASK_REG, INT_ENABLE_BIT);
00128
00129 switch (cmd) {
00130 case NUT_IRQCTL_INIT:
00131 enabled = 0;
00132 case NUT_IRQCTL_CLEAR:
00133
00134 outb(INT_STATUS_REG, _BV(INT_STATUS_BIT));
00135 break;
00136 case NUT_IRQCTL_STATUS:
00137 if (bit_is_set(INT_STATUS_REG, INT_STATUS_BIT)) {
00138 *ival = 1;
00139 } else {
00140 *ival = 0;
00141 }
00142 if (enabled) {
00143 *ival |= 0x80;
00144 }
00145 break;
00146 case NUT_IRQCTL_ENABLE:
00147 enabled = 1;
00148 break;
00149 case NUT_IRQCTL_DISABLE:
00150 enabled = 0;
00151 break;
00152 case NUT_IRQCTL_GETPRIO:
00153 *ival = INT_PRIORITY;
00154 break;
00155 #ifdef NUT_PERFMON
00156 case NUT_IRQCTL_GETCOUNT:
00157 *ival = (u_int) sig_INPUT_CAPTURE1.ir_count;
00158 sig_INPUT_CAPTURE1.ir_count = 0;
00159 break;
00160 #endif
00161 default:
00162 rc = -1;
00163 break;
00164 }
00165
00166
00167 if (enabled) {
00168 sbi(INT_MASK_REG, INT_ENABLE_BIT);
00169 }
00170 return rc;
00171 }
00172
00176 #ifdef __IMAGECRAFT__
00177 #pragma interrupt_handler SIG_INPUT_CAPTURE1:iv_TIMER1_CAPT
00178 #endif
00179 NUTSIGNAL(SIG_INPUT_CAPTURE1, sig_INPUT_CAPTURE1)
00180
00181
00182