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 #if defined(SIG_UART1_TRANS) || defined(iv_USART1_TX) || defined(SIG_USART1_TRANS)
00091
00092 static int AvrUart1TxIrqCtl(int cmd, void *param);
00093
00094 IRQ_HANDLER sig_UART1_TRANS = {
00095 #ifdef NUT_PERFMON
00096 0,
00097 #endif
00098 NULL,
00099 NULL,
00100 AvrUart1TxIrqCtl
00101 };
00102
00118 static int AvrUart1TxIrqCtl(int cmd, void *param)
00119 {
00120 int rc = 0;
00121 u_int *ival = (u_int *) param;
00122 int_fast8_t enabled = bit_is_set(UCSR1B, TXCIE1);
00123
00124
00125 cbi(UCSR1B, TXCIE1);
00126
00127 switch (cmd) {
00128 case NUT_IRQCTL_INIT:
00129 enabled = 0;
00130 case NUT_IRQCTL_CLEAR:
00131
00132 sbi(UCSR1A, TXC1);
00133 break;
00134 case NUT_IRQCTL_STATUS:
00135 if (bit_is_set(UCSR1A, TXC1)) {
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_UART1_TRANS.ir_count;
00156 sig_UART1_TRANS.ir_count = 0;
00157 break;
00158 #endif
00159 default:
00160 rc = -1;
00161 break;
00162 }
00163
00164
00165 if (enabled) {
00166 sbi(UCSR1B, TXCIE1);
00167 }
00168 return rc;
00169 }
00170
00174 #if defined(SIG_UART1_TRANS) || defined(iv_USART1_TX)
00175 #ifdef __IMAGECRAFT__
00176 #pragma interrupt_handler SIG_UART1_TRANS:iv_USART1_TX
00177 #endif
00178 NUTSIGNAL(SIG_UART1_TRANS, sig_UART1_TRANS)
00179 #elif defined(SIG_USART1_TRANS)
00180 NUTSIGNAL(SIG_USART1_TRANS, sig_UART1_TRANS)
00181 #endif
00182
00183 #endif
00184