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 #if defined(SIG_UART1_RECV) || defined(iv_USART1_RX) || defined(SIG_USART1_RECV)
00085
00086 static int AvrUart1RxIrqCtl(int cmd, void *param);
00087
00088 IRQ_HANDLER sig_UART1_RECV = {
00089 #ifdef NUT_PERFMON
00090 0,
00091 #endif
00092 NULL,
00093 NULL,
00094 AvrUart1RxIrqCtl
00095 };
00096
00112 static int AvrUart1RxIrqCtl(int cmd, void *param)
00113 {
00114 int rc = 0;
00115 u_int *ival = (u_int *) param;
00116 int enabled = bit_is_set(UCSR1B, RXCIE1);
00117 u_char bval;
00118
00119
00120 cbi(UCSR1B, RXCIE1);
00121
00122 switch (cmd) {
00123 case NUT_IRQCTL_INIT:
00124 enabled = 0;
00125 case NUT_IRQCTL_CLEAR:
00126
00127 bval = inb(UDR1);
00128 bval = inb(UDR1);
00129 break;
00130 case NUT_IRQCTL_STATUS:
00131 if (bit_is_set(UCSR1A, RXC1)) {
00132 *ival = 1;
00133 } else {
00134 *ival = 0;
00135 }
00136 if (enabled) {
00137 *ival |= 0x80;
00138 }
00139 break;
00140 case NUT_IRQCTL_ENABLE:
00141 enabled = 1;
00142 break;
00143 case NUT_IRQCTL_DISABLE:
00144 enabled = 0;
00145 break;
00146 case NUT_IRQCTL_GETPRIO:
00147 *ival = 16;
00148 break;
00149 #ifdef NUT_PERFMON
00150 case NUT_IRQCTL_GETCOUNT:
00151 *ival = (u_int) sig_UART1_RECV.ir_count;
00152 sig_UART1_RECV.ir_count = 0;
00153 break;
00154 #endif
00155 default:
00156 rc = -1;
00157 break;
00158 }
00159
00160
00161 if (enabled) {
00162 sbi(UCSR1B, RXCIE1);
00163 }
00164 return rc;
00165 }
00166
00170 #if defined(SIG_UART1_RECV) || defined(iv_USART1_RX)
00171 #ifdef __IMAGECRAFT__
00172 #pragma interrupt_handler SIG_UART1_RECV:iv_USART1_RX
00173 #endif
00174 NUTSIGNAL(SIG_UART1_RECV, sig_UART1_RECV)
00175 #elif defined(SIG_USART1_RECV)
00176 NUTSIGNAL(SIG_USART1_RECV, sig_UART1_RECV)
00177 #endif
00178
00179 #endif
00180