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
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 #include <cfg/os.h>
00087 #include <cfg/arch/avr.h>
00088
00089 #include <string.h>
00090
00091 #include <sys/atom.h>
00092 #include <sys/event.h>
00093 #include <sys/timer.h>
00094
00095 #include <dev/irqreg.h>
00096 #include <dev/usartavr.h>
00097
00103 #ifdef UART1_RTS_BIT
00104
00105 #if (UART1_RTS_AVRPORT == AVRPORTB)
00106 #define UART_RTS_PORT PORTB
00107 #define UART_RTS_DDR DDRB
00108
00109 #elif (UART1_RTS_AVRPORT == AVRPORTD)
00110 #define UART_RTS_PORT PORTD
00111 #define UART_RTS_DDR DDRD
00112
00113 #elif (UART1_RTS_AVRPORT == AVRPORTE)
00114 #define UART_RTS_PORT PORTE
00115 #define UART_RTS_DDR DDRE
00116
00117 #elif (UART1_RTS_AVRPORT == AVRPORTF)
00118 #define UART_RTS_PORT PORTF
00119 #define UART_RTS_DDR DDRF
00120
00121 #endif
00122 #define UART_RTS_BIT UART1_RTS_BIT
00123
00124 #endif
00125
00131 #ifdef UART1_HDX_BIT
00132
00133 #if (UART1_HDX_AVRPORT == AVRPORTB)
00134 #define UART_HDX_PORT PORTB
00135 #define UART_HDX_DDR DDRB
00136
00137 #elif (UART1_HDX_AVRPORT == AVRPORTD)
00138 #define UART_HDX_PORT PORTD
00139 #define UART_HDX_DDR DDRD
00140
00141 #elif (UART1_HDX_AVRPORT == AVRPORTE)
00142 #define UART_HDX_PORT PORTE
00143 #define UART_HDX_DDR DDRE
00144
00145 #elif (UART1_HDX_AVRPORT == AVRPORTF)
00146 #define UART_HDX_PORT PORTF
00147 #define UART_HDX_DDR DDRF
00148
00149 #elif (UART0_HDX_AVRPORT == AVRPORTG)
00150 #define UART_HDX_PORT PORTG
00151 #define UART_HDX_DDR DDRG
00152
00153 #endif
00154 #define UART_HDX_BIT UART1_HDX_BIT
00155
00156 #endif
00157
00158
00159 #ifdef __AVR_ENHANCED__
00160
00161
00162
00163
00164 static u_long AvrUsartGetSpeed(void);
00165 static int AvrUsartSetSpeed(u_long rate);
00166 static u_char AvrUsartGetDataBits(void);
00167 static int AvrUsartSetDataBits(u_char bits);
00168 static u_char AvrUsartGetParity(void);
00169 static int AvrUsartSetParity(u_char mode);
00170 static u_char AvrUsartGetStopBits(void);
00171 static int AvrUsartSetStopBits(u_char bits);
00172 static u_long AvrUsartGetFlowControl(void);
00173 static int AvrUsartSetFlowControl(u_long flags);
00174 static u_long AvrUsartGetStatus(void);
00175 static int AvrUsartSetStatus(u_long flags);
00176 static u_char AvrUsartGetClockMode(void);
00177 static int AvrUsartSetClockMode(u_char mode);
00178 static void AvrUsartTxStart(void);
00179 static void AvrUsartRxStart(void);
00180 static int AvrUsartInit(void);
00181 static int AvrUsartDeinit(void);
00182
00187
00191 static USARTDCB dcb_usart1 = {
00192 0,
00193 0,
00194 0,
00195 0,
00196 {0, 0, 0, 0, 0, 0, 0, 0},
00197 {0, 0, 0, 0, 0, 0, 0, 0},
00198 0,
00199 AvrUsartInit,
00200 AvrUsartDeinit,
00201 AvrUsartTxStart,
00202 AvrUsartRxStart,
00203 AvrUsartSetFlowControl,
00204 AvrUsartGetFlowControl,
00205 AvrUsartSetSpeed,
00206 AvrUsartGetSpeed,
00207 AvrUsartSetDataBits,
00208 AvrUsartGetDataBits,
00209 AvrUsartSetParity,
00210 AvrUsartGetParity,
00211 AvrUsartSetStopBits,
00212 AvrUsartGetStopBits,
00213 AvrUsartSetStatus,
00214 AvrUsartGetStatus,
00215 AvrUsartSetClockMode,
00216 AvrUsartGetClockMode,
00217 };
00218
00234 NUTDEVICE devUsartAvr1 = {
00235 0,
00236 {'u', 'a', 'r', 't', '1', 0, 0, 0, 0},
00237 IFTYP_CHAR,
00238 1,
00239 0,
00240 0,
00241 &dcb_usart1,
00242 UsartInit,
00243 UsartIOCtl,
00244 UsartRead,
00245 UsartWrite,
00246 UsartWrite_P,
00247 UsartOpen,
00248 UsartClose,
00249 UsartSize
00250 };
00259
00260 #ifdef UART1_CTS_IRQ
00261
00262 #if (UART1_CTS_IRQ == INT0)
00263 #define UART_CTS_SIGNAL sig_INTERRUPT0
00264 #define UART_CTS_BIT 0
00265 #define UART_CTS_PORT PORTD
00266 #define UART_CTS_PIN PIND
00267 #define UART_CTS_DDR DDRD
00268
00269 #elif (UART1_CTS_IRQ == INT1)
00270 #define UART_CTS_SIGNAL sig_INTERRUPT1
00271 #define UART_CTS_BIT 1
00272 #define UART_CTS_PORT PORTD
00273 #define UART_CTS_PIN PIND
00274 #define UART_CTS_DDR DDRD
00275
00276 #elif (UART1_CTS_IRQ == INT2)
00277 #define UART_CTS_SIGNAL sig_INTERRUPT2
00278 #define UART_CTS_BIT 2
00279 #define UART_CTS_PORT PORTD
00280 #define UART_CTS_PIN PIND
00281 #define UART_CTS_DDR DDRD
00282
00283 #elif (UART1_CTS_IRQ == INT3)
00284 #define UART_CTS_SIGNAL sig_INTERRUPT3
00285 #define UART_CTS_BIT 3
00286 #define UART_CTS_PORT PORTD
00287 #define UART_CTS_PIN PIND
00288 #define UART_CTS_DDR DDRD
00289
00290 #elif (UART1_CTS_IRQ == INT4)
00291 #define UART_CTS_SIGNAL sig_INTERRUPT4
00292 #define UART_CTS_BIT 4
00293 #define UART_CTS_PORT PORTE
00294 #define UART_CTS_PIN PINE
00295 #define UART_CTS_DDR DDRE
00296
00297 #elif (UART1_CTS_IRQ == INT5)
00298 #define UART_CTS_SIGNAL sig_INTERRUPT5
00299 #define UART_CTS_BIT 5
00300 #define UART_CTS_PORT PORTE
00301 #define UART_CTS_PIN PINE
00302 #define UART_CTS_DDR DDRE
00303
00304 #elif (UART1_CTS_IRQ == INT6)
00305 #define UART_CTS_SIGNAL sig_INTERRUPT6
00306 #define UART_CTS_BIT 6
00307 #define UART_CTS_PORT PORTE
00308 #define UART_CTS_PIN PINE
00309 #define UART_CTS_DDR DDRE
00310
00311 #elif (UART1_CTS_IRQ == INT7)
00312 #define UART_CTS_SIGNAL sig_INTERRUPT7
00313 #define UART_CTS_BIT 7
00314 #define UART_CTS_PORT PORTE
00315 #define UART_CTS_PIN PINE
00316 #define UART_CTS_DDR DDRE
00317
00318 #endif
00319
00320 #else
00321
00322
00323 #define UART_CTS_PORT UART1_CTS_PORT
00324 #define UART_CTS_PIN UART1_CTS_PIN
00325 #define UART_CTS_DDR UART1_CTS_DDR
00326
00327 #ifdef UART1_CTS_BIT
00328 #define UART_CTS_SIGNAL UART1_CTS_SIGNAL
00329 #define UART_CTS_BIT UART1_CTS_BIT
00330 #endif
00331
00332 #endif
00333
00336
00337 #define UDRn UDR1
00338 #define UCSRnA UCSR1A
00339 #define UCSRnB UCSR1B
00340 #define UCSRnC UCSR1C
00341 #define UBRRnL UBRR1L
00342 #define UBRRnH UBRR1H
00343
00344 #ifdef __IMAGECRAFT__
00345 #define TXB8 TXB81
00346 #ifdef ATMega2561
00347 #define UMSEL UMSEL01
00348 #else
00349 #define UMSEL UMSEL1
00350 #endif
00351 #define U2X U2X1
00352 #define UCSZ2 UCSZ12
00353 #define UCSZ1 UCSZ11
00354 #define UCSZ0 UCSZ10
00355 #define UPM0 UPM10
00356 #define UPM1 UPM11
00357 #define USBS USBS1
00358 #define UPE UPE1
00359 #define MPCM MPCM1
00360 #define UCPOL UCPOL1
00361 #endif
00362
00363 #define sig_UART_RECV sig_UART1_RECV
00364 #define sig_UART_DATA sig_UART1_DATA
00365 #define sig_UART_TRANS sig_UART1_TRANS
00366
00367 #define SIG_UART_RECV SIG_UART1_RECV
00368 #define SIG_UART_DATA SIG_UART1_DATA
00369 #define SIG_UART_TRANS SIG_UART1_TRANS
00370
00371 #define dcb_usart dcb_usart1
00372
00373 #ifdef NUTTRACER
00374 #define TRACE_INT_UART_CTS TRACE_INT_UART1_CTS
00375 #define TRACE_INT_UART_RXCOMPL TRACE_INT_UART1_RXCOMPL
00376 #define TRACE_INT_UART_TXEMPTY TRACE_INT_UART1_TXEMPTY
00377 #endif
00378
00379 #ifdef UART1_READMULTIBYTE
00380 #define UART_READMULTIBYTE
00381 #endif
00382
00383 #ifdef USE_USART1
00384 #define USE_USART
00385 #endif
00386
00387 #ifdef UART1_NO_SW_FLOWCONTROL
00388 #define UART_NO_SW_FLOWCONTROL
00389 #endif
00390
00391 #include "usartavr.c"
00392
00393 #endif