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
00080 #include <dev/irqreg.h>
00081
00086
00087 #if defined(SIG_UART1_TRANS) || defined(iv_USART1_TX) || defined(SIG_USART1_TRANS)
00088
00089 static int AvrUart1TxIrqCtl(int cmd, void *param);
00090
00091 IRQ_HANDLER sig_UART1_TRANS = {
00092 #ifdef NUT_PERFMON
00093 0,
00094 #endif
00095 NULL,
00096 NULL,
00097 AvrUart1TxIrqCtl
00098 };
00099
00115 static int AvrUart1TxIrqCtl(int cmd, void *param)
00116 {
00117 int rc = 0;
00118 u_int *ival = (u_int *) param;
00119 int enabled = bit_is_set(UCSR1B, TXCIE1);
00120
00121
00122 cbi(UCSR1B, TXCIE1);
00123
00124 switch (cmd) {
00125 case NUT_IRQCTL_INIT:
00126 enabled = 0;
00127 case NUT_IRQCTL_CLEAR:
00128
00129 sbi(UCSR1A, TXC1);
00130 break;
00131 case NUT_IRQCTL_STATUS:
00132 if (bit_is_set(UCSR1A, TXC1)) {
00133 *ival = 1;
00134 } else {
00135 *ival = 0;
00136 }
00137 if (enabled) {
00138 *ival |= 0x80;
00139 }
00140 break;
00141 case NUT_IRQCTL_ENABLE:
00142 enabled = 1;
00143 break;
00144 case NUT_IRQCTL_DISABLE:
00145 enabled = 0;
00146 break;
00147 case NUT_IRQCTL_GETPRIO:
00148 *ival = 16;
00149 break;
00150 #ifdef NUT_PERFMON
00151 case NUT_IRQCTL_GETCOUNT:
00152 *ival = (u_int) sig_UART1_TRANS.ir_count;
00153 sig_UART1_TRANS.ir_count = 0;
00154 break;
00155 #endif
00156 default:
00157 rc = -1;
00158 break;
00159 }
00160
00161
00162 if (enabled) {
00163 sbi(UCSR1B, TXCIE1);
00164 }
00165 return rc;
00166 }
00167
00171 #if defined(SIG_UART1_TRANS) || defined(iv_USART1_TX)
00172 #ifdef __IMAGECRAFT__
00173 #pragma interrupt_handler SIG_UART1_TRANS:iv_USART1_TX
00174 #endif
00175 NUTSIGNAL(SIG_UART1_TRANS, sig_UART1_TRANS)
00176 #elif defined(SIG_USART1_TRANS)
00177 NUTSIGNAL(SIG_USART1_TRANS, sig_UART1_TRANS)
00178 #endif
00179
00180 #endif
00181