00001
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 #include "usart.h"
00058
00059
00060
00061
00062
00063
00064
00065 static int usart_mode_is_multidrop(volatile struct avr32_usart_t * usart)
00066 {
00067 return ( (usart->mr & 0x00000600) >> AVR32_USART_MR_PAR_OFFSET );
00068 }
00069
00070 void usart_reset( volatile struct avr32_usart_t * usart)
00071 {
00072
00073
00074 usart->idr = 0xFFFFffff;
00075
00076
00077
00078 usart->mr = 0;
00079 usart->rtor = 0;
00080 usart->ttgr = 0;
00081
00082
00083
00084
00085 usart->cr = (1 << AVR32_USART_CR_RSTRX_OFFSET) |
00086 (1 << AVR32_USART_CR_RSTTX_OFFSET) |
00087 (1 << AVR32_USART_CR_RSTSTA_OFFSET) |
00088 (1 << AVR32_USART_CR_RSTIT_OFFSET) |
00089 (1 << AVR32_USART_CR_RSTNACK_OFFSET) |
00090 (1 << AVR32_USART_CR_DTRDIS_OFFSET) |
00091 (1 << AVR32_USART_CR_RTSDIS_OFFSET);
00092 }
00093
00094
00105 static int usart_set_baudrate( volatile struct avr32_usart_t * usart, unsigned int baudrate, long cpu_hz)
00106 {
00107 int cd;
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 if ( baudrate < (cpu_hz/16) ){
00120
00121 usart->mr |= (1<<AVR32_USART_MR_OVER_OFFSET);
00122 cd = cpu_hz / (8*baudrate);
00123
00124 if (cd < 2) {
00125 return USART_INVALID_INPUT;
00126 }
00127 usart->brgr = (cd << AVR32_USART_BRGR_CD_OFFSET);
00128 } else {
00129
00130 usart->mr &= ~(1<<AVR32_USART_MR_OVER_OFFSET);
00131 cd = cpu_hz / (16*baudrate);
00132
00133 if (cd > 65535) {
00134
00135 return USART_INVALID_INPUT;
00136 }
00137 }
00138 usart->brgr = (cd << AVR32_USART_BRGR_CD_OFFSET);
00139 return USART_SUCCESS;
00140 }
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 int usart_init_rs232(volatile struct avr32_usart_t * usart, struct usart_options_t * opt, long cpu_hz)
00153 {
00154 int retval;
00155
00156
00157 usart_reset(usart);
00158
00159
00160 if (opt == 0)
00161 return USART_INVALID_INPUT;
00162 if (opt->charlength < 5 || opt->charlength > 9)
00163 return USART_INVALID_INPUT;
00164 if (opt->paritytype > 7)
00165 return USART_INVALID_INPUT;
00166 if (opt->stopbits > 2+255)
00167 return USART_INVALID_INPUT;
00168 if (opt->channelmode > 3)
00169 return USART_INVALID_INPUT;
00170
00171 if ((retval = usart_set_baudrate(usart, opt->baudrate, cpu_hz)) != \
00172 USART_SUCCESS)
00173 return retval;
00174
00175 if (opt->charlength == 9) {
00176
00177 usart->mr |= (1<<AVR32_USART_MR_MODE9_OFFSET);
00178 } else {
00179
00180 usart->mr |=
00181 ((opt->charlength-5) << AVR32_USART_MR_CHRL_OFFSET);
00182 }
00183
00184 usart->mr |= (opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET) |
00185 (opt->paritytype << AVR32_USART_MR_PAR_OFFSET);
00186
00187 if (opt->stopbits > 2)
00188 {
00189
00190 usart->mr |= (2 << AVR32_USART_MR_NBSTOP_OFFSET);
00191
00192 usart->ttgr = (opt->stopbits-2);
00193 }
00194 else
00195
00196 usart->mr |= (opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET);
00197
00198
00199
00200 usart->cr |= (1<<AVR32_USART_CR_TXEN_OFFSET) |
00201 (1<<AVR32_USART_CR_RXEN_OFFSET);
00202
00203 return USART_SUCCESS;
00204 }
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220 int usart_init_handshaking(volatile struct avr32_usart_t * usart, struct usart_options_t * opt,
00221 long cpu_hz, int software_handshaking,
00222 char xon_char, char xoff_char)
00223 {
00224 int retval;
00225
00226
00227 if ((retval = usart_init_rs232(usart, opt, cpu_hz)) != USART_SUCCESS)
00228 return retval;
00229
00230 if (software_handshaking == 0)
00231 {
00232
00233 usart-> mr &= ~(0xf << AVR32_USART_MR_MODE_OFFSET);
00234
00235 usart-> mr |= (USART_MODE_HW_HSH << AVR32_USART_MR_MODE_OFFSET);
00236 }
00237 else if (software_handshaking == 1)
00238 {
00239
00240 usart-> mr &= ~(0xf << AVR32_USART_MR_MODE_OFFSET);
00241
00242 usart-> mr |= (USART_MODE_SW_HSH << AVR32_USART_MR_MODE_OFFSET);
00243
00244 usart->xxr = (xon_char << AVR32_USART_XXR_XON_OFFSET) |
00245 (xoff_char << AVR32_USART_XXR_XOFF_OFFSET);
00246 }
00247 else
00248 return USART_INVALID_INPUT;
00249
00250 return USART_SUCCESS;
00251 }
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 int usart_init_IrDA(volatile struct avr32_usart_t * usart, struct usart_options_t * opt,
00262 long cpu_hz, unsigned char irda_filter)
00263 {
00264 int retval;
00265
00266
00267 if ((retval = usart_init_rs232(usart, opt, cpu_hz)) != USART_SUCCESS)
00268 return retval;
00269
00270
00271 usart->ifr = irda_filter;
00272
00273
00274 usart->mr |= (1 << AVR32_USART_MR_FILTER_OFFSET);
00275 return USART_SUCCESS;
00276 }
00277
00278
00279
00280
00281
00282
00283
00284
00285 int usart_init_modem(volatile struct avr32_usart_t * usart, struct usart_options_t * opt, long cpu_hz)
00286 {
00287 int retval;
00288
00289
00290 if ((retval = usart_init_rs232(usart, opt, cpu_hz)) != USART_SUCCESS)
00291 return retval;
00292
00293
00294 usart-> mr &= ~(0xf << AVR32_USART_MR_MODE_OFFSET);
00295
00296 usart-> mr |= (USART_MODE_MODEM << AVR32_USART_MR_MODE_OFFSET);
00297 return USART_SUCCESS;
00298 }
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 int usart_init_rs485(volatile struct avr32_usart_t * usart, struct usart_options_t * opt, long cpu_hz)
00311 {
00312 int retval;
00313
00314
00315 if ((retval = usart_init_rs232(usart, opt, cpu_hz)) != USART_SUCCESS)
00316 return retval;
00317
00318
00319 usart->mr &= ~(0xf << AVR32_USART_MR_MODE_OFFSET);
00320
00321 usart->mr |= (USART_MODE_RS485 << AVR32_USART_MR_MODE_OFFSET);
00322 return USART_SUCCESS;
00323 }
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333 int usart_init_iso7816(volatile struct avr32_usart_t * usart, const struct iso7816_options_t * opt, int t, const long cpu_hz)
00334 {
00335 int retval;
00336
00337
00338 usart_reset(usart);
00339
00340 if (opt == 0)
00341
00342 return USART_INVALID_INPUT;
00343
00344
00345
00346
00347
00348 if (t == 0)
00349 {
00350
00351
00352 usart->mr = (USART_MODE_ISO7816_T0 << AVR32_USART_MR_MODE_OFFSET) |
00353 (2 << AVR32_USART_MR_NBSTOP_OFFSET) |
00354 (opt->bit_order << AVR32_USART_MR_MSBF_OFFSET);
00355 }
00356 else if (t == 1)
00357 {
00358
00359 if (opt->bit_order != 0)
00360 return USART_INVALID_INPUT;
00361
00362 if (opt->max_iterations != 0)
00363 return USART_INVALID_INPUT;
00364
00365 usart->mr = (USART_MODE_ISO7816_T1 << AVR32_USART_MR_MODE_OFFSET);
00366
00367 }
00368 else
00369 return USART_INVALID_INPUT;
00370
00371 if ((retval = usart_set_baudrate(usart, opt->iso7816_hz, cpu_hz)) != USART_SUCCESS)
00372 return retval;
00373
00374
00375 usart->fidi = opt->fidi_ratio;
00376
00377 usart->mr |= (opt->inhibit_nack << AVR32_USART_MR_INACK_OFFSET) |
00378 (opt->dis_suc_nack << AVR32_USART_MR_DSNACK_OFFSET) |
00379 (opt->max_iterations << AVR32_USART_MR_MAX_ITERATION_OFFSET) |
00380 (1 << AVR32_USART_MR_CLKO_OFFSET);
00381
00382
00383
00384 usart->cr |= (1<<AVR32_USART_CR_RXEN_OFFSET);
00385
00386 return USART_SUCCESS;
00387 }
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405 void usart_reset_status(volatile struct avr32_usart_t * usart)
00406 {
00407 usart->cr |= (1<<AVR32_USART_CR_RSTSTA_OFFSET);
00408 }
00409
00410
00411
00412
00413
00414
00415 int usart_parity_error(volatile struct avr32_usart_t * usart)
00416 {
00417 return ((usart->csr & (1<<AVR32_USART_CSR_PARE_OFFSET)) != 0);
00418 }
00419
00420
00421
00422
00423
00424
00425
00426 int usart_framing_error(volatile struct avr32_usart_t * usart)
00427 {
00428 return ((usart->csr & (1<<AVR32_USART_CSR_FRAME_OFFSET)) != 0);
00429 }
00430
00431
00432
00433
00434
00435
00436
00437 int usart_overrun_error(volatile struct avr32_usart_t * usart)
00438 {
00439 return ((usart->csr & AVR32_USART_CSR_OVRE_OFFSET)) != 0;
00440 }
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461 int usart_send_address(volatile struct avr32_usart_t * usart, int address)
00462 {
00463
00464 if ( usart_mode_is_multidrop(usart) )
00465 {
00466
00467 usart->cr |= (1<<AVR32_USART_CR_SENDA_OFFSET);
00468
00469
00470 usart_bw_write_char(usart, address);
00471 return USART_SUCCESS;
00472 } else {
00473 return USART_MODE_FAULT;
00474 }
00475 }
00476
00477
00478
00479
00480
00481
00482
00483
00484 inline void usart_bw_write_char(volatile struct avr32_usart_t * usart, int c)
00485 {
00486 while (usart_write_char(usart, c) != USART_SUCCESS) {
00487 }
00488
00489 return;
00490 }
00491
00492 int usart_write_char(volatile struct avr32_usart_t * usart, int c)
00493 {
00494
00495 if ((usart->csr & (1<<AVR32_USART_CSR_TXRDY_OFFSET)) != 0) {
00496 usart->thr = c;
00497 return USART_SUCCESS;
00498 }
00499 else
00500 return USART_TX_BUSY;
00501 }
00502
00503
00504 int usart_read_char(volatile struct avr32_usart_t * usart, int * c)
00505 {
00506
00507
00508 if (usart->csr &
00509 ((1 << AVR32_USART_CSR_OVRE_OFFSET) |
00510 (1 << AVR32_USART_CSR_FRAME_OFFSET) |
00511 (1 << AVR32_USART_CSR_PARE_OFFSET))) {
00512 return USART_RX_ERROR;
00513 }
00514
00515 else if ((usart->csr & (1<<AVR32_USART_CSR_RXRDY_OFFSET)) != 0) {
00516 *c = (unsigned short)usart->rhr;
00517 return USART_SUCCESS;
00518 } else {
00519 return USART_RX_EMPTY;
00520 }
00521 }
00522
00523
00524 int usart_getchar(volatile struct avr32_usart_t * usart)
00525 {
00526 int c, ret;
00527
00528 while (((ret = usart_read_char(usart, &c)) == USART_RX_EMPTY)) {
00529 }
00530
00531 if (ret == USART_RX_ERROR)
00532 return -1;
00533 else
00534 return c;
00535 }
00536
00537
00538 int usart_putchar(volatile struct avr32_usart_t * usart, int c)
00539 {
00540 int timeout = USART_DEFAULT_TIMEOUT;
00541
00542 if (c == '\n'){
00543 while ((usart_write_char(usart, '\r') != USART_SUCCESS) && (timeout>0) ){
00544 timeout--;
00545 }
00546
00547 if (timeout == 0)
00548 return -1;
00549 timeout = USART_DEFAULT_TIMEOUT;
00550 }
00551
00552 while ((usart_write_char(usart, c) != USART_SUCCESS) && ( timeout>0 )){
00553 timeout--;
00554 }
00555 if (timeout == 0)
00556 return -1;
00557 else
00558 return 0;
00559 }
00560