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 "uartintr.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
00032
00033
00034
00035
00036
00037
00038
00039
00040 #define pUSART0 ((AT91S_USART*)AT91C_BASE_US0)
00041 #define pUSART1 ((AT91S_USART*)AT91C_BASE_US1)
00042 #define pUSART2 ((AT91S_USART*)AT91C_BASE_DBGU)
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_PPUDR = AT91C_PA5_RXD0;
00055
00056 pUSART2->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS |AT91C_US_TXDIS;
00057
00058 pUSART0->US_MR = AT91C_US_USMODE_NORMAL |
00059 AT91C_US_CLKS_CLOCK |
00060 mode;
00061
00062 pUSART0->US_BRGR = bauddiv;
00063
00064 pUSART0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
00065
00066 bufferInit(&uartRxBuffer[0], uart0RxData, UART0_RX_BUFFER_SIZE);
00067
00068
00069 processorAicAttach(AT91C_ID_US0, (UART0_INTERRUPT_LEVEL|AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL), uart0Service);
00070
00071 pUSART0->US_IER = AT91C_US_RXRDY;
00072 }
00073
00074 void uart1Init(uint16_t bauddiv, uint32_t mode)
00075 {
00076
00077 AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US1);
00078
00079 *AT91C_PIOA_PDR = AT91C_PA21_RXD1 | AT91C_PA22_TXD1;
00080
00081 *AT91C_PIOA_ASR = AT91C_PA21_RXD1 | AT91C_PA22_TXD1;
00082
00083 *AT91C_PIOA_PPUDR = AT91C_PA21_RXD1;
00084
00085 pUSART2->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS |AT91C_US_TXDIS;
00086
00087 pUSART1->US_MR = AT91C_US_USMODE_NORMAL |
00088 AT91C_US_CLKS_CLOCK |
00089 mode;
00090
00091 pUSART1->US_BRGR = bauddiv;
00092
00093 pUSART1->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
00094
00095 bufferInit(&uartRxBuffer[1], uart1RxData, UART1_RX_BUFFER_SIZE);
00096
00097
00098 processorAicAttach(AT91C_ID_US1, (UART1_INTERRUPT_LEVEL|AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL), uart1Service);
00099
00100 pUSART1->US_IER = AT91C_US_RXRDY;
00101 }
00102
00103 void uart2Init(uint16_t bauddiv, uint32_t mode)
00104 {
00105
00106 AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_SYS);
00107
00108 *AT91C_PIOA_PDR = AT91C_PA9_DRXD | AT91C_PA10_DTXD;
00109
00110 *AT91C_PIOA_PPUDR = AT91C_PA9_DRXD;
00111
00112 pUSART2->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS |AT91C_US_TXDIS;
00113
00114 pUSART2->US_MR = AT91C_US_USMODE_NORMAL |
00115 AT91C_US_CLKS_CLOCK |
00116 AT91C_US_CHRL_8_BITS |
00117 AT91C_US_PAR_NONE |
00118 AT91C_US_NBSTOP_1_BIT;
00119
00120 pUSART2->US_BRGR = bauddiv;
00121
00122 pUSART2->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
00123
00124 bufferInit(&uartRxBuffer[2], uart2RxData, UART2_RX_BUFFER_SIZE);
00125
00126
00127 processorAicAttachSys(SYSPID_DBGU, uart2Service);
00128
00129 pUSART2->US_IER = AT91C_US_RXRDY;
00130 }
00131
00132 cBuffer* uart0GetRxBuffer(int dev)
00133 {
00134
00135 return &uartRxBuffer[dev];
00136 }
00137
00138 int uart0SendByte(int data)
00139 {
00140
00141 while( !(pUSART0->US_CSR & AT91C_US_TXRDY) );
00142
00143 return (pUSART0->US_THR = data);
00144 }
00145
00146 int uart1SendByte(int data)
00147 {
00148
00149 while( !(pUSART1->US_CSR & AT91C_US_TXRDY) );
00150
00151 return (pUSART1->US_THR = data);
00152 }
00153
00154 int uart2SendByte(int data)
00155 {
00156
00157 while( !(pUSART2->US_CSR & AT91C_US_TXRDY) );
00158
00159 return (pUSART2->US_THR = data);
00160 }
00161
00162 int uart0GetByte(void)
00163 {
00164 if(uartRxBuffer[0].datalength)
00165 return bufferGetFromFront(&uartRxBuffer[0]);
00166 return -1;
00167 }
00168
00169 int uart1GetByte(void)
00170 {
00171 if(uartRxBuffer[1].datalength)
00172 return bufferGetFromFront(&uartRxBuffer[1]);
00173 return -1;
00174 }
00175
00176 int uart2GetByte(void)
00177 {
00178 if(uartRxBuffer[2].datalength)
00179 return bufferGetFromFront(&uartRxBuffer[2]);
00180 return -1;
00181 }
00182
00183 void uart0Service(void)
00184 {
00185 unsigned int status;
00186
00187
00188 status = pUSART0->US_CSR;
00189 status &= pUSART0->US_IMR;
00190
00191 if(status & AT91C_US_RXRDY)
00192 {
00193 bufferAddToEnd(&uartRxBuffer[0], pUSART0->US_RHR);
00194 }
00195
00196 if(status & AT91C_US_TXRDY)
00197 {
00198 }
00199
00200
00201 pUSART0->US_CR = AT91C_US_RSTSTA;
00202
00203 AT91C_BASE_AIC->AIC_EOICR = 0;
00204 }
00205
00206 void uart1Service(void)
00207 {
00208 unsigned int status;
00209
00210
00211 status = pUSART1->US_CSR;
00212 status &= pUSART1->US_IMR;
00213
00214 if(status & AT91C_US_RXRDY)
00215 {
00216 bufferAddToEnd(&uartRxBuffer[1], pUSART1->US_RHR);
00217 }
00218
00219 if(status & AT91C_US_TXRDY)
00220 {
00221 }
00222
00223
00224 pUSART1->US_CR = AT91C_US_RSTSTA;
00225
00226 AT91C_BASE_AIC->AIC_EOICR = 0;
00227 }
00228
00229 void uart2Service(void)
00230 {
00231 unsigned int status;
00232
00233
00234 status = pUSART2->US_CSR;
00235 status &= pUSART2->US_IMR;
00236
00237 if(status & AT91C_US_RXRDY)
00238 {
00239 bufferAddToEnd(&uartRxBuffer[2], pUSART2->US_RHR);
00240 }
00241
00242 if(status & AT91C_US_TXRDY)
00243 {
00244 }
00245
00246
00247 pUSART2->US_CR = AT91C_US_RSTSTA;
00248
00249
00250 }