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
00077 #include <dev/irqreg.h>
00078
00079 #if defined(MCU_ATMEGA2560) || defined(MCU_ATMEGA2561)
00080 #define INT_MASK_REG TIMSK1
00081 #define INT_STATUS_REG TIFR1
00082 #define INT_PRIORITY 21
00083 #else
00084 #define INT_MASK_REG TIMSK
00085 #define INT_STATUS_REG TIFR
00086 #define INT_PRIORITY 13
00087 #endif
00088
00093
00094 static int AvrTimer1OvfIrqCtl(int cmd, void *param);
00095
00096 IRQ_HANDLER sig_OVERFLOW1 = {
00097 #ifdef NUT_PERFMON
00098 0,
00099 #endif
00100 NULL,
00101 NULL,
00102 AvrTimer1OvfIrqCtl
00103 };
00104
00120 static int AvrTimer1OvfIrqCtl(int cmd, void *param)
00121 {
00122 int rc = 0;
00123 unsigned int *ival = (unsigned int *) param;
00124 int_fast8_t enabled = bit_is_set(INT_MASK_REG, TOIE1);
00125
00126
00127 cbi(INT_MASK_REG, TOIE1);
00128
00129 switch (cmd) {
00130 case NUT_IRQCTL_INIT:
00131 enabled = 0;
00132 case NUT_IRQCTL_CLEAR:
00133
00134 outb(INT_STATUS_REG, _BV(TOV1));
00135 break;
00136 case NUT_IRQCTL_STATUS:
00137 if (bit_is_set(INT_STATUS_REG, TOV1)) {
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 = (unsigned int) sig_OVERFLOW1.ir_count;
00158 sig_OVERFLOW1.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, TOIE1);
00169 }
00170 return rc;
00171 }
00172
00176 #ifdef __IMAGECRAFT__
00177 #pragma interrupt_handler SIG_OVERFLOW1:iv_TIMER1_OVF
00178 #endif
00179 NUTSIGNAL(SIG_OVERFLOW1, sig_OVERFLOW1)
00180
00181
00182