00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "at91sam7s64.h"
00020
00021 #include "global.h"
00022 #include "processor.h"
00023 #include "buffer.h"
00024 #include "uartdma.h"
00025
00026
00027 cBuffer UartRxBuffer[3];
00028 static unsigned char Uart0RxData[UART0_RX_BUFFER_SIZE];
00029 static unsigned char Uart1RxData[UART1_RX_BUFFER_SIZE];
00030 static unsigned char Uart2RxData[UART2_RX_BUFFER_SIZE];
00031 cBuffer UartTxBuffer[3];
00032 static unsigned char Uart0TxData[UART0_TX_BUFFER_SIZE];
00033 static unsigned char Uart1TxData[UART1_TX_BUFFER_SIZE];
00034 static unsigned char Uart2TxData[UART2_TX_BUFFER_SIZE];
00035
00036
00037 AT91S_USART* const pUSART[3] = { AT91C_BASE_US0, AT91C_BASE_US0, AT91C_BASE_DBGU };
00038 #define pUSART0 ((AT91S_USART*)AT91C_BASE_US0)
00039 #define pUSART1 ((AT91S_USART*)AT91C_BASE_US1)
00040 #define pUSART2 ((AT91S_USART*)AT91C_BASE_DBGU)
00041 #define pPDC(dev) ((AT91S_PDC*)((unsigned char*)(dev)+0x100))
00042
00043
00044
00045 void uart0Init(uint16_t bauddiv, uint32_t mode)
00046 {
00047
00048 AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US0);
00049
00050 *AT91C_PIOA_PDR = AT91C_PA5_RXD0 | AT91C_PA6_TXD0;
00051
00052 *AT91C_PIOA_ASR = AT91C_PA5_RXD0 | AT91C_PA6_TXD0;
00053
00054 *AT91C_PIOA_PPUER = AT91C_PA5_RXD0;
00055
00056 pUSART[0]->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS |AT91C_US_TXDIS;
00057
00058 pUSART[0]->US_MR = AT91C_US_USMODE_NORMAL |
00059 AT91C_US_CLKS_CLOCK |
00060 mode;
00061
00062 pUSART[0]->US_BRGR = bauddiv;
00063
00064 pUSART[0]->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
00065
00066
00067 uart0InitBuffers();
00068
00069 uartInitDmaTx(0);
00070
00071
00072
00073
00074 processorAicAttach(AT91C_ID_US0, (UART0_INTERRUPT_LEVEL|AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL), uart0Service);
00075
00076 pUSART[0]->US_IER = AT91C_US_RXRDY;
00077 }
00078
00079 void uart1Init(uint16_t bauddiv, uint32_t mode)
00080 {
00081
00082 AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US1);
00083
00084 *AT91C_PIOA_PDR = AT91C_PA21_RXD1 | AT91C_PA22_TXD1;
00085
00086 *AT91C_PIOA_ASR = AT91C_PA21_RXD1 | AT91C_PA22_TXD1;
00087
00088 *AT91C_PIOA_PPUER = AT91C_PA21_RXD1;
00089
00090 pUSART[1]->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS |AT91C_US_TXDIS;
00091
00092 pUSART[1]->US_MR = AT91C_US_USMODE_NORMAL |
00093 AT91C_US_CLKS_CLOCK |
00094 mode;
00095
00096 pUSART[1]->US_BRGR = bauddiv;
00097
00098 pUSART[1]->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
00099
00100
00101 uart1InitBuffers();
00102
00103 uartInitDmaTx(1);
00104
00105
00106
00107
00108 processorAicAttach(AT91C_ID_US1, (UART1_INTERRUPT_LEVEL|AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL), uart1Service);
00109
00110 pUSART[1]->US_IER = AT91C_US_RXRDY;
00111 }
00112
00113 void uart2Init(uint16_t bauddiv, uint32_t mode)
00114 {
00115
00116 AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_SYS);
00117
00118 *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD;
00119
00120 *AT91C_PIOA_PPUER = AT91C_PA9_DRXD;
00121
00122 pUSART[2]->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS |AT91C_US_TXDIS;
00123
00124 pUSART[2]->US_MR = AT91C_US_USMODE_NORMAL |
00125 AT91C_US_CLKS_CLOCK |
00126 AT91C_US_CHRL_8_BITS |
00127 AT91C_US_PAR_NONE |
00128 AT91C_US_NBSTOP_1_BIT;
00129
00130 pUSART[2]->US_BRGR = bauddiv;
00131
00132 pUSART[2]->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
00133
00134
00135 uart2InitBuffers();
00136
00137 uartInitDmaTx(2);
00138
00139
00140
00141
00142 processorAicAttachSys(SYSPID_DBGU, uart2Service);
00143
00144 pUSART[2]->US_IER = AT91C_US_RXRDY;
00145 }
00146
00147 void uart0InitBuffers(void)
00148 {
00149
00150 bufferInit(&UartRxBuffer[0], Uart0RxData, UART0_RX_BUFFER_SIZE);
00151 bufferInit(&UartTxBuffer[0], Uart0TxData, UART0_TX_BUFFER_SIZE);
00152 }
00153
00154 void uart1InitBuffers(void)
00155 {
00156
00157 bufferInit(&UartRxBuffer[1], Uart1RxData, UART1_RX_BUFFER_SIZE);
00158 bufferInit(&UartTxBuffer[1], Uart1TxData, UART1_TX_BUFFER_SIZE);
00159 }
00160
00161 void uart2InitBuffers(void)
00162 {
00163
00164 bufferInit(&UartRxBuffer[2], Uart2RxData, UART2_RX_BUFFER_SIZE);
00165 bufferInit(&UartTxBuffer[2], Uart2TxData, UART2_TX_BUFFER_SIZE);
00166 }
00167
00168 void uartInitDmaTx(int dev)
00169 {
00170
00171 UartTxBuffer[dev].dataindex = 0;
00172 UartTxBuffer[dev].datalength = 0;
00173
00174 pPDC(pUSART[dev])->PDC_PTCR = AT91C_PDC_TXTDIS;
00175 pPDC(pUSART[dev])->PDC_TPR = (unsigned int)UartTxBuffer[dev].dataptr;
00176 pPDC(pUSART[dev])->PDC_TCR = 0;
00177 pPDC(pUSART[dev])->PDC_TNPR = (unsigned int)UartTxBuffer[dev].dataptr;
00178 pPDC(pUSART[dev])->PDC_TNCR = 0;
00179 pPDC(pUSART[dev])->PDC_PTCR = AT91C_PDC_TXTEN;
00180 }
00181
00182 void uartInitDmaRx(int dev)
00183 {
00184
00185 UartRxBuffer[dev].dataindex = 0;
00186 UartRxBuffer[dev].datalength = 0;
00187
00188 pPDC(pUSART[dev])->PDC_PTCR = AT91C_PDC_RXTDIS;
00189 pPDC(pUSART[dev])->PDC_RPR = (unsigned int)UartTxBuffer[dev].dataptr;
00190 pPDC(pUSART[dev])->PDC_RCR = UartTxBuffer[dev].size;
00191 pPDC(pUSART[dev])->PDC_RNPR = (unsigned int)UartTxBuffer[dev].dataptr;
00192 pPDC(pUSART[dev])->PDC_RNCR = 0;
00193 pPDC(pUSART[dev])->PDC_PTCR = AT91C_PDC_RXTEN;
00194 }
00195
00196 cBuffer* uartGetRxBuffer(int dev)
00197 {
00198
00199 return &UartRxBuffer[dev];
00200 }
00201
00202 int uartSendByte(int dev, int data)
00203 {
00204 #if defined(UART_DMA_BLOCK_IF_BUSY)
00205
00206 while( (pPDC(pUSART[dev])->PDC_TCR + pPDC(pUSART[dev])->PDC_TNCR) >= UartTxBuffer[dev].size);
00207 #else
00208
00209 if( (pPDC(pUSART[dev])->PDC_TCR + pPDC(pUSART[dev])->PDC_TNCR) >= UartTxBuffer[dev].size)
00210 return -1;
00211 #endif
00212
00213 if(UartTxBuffer[dev].dataindex == UartTxBuffer[dev].size)
00214 {
00215
00216
00217 UartTxBuffer[dev].dataindex = 0;
00218
00219
00220 UartTxBuffer[dev].dataptr[UartTxBuffer[dev].dataindex] = data;
00221 UartTxBuffer[dev].dataindex++;
00222
00223 pPDC(pUSART[dev])->PDC_TNPR = (unsigned int)UartTxBuffer[dev].dataptr;
00224
00225 pPDC(pUSART[dev])->PDC_TNCR++;
00226 }
00227 else
00228 {
00229
00230
00231
00232 UartTxBuffer[dev].dataptr[UartTxBuffer[dev].dataindex] = data;
00233 UartTxBuffer[dev].dataindex++;
00234
00235 if(pPDC(pUSART[dev])->PDC_TNCR)
00236 pPDC(pUSART[dev])->PDC_TNCR++;
00237 else
00238 pPDC(pUSART[dev])->PDC_TCR++;
00239 }
00240
00241 return data;
00242 }
00243
00244 int uartGetByte(int dev)
00245 {
00246 if(UartRxBuffer[dev].datalength)
00247 return bufferGetFromFront(&UartRxBuffer[dev]);
00248 return -1;
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294 }
00295
00296 int uartSendBlock(int dev, unsigned char* data, unsigned int len)
00297 {
00298 #if defined(UART_DMA_BLOCK_IF_BUSY)
00299
00300 while( (pPDC(pUSART[dev])->PDC_TCR + pPDC(pUSART[dev])->PDC_TNCR) > 0);
00301 #else
00302
00303 if( (pPDC(pUSART[dev])->PDC_TCR + pPDC(pUSART[dev])->PDC_TNCR) > 0)
00304 return -1;
00305 #endif
00306
00307
00308 pPDC(pUSART[dev])->PDC_PTCR = AT91C_PDC_TXTDIS;
00309 pPDC(pUSART[dev])->PDC_TPR = (unsigned int)data;
00310 pPDC(pUSART[dev])->PDC_TCR = len;
00311 pPDC(pUSART[dev])->PDC_PTCR = AT91C_PDC_TXTEN;
00312
00313 return 0;
00314 }
00315
00316 int uartGetBlock(int dev, unsigned char* data, unsigned int len)
00317 {
00318 #if defined(UART_DMA_BLOCK_IF_BUSY)
00319
00320 while( (pPDC(pUSART[dev])->PDC_RCR + pPDC(pUSART[dev])->PDC_RNCR) > 0);
00321 #else
00322
00323 if( (pPDC(pUSART[dev])->PDC_RCR + pPDC(pUSART[dev])->PDC_RNCR) > 0)
00324 return -1;
00325 #endif
00326
00327 if(len)
00328 {
00329
00330 pPDC(pUSART[dev])->PDC_PTCR = AT91C_PDC_TXTDIS;
00331 pPDC(pUSART[dev])->PDC_RPR = (unsigned int)data;
00332 pPDC(pUSART[dev])->PDC_RCR = len;
00333 pPDC(pUSART[dev])->PDC_PTCR = AT91C_PDC_TXTEN;
00334
00335 return len;
00336 }
00337 else
00338 {
00339
00340 return pPDC(pUSART[dev])->PDC_TCR;
00341 }
00342 }
00343
00344 void uart0Service(void)
00345 {
00346 unsigned int status;
00347
00348
00349 status = pUSART0->US_CSR;
00350 status &= pUSART0->US_IMR;
00351
00352 if(status & AT91C_US_RXRDY)
00353 {
00354 bufferAddToEnd(&UartRxBuffer[0], pUSART0->US_RHR);
00355 }
00356
00357 if(status & AT91C_US_TXRDY)
00358 {
00359 }
00360
00361
00362 pUSART0->US_CR = AT91C_US_RSTSTA;
00363
00364 AT91C_BASE_AIC->AIC_EOICR = 0;
00365 }
00366
00367 void uart1Service(void)
00368 {
00369 unsigned int status;
00370
00371
00372 status = pUSART1->US_CSR;
00373 status &= pUSART1->US_IMR;
00374
00375 if(status & AT91C_US_RXRDY)
00376 {
00377 bufferAddToEnd(&UartRxBuffer[1], pUSART1->US_RHR);
00378 }
00379
00380 if(status & AT91C_US_TXRDY)
00381 {
00382 }
00383
00384
00385 pUSART1->US_CR = AT91C_US_RSTSTA;
00386
00387 AT91C_BASE_AIC->AIC_EOICR = 0;
00388 }
00389
00390 void uart2Service(void)
00391 {
00392 unsigned int status;
00393
00394
00395 status = pUSART2->US_CSR;
00396 status &= pUSART2->US_IMR;
00397
00398 if(status & AT91C_US_RXRDY)
00399 {
00400 bufferAddToEnd(&UartRxBuffer[2], pUSART2->US_RHR);
00401 }
00402
00403 if(status & AT91C_US_TXRDY)
00404 {
00405 }
00406
00407
00408 pUSART2->US_CR = AT91C_US_RSTSTA;
00409
00410 AT91C_BASE_AIC->AIC_EOICR = 0;
00411 }