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