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 #include "usart.h"
00050
00055 void usart_reset(volatile struct avr32_usart_t * usart)
00056 {
00057
00058
00059 usart->idr = 0xFFFFffff;
00060
00061
00062
00063 usart->mr = 0;
00064 usart->rtor = 0;
00065 usart->ttgr = 0;
00066
00067
00068
00069
00070 usart->cr = AVR32_USART_CR_RSTRX_MASK|
00071 AVR32_USART_CR_RSTTX_MASK|
00072 AVR32_USART_CR_RSTSTA_MASK|
00073 AVR32_USART_CR_RSTIT_MASK|
00074 AVR32_USART_CR_RSTNACK_MASK|
00075 AVR32_USART_CR_DTRDIS_MASK|
00076 AVR32_USART_CR_RTSDIS_MASK;
00077 }
00078
00079
00093 static int usart_set_baudrate(volatile struct avr32_usart_t * usart,
00094 unsigned int baudrate,
00095 const long cpuHz)
00096 {
00097 int cd;
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 if (baudrate > (cpuHz/16)) {
00109
00110 usart->mr |= (AVR32_USART_MR_OVER_MASK);
00111 cd = cpuHz / (8 * baudrate);
00112
00113 if (cd < 2) {
00114
00115 return USART_ERROR_ARGUMENT;
00116 }
00117
00118 usart->brgr = (cd << AVR32_USART_BRGR_CD_OFFSET);
00119 } else {
00120
00121 usart->mr &= ~(AVR32_USART_MR_OVER_MASK);
00122 cd = cpuHz / (16 * baudrate);
00123
00124 if (cd > 65535) {
00125
00126 return USART_ERROR_ARGUMENT;
00127 }
00128
00129 usart->brgr = (cd << AVR32_USART_BRGR_CD_OFFSET);
00130 }
00131
00132 return USART_OK;
00133 }
00134
00135
00147 int usart_linit(volatile struct avr32_usart_t * usart,
00148 const struct usart_options_t * opt,
00149 const long cpuHz)
00150 {
00151 int retval;
00152
00153
00154 usart_reset(usart);
00155
00156
00157 if (opt == 0) {
00158 return USART_ERROR_ARGUMENT;
00159 }
00160 if (opt->charlength < 5 || opt->charlength > 9) {
00161 return USART_ERROR_ARGUMENT;
00162 }
00163 if (opt->paritytype > 7) {
00164 return USART_ERROR_ARGUMENT;
00165 }
00166 if (opt->stopbits > 2+255) {
00167 return USART_ERROR_ARGUMENT;
00168 }
00169 if (opt->channelmode > 3) {
00170 return USART_ERROR_ARGUMENT;
00171 }
00172
00173 retval = usart_set_baudrate(usart, opt->baudrate, cpuHz);
00174
00175 if (retval != USART_OK) {
00176 return retval;
00177 }
00178
00179 if (opt->charlength == 9) {
00180
00181 usart->mr |= AVR32_USART_MR_MODE9_MASK;
00182 } else {
00183
00184 usart->mr |=
00185 ((opt->charlength-5)<<AVR32_USART_MR_CHRL_OFFSET);
00186 }
00187
00188 usart->mr |= (opt->channelmode<<AVR32_USART_MR_CHMODE_OFFSET)|
00189 (opt->paritytype<<AVR32_USART_MR_PAR_OFFSET);
00190
00191 if (opt->stopbits > 2) {
00192
00193 usart->mr |= (2<<AVR32_USART_MR_NBSTOP_OFFSET);
00194
00195 usart->ttgr = (opt->stopbits-2);
00196 } else {
00197
00198 usart->mr |= (opt->stopbits<<AVR32_USART_MR_NBSTOP_OFFSET);
00199 }
00200
00201
00202 usart->cr |= AVR32_USART_CR_TXEN_MASK|AVR32_USART_CR_RXEN_MASK;
00203
00204 return USART_OK;
00205 }
00206
00207
00217 int usart_putchar(volatile struct avr32_usart_t * usart, const int character)
00218 {
00219 int timeout = USART_DEFAULT_TIMEOUT;
00220
00221 do {
00222 --timeout;
00223 } while ((usart->csr & AVR32_USART_CSR_TXRDY_MASK) == 0 && timeout > 0);
00224
00225 if (timeout == 0) {
00226 return USART_TX_BUSY;
00227 }
00228
00229 usart->thr = character;
00230
00231 return USART_OK;
00232 }
00233
00234
00244 int usart_lwriteLine(volatile struct avr32_usart_t * usart, const char * string)
00245 {
00246 int retVal = USART_OK;
00247
00248 while (*string != '\0') {
00249 retVal = usart_putchar(usart, *string++);
00250
00251 if (retVal != USART_OK) {
00252 return retVal;
00253 }
00254 }
00255
00256 return USART_OK;
00257 }
00258