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
00088 #include <dev/irqreg.h>
00089
00090 #if defined(MCU_AT90CAN128) || defined(MCU_ATMEGA2560) || defined(MCU_ATMEGA2561)
00091 #define INT_MASK_REG TIMSK0
00092 #define INT_STATUS_REG TIFR0
00093 #define INT_ENABLE_BIT OCIE0A
00094 #define INT_STATUS_BIT OCF0A
00095 #define INT_PRIORITY 15
00096 #else
00097 #define INT_MASK_REG TIMSK
00098 #define INT_STATUS_REG TIFR
00099 #define INT_ENABLE_BIT OCIE0
00100 #define INT_STATUS_BIT OCF0
00101 #define INT_PRIORITY 14
00102 #endif
00103
00108
00109 static int AvrTimer0CompIrqCtl(int cmd, void *param);
00110
00111 IRQ_HANDLER sig_OUTPUT_COMPARE0 = {
00112 #ifdef NUT_PERFMON
00113 0,
00114 #endif
00115 NULL,
00116 NULL,
00117 AvrTimer0CompIrqCtl
00118 };
00119
00135 static int AvrTimer0CompIrqCtl(int cmd, void *param)
00136 {
00137 int rc = 0;
00138 unsigned int *ival = (unsigned int *) param;
00139 int_fast8_t enabled = bit_is_set(INT_MASK_REG, INT_ENABLE_BIT);
00140
00141
00142 cbi(INT_MASK_REG, INT_ENABLE_BIT);
00143
00144 switch (cmd) {
00145 case NUT_IRQCTL_INIT:
00146 enabled = 0;
00147 case NUT_IRQCTL_CLEAR:
00148
00149 outb(INT_STATUS_REG, _BV(INT_STATUS_BIT));
00150 break;
00151 case NUT_IRQCTL_STATUS:
00152 if (bit_is_set(INT_STATUS_REG, INT_STATUS_BIT)) {
00153 *ival = 1;
00154 } else {
00155 *ival = 0;
00156 }
00157 if (enabled) {
00158 *ival |= 0x80;
00159 }
00160 break;
00161 case NUT_IRQCTL_ENABLE:
00162 enabled = 1;
00163 break;
00164 case NUT_IRQCTL_DISABLE:
00165 enabled = 0;
00166 break;
00167 case NUT_IRQCTL_GETPRIO:
00168 *ival = INT_PRIORITY;
00169 break;
00170 #ifdef NUT_PERFMON
00171 case NUT_IRQCTL_GETCOUNT:
00172 *ival = (unsigned int) sig_OUTPUT_COMPARE0.ir_count;
00173 sig_OUTPUT_COMPARE0.ir_count = 0;
00174 break;
00175 #endif
00176 default:
00177 rc = -1;
00178 break;
00179 }
00180
00181
00182 if (enabled) {
00183 sbi(INT_MASK_REG, INT_ENABLE_BIT);
00184 }
00185 return rc;
00186 }
00187
00191 #ifdef __IMAGECRAFT__
00192 #if defined( ATMega2560 ) || defined( ATMega2561 )
00193 #pragma interrupt_handler SIG_OUTPUT_COMPARE0:iv_TIMER0_COMPA
00194 #else
00195 #pragma interrupt_handler SIG_OUTPUT_COMPARE0:iv_TIMER0_COMP
00196 #endif
00197 NUTSIGNAL(SIG_OUTPUT_COMPARE0, sig_OUTPUT_COMPARE0)
00198 #else
00199 #if defined(MCU_ATMEGA2560) || defined(MCU_ATMEGA2561)
00200 NUTSIGNAL(SIG_OUTPUT_COMPARE0A, sig_OUTPUT_COMPARE0)
00201 #else
00202 NUTSIGNAL(SIG_OUTPUT_COMPARE0, sig_OUTPUT_COMPARE0)
00203 #endif
00204 #endif
00205
00206