00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <avr/io.h>
00019 #include <avr/interrupt.h>
00020 #include <avr/signal.h>
00021
00022 #include "buffer.h"
00023 #include "uart.h"
00024
00025
00026
00027 volatile u08 uartReadyTx;
00028 volatile u08 uartBufferedTx;
00029
00030 cBuffer uartRxBuffer;
00031 cBuffer uartTxBuffer;
00032 unsigned short uartRxOverflow;
00033
00034 #ifndef UART_BUFFERS_EXTERNAL_RAM
00035
00036
00037 static char uartRxData[UART_RX_BUFFER_SIZE];
00038 static char uartTxData[UART_TX_BUFFER_SIZE];
00039 #endif
00040
00041 typedef void (*voidFuncPtru08)(unsigned char);
00042 volatile static voidFuncPtru08 UartRxFunc;
00043
00044
00045 void uartInit(void)
00046 {
00047
00048 uartInitBuffers();
00049
00050 UartRxFunc = 0;
00051
00052
00053 outb(UCR, BV(RXCIE)|BV(TXCIE)|BV(RXEN)|BV(TXEN));
00054
00055
00056 uartSetBaudRate(UART_DEFAULT_BAUD_RATE);
00057
00058 uartReadyTx = TRUE;
00059 uartBufferedTx = FALSE;
00060
00061 uartRxOverflow = 0;
00062
00063 sei();
00064 }
00065
00066
00067 void uartInitBuffers(void)
00068 {
00069 #ifndef UART_BUFFERS_EXTERNAL_RAM
00070
00071 bufferInit(&uartRxBuffer, uartRxData, UART_RX_BUFFER_SIZE);
00072
00073 bufferInit(&uartTxBuffer, uartTxData, UART_TX_BUFFER_SIZE);
00074 #else
00075
00076 bufferInit(&uartRxBuffer, (u08*) UART_RX_BUFFER_ADDR, UART_RX_BUFFER_SIZE);
00077
00078 bufferInit(&uartTxBuffer, (u08*) UART_TX_BUFFER_ADDR, UART_TX_BUFFER_SIZE);
00079 #endif
00080 }
00081
00082
00083 void uartSetRxHandler(void (*rx_func)(unsigned char c))
00084 {
00085
00086 UartRxFunc = rx_func;
00087 }
00088
00089
00090 void uartSetBaudRate(u32 baudrate)
00091 {
00092
00093 u16 bauddiv = ((F_CPU+(baudrate*8L))/(baudrate*16L)-1);
00094 outb(UBRRL, bauddiv);
00095 #ifdef UBRRH
00096 outb(UBRRH, bauddiv>>8);
00097 #endif
00098 }
00099
00100
00101 cBuffer* uartGetRxBuffer(void)
00102 {
00103
00104 return &uartRxBuffer;
00105 }
00106
00107
00108 cBuffer* uartGetTxBuffer(void)
00109 {
00110
00111 return &uartTxBuffer;
00112 }
00113
00114
00115 void uartSendByte(u08 txData)
00116 {
00117
00118 while(!uartReadyTx);
00119
00120 outp( txData, UDR );
00121
00122 uartReadyTx = FALSE;
00123 }
00124
00125
00126 u08 uartReceiveByte(u08* rxData)
00127 {
00128
00129 if(uartRxBuffer.size)
00130 {
00131
00132 if(uartRxBuffer.datalength)
00133 {
00134
00135 *rxData = bufferGetFromFront(&uartRxBuffer);
00136 return TRUE;
00137 }
00138 else
00139 {
00140
00141 return FALSE;
00142 }
00143 }
00144 else
00145 {
00146
00147 return FALSE;
00148 }
00149 }
00150
00151
00152 void uartFlushReceiveBuffer(void)
00153 {
00154
00155
00156
00157 uartRxBuffer.datalength = 0;
00158 }
00159
00160
00161 u08 uartReceiveBufferIsEmpty(void)
00162 {
00163 if(uartRxBuffer.datalength == 0)
00164 {
00165 return TRUE;
00166 }
00167 else
00168 {
00169 return FALSE;
00170 }
00171 }
00172
00173
00174 void uartAddToTxBuffer(u08 data)
00175 {
00176
00177 bufferAddToEnd(&uartTxBuffer, data);
00178 }
00179
00180
00181 void uartSendTxBuffer(void)
00182 {
00183
00184 uartBufferedTx = TRUE;
00185
00186 uartSendByte(bufferGetFromFront(&uartTxBuffer));
00187 }
00188
00189
00190 u08 uartSendBuffer(char *buffer, u16 nBytes)
00191 {
00192 register u08 first;
00193 register u16 i;
00194
00195 // check if there's space (and that we have any bytes to send at all)
00196 if((uartTxBuffer.datalength + nBytes < uartTxBuffer.size) && nBytes)
00197 {
00198 // grab first character
00199 first = *buffer++;
00200 // copy user buffer to uart transmit buffer
00201 for(i = 0; i < nBytes-1; i++)
00202 {
00203 // put data bytes at end of buffer
00204 bufferAddToEnd(&uartTxBuffer, *buffer++);
00205 }
00206
00207 // send the first byte to get things going by interrupts
00208 uartBufferedTx = TRUE;
00209 uartSendByte(first);
00210 // return success
00211 return TRUE;
00212 }
00213 else
00214 {
00215 // return failure
00216 return FALSE;
00217 }
00218 }
00219 */
00220
00221 UART_INTERRUPT_HANDLER(SIG_UART_TRANS)
00222 {
00223
00224 if(uartBufferedTx)
00225 {
00226
00227 if(uartTxBuffer.datalength)
00228 {
00229
00230 outp( bufferGetFromFront(&uartTxBuffer), UDR );
00231 }
00232 else
00233 {
00234
00235 uartBufferedTx = FALSE;
00236
00237 uartReadyTx = TRUE;
00238 }
00239 }
00240 else
00241 {
00242
00243
00244 uartReadyTx = TRUE;
00245 }
00246 }
00247
00248
00249 UART_INTERRUPT_HANDLER(SIG_UART_RECV)
00250 {
00251 u08 c;
00252
00253
00254 c = inp(UDR);
00255
00256
00257 if(UartRxFunc)
00258 {
00259
00260 UartRxFunc(c);
00261 }
00262 else
00263 {
00264
00265
00266
00267 if( !bufferAddToEnd(&uartRxBuffer, c) )
00268 {
00269
00270
00271 uartRxOverflow++;
00272 }
00273 }
00274 }