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
00077 #include <dev/irqreg.h>
00078
00083
00084 #if defined(SIG_UART1_DATA) || defined(iv_USART1_UDRE) || defined(SIG_USART1_DATA)
00085
00086 static int AvrUart1TxDataIrqCtl(int cmd, void *param);
00087
00088 IRQ_HANDLER sig_UART1_DATA = {
00089 #ifdef NUT_PERFMON
00090 0,
00091 #endif
00092 NULL,
00093 NULL,
00094 AvrUart1TxDataIrqCtl
00095 };
00096
00112 static int AvrUart1TxDataIrqCtl(int cmd, void *param)
00113 {
00114 int rc = 0;
00115 u_int *ival = (u_int *) param;
00116 int enabled = bit_is_set(UCSR1B, UDRIE1);
00117
00118
00119 cbi(UCSR1B, UDRIE1);
00120
00121 switch (cmd) {
00122 case NUT_IRQCTL_INIT:
00123 enabled = 0;
00124 break;
00125 case NUT_IRQCTL_STATUS:
00126 if (bit_is_set(UCSR1A, UDRE1)) {
00127 *ival = 1;
00128 } else {
00129 *ival = 0;
00130 }
00131 if (enabled) {
00132 *ival |= 0x80;
00133 }
00134 break;
00135 case NUT_IRQCTL_ENABLE:
00136 enabled = 1;
00137 break;
00138 case NUT_IRQCTL_DISABLE:
00139 enabled = 0;
00140 break;
00141 case NUT_IRQCTL_GETPRIO:
00142 *ival = 16;
00143 break;
00144 #ifdef NUT_PERFMON
00145 case NUT_IRQCTL_GETCOUNT:
00146 *ival = (u_int) sig_UART1_DATA.ir_count;
00147 sig_UART1_DATA.ir_count = 0;
00148 break;
00149 #endif
00150 default:
00151 rc = -1;
00152 break;
00153 }
00154
00155
00156 if (enabled) {
00157 sbi(UCSR1B, UDRIE1);
00158 }
00159 return rc;
00160 }
00161
00165 #if defined(SIG_UART1_DATA) || defined(iv_USART1_UDRE)
00166 #ifdef __IMAGECRAFT__
00167 #pragma interrupt_handler SIG_UART1_DATA:iv_USART1_UDRE
00168 #endif
00169 NUTSIGNAL(SIG_UART1_DATA, sig_UART1_DATA)
00170 #elif defined(SIG_USART1_DATA)
00171 NUTSIGNAL(SIG_USART1_DATA, sig_UART1_DATA)
00172 #endif
00173
00174 #endif
00175