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 AvrUart0TxDataIrqCtl(int cmd, void *param);
00098
00099 IRQ_HANDLER sig_UART0_DATA = {
00100 #ifdef NUT_PERFMON
00101 0,
00102 #endif
00103 NULL,
00104 NULL,
00105 AvrUart0TxDataIrqCtl
00106 };
00107
00123 static int AvrUart0TxDataIrqCtl(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, UDRIE);
00128
00129
00130 cbi(UCR, UDRIE);
00131
00132 switch (cmd) {
00133 case NUT_IRQCTL_INIT:
00134 enabled = 0;
00135 break;
00136 case NUT_IRQCTL_STATUS:
00137 if (bit_is_set(USR, UDRE)) {
00138 *ival = 1;
00139 } else {
00140 *ival = 0;
00141 }
00142 if (enabled) {
00143 *ival |= 0x80;
00144 }
00145 break;
00146 case NUT_IRQCTL_ENABLE:
00147 enabled = 1;
00148 break;
00149 case NUT_IRQCTL_DISABLE:
00150 enabled = 0;
00151 break;
00152 case NUT_IRQCTL_GETPRIO:
00153 *ival = 16;
00154 break;
00155 #ifdef NUT_PERFMON
00156 case NUT_IRQCTL_GETCOUNT:
00157 *ival = (unsigned int) sig_UART0_DATA.ir_count;
00158 sig_UART0_DATA.ir_count = 0;
00159 break;
00160 #endif
00161 default:
00162 rc = -1;
00163 break;
00164 }
00165
00166
00167 if (enabled) {
00168 sbi(UCR, UDRIE);
00169 }
00170 return rc;
00171 }
00172
00173 #if defined(SIG_UART0_DATA) || defined(iv_USART0_UDRE)
00174
00178 #ifdef __IMAGECRAFT__
00179 #pragma interrupt_handler SIG_UART0_DATA:iv_USART0_UDRE
00180 #endif
00181 NUTSIGNAL(SIG_UART0_DATA, sig_UART0_DATA)
00182 #elif defined(SIG_USART0_DATA)
00183
00184 NUTSIGNAL(SIG_USART0_DATA, sig_USART0_DATA)
00185
00186 #else
00187
00191 #ifdef __IMAGECRAFT__
00192 #pragma interrupt_handler SIG_UART_DATA:iv_UART_UDRE
00193 #endif
00194 NUTSIGNAL(SIG_UART_DATA, sig_UART0_DATA)
00195 #endif
00196