Go to the documentation of this file.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
00090 #include <dev/irqreg.h>
00091
00096
00097 static int AvrUart0TxIrqCtl(int cmd, void *param);
00098
00099 IRQ_HANDLER sig_UART0_TRANS = {
00100 #ifdef NUT_PERFMON
00101 0,
00102 #endif
00103 NULL,
00104 NULL,
00105 AvrUart0TxIrqCtl
00106 };
00107
00123 static int AvrUart0TxIrqCtl(int cmd, void *param)
00124 {
00125 int rc = 0;
00126 unsigned int *ival = (unsigned int *) param;
00127 int_fast8_t enabled = bit_is_set(UCR, TXCIE);
00128
00129
00130 cbi(UCR, TXCIE);
00131
00132 switch (cmd) {
00133 case NUT_IRQCTL_INIT:
00134 enabled = 0;
00135 case NUT_IRQCTL_CLEAR:
00136
00137 sbi(USR, TXC);
00138 break;
00139 case NUT_IRQCTL_STATUS:
00140 if (bit_is_set(USR, TXC)) {
00141 *ival = 1;
00142 } else {
00143 *ival = 0;
00144 }
00145 if (enabled) {
00146 *ival |= 0x80;
00147 }
00148 break;
00149 case NUT_IRQCTL_ENABLE:
00150 enabled = 1;
00151 break;
00152 case NUT_IRQCTL_DISABLE:
00153 enabled = 0;
00154 break;
00155 case NUT_IRQCTL_GETPRIO:
00156 *ival = 16;
00157 break;
00158 #ifdef NUT_PERFMON
00159 case NUT_IRQCTL_GETCOUNT:
00160 *ival = (unsigned int) sig_UART0_TRANS.ir_count;
00161 sig_UART0_TRANS.ir_count = 0;
00162 break;
00163 #endif
00164 default:
00165 rc = -1;
00166 break;
00167 }
00168
00169
00170 if (enabled) {
00171 sbi(UCR, TXCIE);
00172 }
00173 return rc;
00174 }
00175
00176 #if defined(SIG_UART0_TRANS) || defined(iv_USART0_TX)
00177
00181 #ifdef __IMAGECRAFT__
00182 #pragma interrupt_handler SIG_UART0_TRANS:iv_USART0_TX
00183 #endif
00184 NUTSIGNAL(SIG_UART0_TRANS, sig_UART0_TRANS)
00185 #elif defined(SIG_USART0_TRANS)
00186
00187 NUTSIGNAL(SIG_USART0_TRANS, sig_UART0_TRANS)
00188
00189 #else
00190
00194 #ifdef __IMAGECRAFT__
00195 #pragma interrupt_handler SIG_UART_TRANS:iv_UART_TX
00196 #endif
00197 NUTSIGNAL(SIG_UART_TRANS, sig_UART0_TRANS)
00198 #endif
00199