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 AvrUart0TxDataIrqCtl(int cmd, void *param);
00091
00092 IRQ_HANDLER sig_UART0_DATA = {
00093 #ifdef NUT_PERFMON
00094 0,
00095 #endif
00096 NULL,
00097 NULL,
00098 AvrUart0TxDataIrqCtl
00099 };
00100
00116 static int AvrUart0TxDataIrqCtl(int cmd, void *param)
00117 {
00118 int rc = 0;
00119 u_int *ival = (u_int *) param;
00120 int enabled = bit_is_set(UCR, UDRIE);
00121
00122
00123 cbi(UCR, UDRIE);
00124
00125 switch (cmd) {
00126 case NUT_IRQCTL_INIT:
00127 enabled = 0;
00128 break;
00129 case NUT_IRQCTL_STATUS:
00130 if (bit_is_set(USR, UDRE)) {
00131 *ival = 1;
00132 } else {
00133 *ival = 0;
00134 }
00135 if (enabled) {
00136 *ival |= 0x80;
00137 }
00138 break;
00139 case NUT_IRQCTL_ENABLE:
00140 enabled = 1;
00141 break;
00142 case NUT_IRQCTL_DISABLE:
00143 enabled = 0;
00144 break;
00145 case NUT_IRQCTL_GETPRIO:
00146 *ival = 16;
00147 break;
00148 #ifdef NUT_PERFMON
00149 case NUT_IRQCTL_GETCOUNT:
00150 *ival = (u_int) sig_UART0_DATA.ir_count;
00151 sig_UART0_DATA.ir_count = 0;
00152 break;
00153 #endif
00154 default:
00155 rc = -1;
00156 break;
00157 }
00158
00159
00160 if (enabled) {
00161 sbi(UCR, UDRIE);
00162 }
00163 return rc;
00164 }
00165
00166 #if defined(SIG_UART0_DATA) || defined(iv_USART0_UDRE)
00167
00171 #ifdef __IMAGECRAFT__
00172 #pragma interrupt_handler SIG_UART0_DATA:iv_USART0_UDRE
00173 #endif
00174 NUTSIGNAL(SIG_UART0_DATA, sig_UART0_DATA)
00175 #elif defined(SIG_USART0_DATA)
00176
00177 NUTSIGNAL(SIG_USART0_DATA, sig_USART0_DATA)
00178
00179 #else
00180
00184 #ifdef __IMAGECRAFT__
00185 #pragma interrupt_handler SIG_UART_DATA:iv_UART_UDRE
00186 #endif
00187 NUTSIGNAL(SIG_UART_DATA, sig_UART0_DATA)
00188 #endif
00189