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