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