ih_timer1_compa.c
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
00083
00084 static int AvrTimer1CompAIrqCtl(int cmd, void *param);
00085
00086 IRQ_HANDLER sig_OUTPUT_COMPARE1A = {
00087 #ifdef NUT_PERFMON
00088 0,
00089 #endif
00090 NULL,
00091 NULL,
00092 AvrTimer1CompAIrqCtl
00093 };
00094
00110 static int AvrTimer1CompAIrqCtl(int cmd, void *param)
00111 {
00112 int rc = 0;
00113 unsigned int *ival = (unsigned int *) param;
00114 int_fast8_t enabled = bit_is_set(TIMSK, OCIE1A);
00115
00116
00117 cbi(TIMSK, OCIE1A);
00118
00119 switch (cmd) {
00120 case NUT_IRQCTL_INIT:
00121 enabled = 0;
00122 case NUT_IRQCTL_CLEAR:
00123
00124 outb(TIFR, _BV(OCF1A));
00125 break;
00126 case NUT_IRQCTL_STATUS:
00127 if (bit_is_set(TIFR, OCF1A)) {
00128 *ival = 1;
00129 } else {
00130 *ival = 0;
00131 }
00132 if (enabled) {
00133 *ival |= 0x80;
00134 }
00135 break;
00136 case NUT_IRQCTL_ENABLE:
00137 enabled = 1;
00138 break;
00139 case NUT_IRQCTL_DISABLE:
00140 enabled = 0;
00141 break;
00142 case NUT_IRQCTL_GETPRIO:
00143 *ival = 11;
00144 break;
00145 #ifdef NUT_PERFMON
00146 case NUT_IRQCTL_GETCOUNT:
00147 *ival = (unsigned int) sig_OUTPUT_COMPARE1A.ir_count;
00148 sig_OUTPUT_COMPARE1A.ir_count = 0;
00149 break;
00150 #endif
00151 default:
00152 rc = -1;
00153 break;
00154 }
00155
00156
00157 if (enabled) {
00158 sbi(TIMSK, OCIE1A);
00159 }
00160 return rc;
00161 }
00162
00166 #ifdef __IMAGECRAFT__
00167 #pragma interrupt_handler SIG_OUTPUT_COMPARE1A:iv_TIMER1_COMPA
00168 #endif
00169 NUTSIGNAL(SIG_OUTPUT_COMPARE1A, sig_OUTPUT_COMPARE1A)
00170
00171
00172