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
00083 #include <dev/irqreg.h>
00084
00089
00090 static int AvrUart0RxIrqCtl(int cmd, void *param);
00091
00092 IRQ_HANDLER sig_UART0_RECV = {
00093 #ifdef NUT_PERFMON
00094 0,
00095 #endif
00096 NULL,
00097 NULL,
00098 AvrUart0RxIrqCtl
00099 };
00100
00116 static int AvrUart0RxIrqCtl(int cmd, void *param)
00117 {
00118 int rc = 0;
00119 u_int *ival = (u_int *) param;
00120 int enabled = bit_is_set(UCR, RXCIE);
00121 u_char bval;
00122
00123
00124 cbi(UCR, RXCIE);
00125
00126 switch (cmd) {
00127 case NUT_IRQCTL_INIT:
00128 enabled = 0;
00129 case NUT_IRQCTL_CLEAR:
00130
00131 bval = inb(UDR);
00132 bval = inb(UDR);
00133 break;
00134 case NUT_IRQCTL_STATUS:
00135 if (bit_is_set(USR, RXC)) {
00136 *ival = 1;
00137 } else {
00138 *ival = 0;
00139 }
00140 if (enabled) {
00141 *ival |= 0x80;
00142 }
00143 break;
00144 case NUT_IRQCTL_ENABLE:
00145 enabled = 1;
00146 break;
00147 case NUT_IRQCTL_DISABLE:
00148 enabled = 0;
00149 break;
00150 case NUT_IRQCTL_GETPRIO:
00151 *ival = 16;
00152 break;
00153 #ifdef NUT_PERFMON
00154 case NUT_IRQCTL_GETCOUNT:
00155 *ival = (u_int) sig_UART0_RECV.ir_count;
00156 sig_UART0_RECV.ir_count = 0;
00157 break;
00158 #endif
00159 default:
00160 rc = -1;
00161 break;
00162 }
00163
00164
00165 if (enabled) {
00166 sbi(UCR, RXCIE);
00167 }
00168 return rc;
00169 }
00170
00171 #if defined(SIG_UART0_RECV) || defined(iv_USART0_RX)
00172
00176 #ifdef __IMAGECRAFT__
00177 #pragma interrupt_handler SIG_UART0_RECV:iv_USART0_RX
00178 #endif
00179 NUTSIGNAL(SIG_UART0_RECV, sig_UART0_RECV)
00180 #elif defined(SIG_USART0_RECV)
00181
00182 NUTSIGNAL(SIG_USART0_RECV, sig_UART0_RECV)
00183
00184 #else
00185
00189 #ifdef __IMAGECRAFT__
00190 #pragma interrupt_handler SIG_UART_RECV:iv_UART_RX
00191 #endif
00192 NUTSIGNAL(SIG_UART_RECV, sig_UART0_RECV)
00193 #endif
00194