00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <aversive.h>
00025 #include <aversive/list.h>
00026
00027 #include <uart.h>
00028 #include <uart_defs.h>
00029 #include <uart_private.h>
00030
00031 struct cirbuf g_tx_fifo[UART_HW_NUM];
00032 struct cirbuf g_rx_fifo[UART_HW_NUM];
00033
00034
00035 event *rx_event[UART_HW_NUM];
00036 event *tx_event[UART_HW_NUM];
00037
00038 const struct regs uart_regs[UART_HW_NUM] = {
00039 #ifdef UDR0
00040 {
00041 .udr = &UDR0,
00042 .ucsra = &UCSR0A,
00043 .ucsrb = &UCSR0B,
00044 .ucsrc = &UCSR0C,
00045 .ubrrl = &UBRR0L,
00046 .ubrrh = &UBRR0H,
00047 },
00048 #endif
00049 #ifdef UDR1
00050 {
00051 .udr = &UDR1,
00052 .ucsra = &UCSR1A,
00053 .ucsrb = &UCSR1B,
00054 .ucsrc = &UCSR1C,
00055 .ubrrl = &UBRR1L,
00056 .ubrrh = &UBRR1H,
00057 },
00058 #endif
00059 #ifdef UDR2
00060 {
00061 .udr = &UDR2,
00062 .ucsra = &UCSR2A,
00063 .ucsrb = &UCSR2B,
00064 .ucsrc = &UCSR2C,
00065 .ubrrl = &UBRR2L,
00066 .ubrrh = &UBRR2H,
00067 },
00068 #endif
00069 #ifdef UDR3
00070 {
00071 .udr = &UDR3,
00072 .ucsra = &UCSR3A,
00073 .ucsrb = &UCSR3B,
00074 .ucsrc = &UCSR3C,
00075 .ubrrl = &UBRR3L,
00076 .ubrrh = &UBRR3H,
00077 },
00078 #endif
00079 };
00080
00086 #ifdef UART0_COMPILE
00087 #ifndef SIG_UART0_DATA
00088 #define SIG_UART0_DATA SIG_USART0_DATA
00089 #endif
00090 SIGNAL(SIG_UART0_DATA)
00091 {
00092 uart_send_next_char(0);
00093 }
00094 #endif
00095 #ifdef UART1_COMPILE
00096 #ifndef SIG_UART1_DATA
00097 #define SIG_UART1_DATA SIG_USART1_DATA
00098 #endif
00099 SIGNAL(SIG_UART1_DATA)
00100 {
00101 uart_send_next_char(1);
00102 }
00103 #endif
00104 #ifdef UART2_COMPILE
00105 #ifndef SIG_UART2_DATA
00106 #define SIG_UART2_DATA SIG_USART2_DATA
00107 #endif
00108 SIGNAL(SIG_UART2_DATA)
00109 {
00110 uart_send_next_char(2);
00111 }
00112 #endif
00113 #ifdef UART3_COMPILE
00114 #ifndef SIG_UART3_DATA
00115 #define SIG_UART3_DATA SIG_USART3_DATA
00116 #endif
00117 SIGNAL(SIG_UART3_DATA)
00118 {
00119 uart_send_next_char(3);
00120 }
00121 #endif
00122
00123 static void uart_recv_next_char(uint8_t num);
00124
00129 #ifdef UART0_COMPILE
00130 #ifndef SIG_UART0_RECV
00131 #define SIG_UART0_RECV SIG_USART0_RECV
00132 #endif
00133 SIGNAL(SIG_UART0_RECV)
00134 {
00135 uart_recv_next_char(0);
00136 }
00137 #endif
00138 #ifdef UART1_COMPILE
00139 #ifndef SIG_UART1_RECV
00140 #define SIG_UART1_RECV SIG_USART1_RECV
00141 #endif
00142 SIGNAL(SIG_UART1_RECV)
00143 {
00144 uart_recv_next_char(1);
00145 }
00146 #endif
00147 #ifdef UART2_COMPILE
00148 #ifndef SIG_UART2_RECV
00149 #define SIG_UART2_RECV SIG_USART2_RECV
00150 #endif
00151 SIGNAL(SIG_UART2_RECV)
00152 {
00153 uart_recv_next_char(2);
00154 }
00155 #endif
00156 #ifdef UART3_COMPILE
00157 #ifndef SIG_UART3_RECV
00158 #define SIG_UART3_RECV SIG_USART3_RECV
00159 #endif
00160 SIGNAL(SIG_UART3_RECV)
00161 {
00162 uart_recv_next_char(3);
00163 }
00164 #endif
00165
00166
00171 void uart_send_next_char(uint8_t num)
00172 {
00173 #ifdef CONFIG_MODULE_UART_9BITS
00174 if (uart_getconf_nbits(num) == 9) {
00175 int elt = 0;
00176
00177
00178 if (CIRBUF_GET_LEN(&g_tx_fifo[num]) < 2) {
00179 cbi(*uart_regs[num].ucsrb, UDRIE);
00180 return;
00181 }
00182
00183 cirbuf_get_buf_tail(&g_tx_fifo[num], (char *)&elt, 2);
00184 cirbuf_del_buf_tail(&g_tx_fifo[num], 2);
00185
00186 uart_set_udr_9bits(num, elt);
00187 sbi(*uart_regs[num].ucsrb, UDRIE);
00188 }
00189 else
00190 #endif
00191 {
00192 char elt = 0;
00193
00194 if (CIRBUF_IS_EMPTY(&g_tx_fifo[num])) {
00195 cbi(*uart_regs[num].ucsrb, UDRIE);
00196 return;
00197 }
00198
00199 elt = cirbuf_get_tail(&g_tx_fifo[num]);
00200 cirbuf_del_tail(&g_tx_fifo[num]);
00201 uart_set_udr(num, elt);
00202 sbi(*uart_regs[num].ucsrb, UDRIE);
00203 }
00204 }
00205
00209 static void uart_recv_next_char(uint8_t num)
00210 {
00211 #ifdef CONFIG_MODULE_UART_9BITS
00212 if (uart_getconf_nbits() == 9) {
00213 int elt = 0;
00214
00215 elt = uart_get_udr_9bits(num);
00216 if (CIRBUF_GET_FREELEN(&g_rx_fifo[num]) >= 2) {
00217 cirbuf_add_buf_head(&g_rx_fifo[num], (char *)&elt, 2);
00218 }
00219
00220 if (rx_event[num])
00221 ((event_9bits *)rx_event[num])(elt);
00222 }
00223 else
00224 #endif
00225 {
00226 char elt = 0;
00227
00228 elt = uart_get_udr(num);
00229 if (!CIRBUF_IS_FULL(&g_rx_fifo[num])) {
00230 cirbuf_add_head(&g_rx_fifo[num], elt);
00231 }
00232
00233 if (rx_event[num])
00234 rx_event[num](elt);
00235 }
00236 }
00237
00238
00239 void uart_init(void)
00240 {
00241 #if (defined UDR0) && (defined UART0_COMPILE)
00242 uart_setconf(0, NULL);
00243 #endif
00244
00245 #if (defined UDR1) && (defined UART1_COMPILE)
00246 uart_setconf(1, NULL);
00247 #endif
00248
00249 #if (defined UDR2) && (defined UART2_COMPILE)
00250 uart_setconf(2, NULL);
00251 #endif
00252
00253 #if (defined UDR3) && (defined UART3_COMPILE)
00254 uart_setconf(3, NULL);
00255 #endif
00256 }