00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <avr/io.h>
00022 #include <avr/interrupt.h>
00023
00024 #include "buffer.h"
00025 #include "uart2.h"
00026
00027
00028
00029 volatile u08 uartReadyTx[2];
00030 volatile u08 uartBufferedTx[2];
00031
00032 cBuffer uartRxBuffer[2];
00033 cBuffer uartTxBuffer[2];
00034 unsigned short uartRxOverflow[2];
00035 #ifndef UART_BUFFER_EXTERNAL_RAM
00036
00037
00038 static char uart0RxData[UART0_RX_BUFFER_SIZE];
00039 static char uart0TxData[UART0_TX_BUFFER_SIZE];
00040 static char uart1RxData[UART1_RX_BUFFER_SIZE];
00041 static char uart1TxData[UART1_TX_BUFFER_SIZE];
00042 #endif
00043
00044 typedef void (*voidFuncPtru08)(unsigned char);
00045 volatile static voidFuncPtru08 UartRxFunc[2];
00046
00047 void uartInit(void)
00048 {
00049
00050 uart0Init();
00051 uart1Init();
00052 }
00053
00054 void uart0Init(void)
00055 {
00056
00057 uart0InitBuffers();
00058
00059 UartRxFunc[0] = 0;
00060
00061 outb(UCSR0B, BV(RXCIE)|BV(TXCIE)|BV(RXEN)|BV(TXEN));
00062
00063 uartSetBaudRate(0, UART0_DEFAULT_BAUD_RATE);
00064
00065 uartReadyTx[0] = TRUE;
00066 uartBufferedTx[0] = FALSE;
00067
00068 uartRxOverflow[0] = 0;
00069
00070 sei();
00071 }
00072
00073 void uart1Init(void)
00074 {
00075
00076 uart1InitBuffers();
00077
00078 UartRxFunc[1] = 0;
00079
00080 outb(UCSR1B, BV(RXCIE)|BV(TXCIE)|BV(RXEN)|BV(TXEN));
00081
00082 uartSetBaudRate(1, UART1_DEFAULT_BAUD_RATE);
00083
00084 uartReadyTx[1] = TRUE;
00085 uartBufferedTx[1] = FALSE;
00086
00087 uartRxOverflow[1] = 0;
00088
00089 sei();
00090 }
00091
00092 void uart0InitBuffers(void)
00093 {
00094 #ifndef UART_BUFFER_EXTERNAL_RAM
00095
00096 bufferInit(&uartRxBuffer[0], uart0RxData, UART0_RX_BUFFER_SIZE);
00097 bufferInit(&uartTxBuffer[0], uart0TxData, UART0_TX_BUFFER_SIZE);
00098 #else
00099
00100 bufferInit(&uartRxBuffer[0], (u08*) UART0_RX_BUFFER_ADDR, UART0_RX_BUFFER_SIZE);
00101 bufferInit(&uartTxBuffer[0], (u08*) UART0_TX_BUFFER_ADDR, UART0_TX_BUFFER_SIZE);
00102 #endif
00103 }
00104
00105 void uart1InitBuffers(void)
00106 {
00107 #ifndef UART_BUFFER_EXTERNAL_RAM
00108
00109 bufferInit(&uartRxBuffer[1], uart1RxData, UART1_RX_BUFFER_SIZE);
00110 bufferInit(&uartTxBuffer[1], uart1TxData, UART1_TX_BUFFER_SIZE);
00111 #else
00112
00113 bufferInit(&uartRxBuffer[1], (u08*) UART1_RX_BUFFER_ADDR, UART1_RX_BUFFER_SIZE);
00114 bufferInit(&uartTxBuffer[1], (u08*) UART1_TX_BUFFER_ADDR, UART1_TX_BUFFER_SIZE);
00115 #endif
00116 }
00117
00118 void uartSetRxHandler(u08 nUart, void (*rx_func)(unsigned char c))
00119 {
00120
00121 if(nUart < 2)
00122 {
00123
00124 UartRxFunc[nUart] = rx_func;
00125 }
00126 }
00127
00128 void uartSetBaudRate(u08 nUart, u32 baudrate)
00129 {
00130
00131 u16 bauddiv = ((F_CPU+(baudrate*8L))/(baudrate*16L)-1);
00132 if(nUart)
00133 {
00134 outb(UBRR1L, bauddiv);
00135 #ifdef UBRR1H
00136 outb(UBRR1H, bauddiv>>8);
00137 #endif
00138 }
00139 else
00140 {
00141 outb(UBRR0L, bauddiv);
00142 #ifdef UBRR0H
00143 outb(UBRR0H, bauddiv>>8);
00144 #endif
00145 }
00146 }
00147
00148 cBuffer* uartGetRxBuffer(u08 nUart)
00149 {
00150
00151 return &uartRxBuffer[nUart];
00152 }
00153
00154 cBuffer* uartGetTxBuffer(u08 nUart)
00155 {
00156
00157 return &uartTxBuffer[nUart];
00158 }
00159
00160 void uartSendByte(u08 nUart, u08 txData)
00161 {
00162
00163
00164
00165 if(nUart)
00166 {
00167 while(!(UCSR1A & (1<<UDRE)));
00168 outb(UDR1, txData);
00169 }
00170 else
00171 {
00172 while(!(UCSR0A & (1<<UDRE)));
00173 outb(UDR0, txData);
00174 }
00175
00176 uartReadyTx[nUart] = FALSE;
00177 }
00178
00179 void uart0SendByte(u08 data)
00180 {
00181
00182 uartSendByte(0, data);
00183 }
00184
00185 void uart1SendByte(u08 data)
00186 {
00187
00188 uartSendByte(1, data);
00189 }
00190
00191 int uart0GetByte(void)
00192 {
00193
00194 u08 c;
00195 if(uartReceiveByte(0,&c))
00196 return c;
00197 else
00198 return -1;
00199 }
00200
00201 int uart1GetByte(void)
00202 {
00203
00204 u08 c;
00205 if(uartReceiveByte(1,&c))
00206 return c;
00207 else
00208 return -1;
00209 }
00210
00211
00212 u08 uartReceiveByte(u08 nUart, u08* rxData)
00213 {
00214
00215 if(uartRxBuffer[nUart].size)
00216 {
00217
00218 if(uartRxBuffer[nUart].datalength)
00219 {
00220
00221 *rxData = bufferGetFromFront(&uartRxBuffer[nUart]);
00222 return TRUE;
00223 }
00224 else
00225 return FALSE;
00226 }
00227 else
00228 return FALSE;
00229 }
00230
00231 void uartFlushReceiveBuffer(u08 nUart)
00232 {
00233
00234 bufferFlush(&uartRxBuffer[nUart]);
00235 }
00236
00237 u08 uartReceiveBufferIsEmpty(u08 nUart)
00238 {
00239 return (uartRxBuffer[nUart].datalength == 0);
00240 }
00241
00242 void uartAddToTxBuffer(u08 nUart, u08 data)
00243 {
00244
00245 bufferAddToEnd(&uartTxBuffer[nUart], data);
00246 }
00247
00248 void uart0AddToTxBuffer(u08 data)
00249 {
00250 uartAddToTxBuffer(0,data);
00251 }
00252
00253 void uart1AddToTxBuffer(u08 data)
00254 {
00255 uartAddToTxBuffer(1,data);
00256 }
00257
00258 void uartSendTxBuffer(u08 nUart)
00259 {
00260
00261 uartBufferedTx[nUart] = TRUE;
00262
00263 uartSendByte(nUart, bufferGetFromFront(&uartTxBuffer[nUart]));
00264 }
00265
00266 u08 uartSendBuffer(u08 nUart, char *buffer, u16 nBytes)
00267 {
00268 register u08 first;
00269 register u16 i;
00270
00271
00272 if((uartTxBuffer[nUart].datalength + nBytes < uartTxBuffer[nUart].size) && nBytes)
00273 {
00274
00275 first = *buffer++;
00276
00277 for(i = 0; i < nBytes-1; i++)
00278 {
00279
00280 bufferAddToEnd(&uartTxBuffer[nUart], *buffer++);
00281 }
00282
00283
00284 uartBufferedTx[nUart] = TRUE;
00285 uartSendByte(nUart, first);
00286
00287 return TRUE;
00288 }
00289 else
00290 {
00291
00292 return FALSE;
00293 }
00294 }
00295
00296
00297 void uartTransmitService(u08 nUart)
00298 {
00299
00300 if(uartBufferedTx[nUart])
00301 {
00302
00303 if(uartTxBuffer[nUart].datalength)
00304 {
00305
00306 if(nUart)
00307 outb(UDR1, bufferGetFromFront(&uartTxBuffer[1]) );
00308 else
00309 outb(UDR0, bufferGetFromFront(&uartTxBuffer[0]) );
00310 }
00311 else
00312 {
00313
00314 uartBufferedTx[nUart] = FALSE;
00315
00316 uartReadyTx[nUart] = TRUE;
00317 }
00318 }
00319 else
00320 {
00321
00322
00323 uartReadyTx[nUart] = TRUE;
00324 }
00325 }
00326
00327
00328 void uartReceiveService(u08 nUart)
00329 {
00330 u08 c;
00331
00332 if(nUart)
00333 c = inb(UDR1);
00334 else
00335 c = inb(UDR0);
00336
00337
00338 if(UartRxFunc[nUart])
00339 {
00340
00341 UartRxFunc[nUart](c);
00342 }
00343 else
00344 {
00345
00346
00347
00348 if( !bufferAddToEnd(&uartRxBuffer[nUart], c) )
00349 {
00350
00351
00352 uartRxOverflow[nUart]++;
00353 }
00354 }
00355 }
00356
00357 UART_INTERRUPT_HANDLER(SIG_UART0_TRANS)
00358 {
00359
00360 uartTransmitService(0);
00361 }
00362
00363 UART_INTERRUPT_HANDLER(SIG_UART1_TRANS)
00364 {
00365
00366 uartTransmitService(1);
00367 }
00368
00369 UART_INTERRUPT_HANDLER(SIG_UART0_RECV)
00370 {
00371
00372 uartReceiveService(0);
00373 }
00374
00375 UART_INTERRUPT_HANDLER(SIG_UART1_RECV)
00376 {
00377
00378 uartReceiveService(1);
00379 }