00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "includes.h"
00011
00012 const U8 Uart1Name[]="UART1";
00013 UART1_CONTROL Uart1Ctrl;
00014
00015 void Uart1Init(void){
00016 PicIrqDisable(IRQ4_COM1);
00017 Uart1Ctrl.HasData=false;
00018 Uart1Ctrl.Transfered=false;
00019 Uart1Ctrl.RxData=0;
00020 Uart1Ctrl.TxBuffer.Get=0;
00021 Uart1Ctrl.TxBuffer.Put=0;
00022 Uart1Ctrl.RxBuffer.Get=0;
00023 Uart1Ctrl.RxBuffer.Put=0;
00024 Uart1Ctrl.UartTxTransmit=false;
00025 OutByte((U32)(COM1_BASE+IER),0x00);
00026 OutByte((U32)(COM1_BASE+LCR),0x80);
00027 OutByte((U32)(COM1_BASE+DLLR),(BAUDRATE_38400%256));
00028 OutByte((U32)(COM1_BASE+DLHR),(BAUDRATE_38400/256));
00029 OutByte((U32)(COM1_BASE+LCR),0x03);
00030 OutByte((U32)(COM1_BASE+FCR),0x00);
00031 OutByte((U32)(COM1_BASE+MCR),0x0b);
00032 OutByte((U32)(COM1_BASE+IER),COM1_INTERRUPTS);
00033 OsEventAdd(&Uart1Ctrl.Uart1Event,&Uart1Name,OS_EVENT_UART1);
00034 InterruptIrqHandlerSet(IRQ4_COM1,Uart1Handler);
00035 PicIrqEnable(IRQ4_COM1);
00036 }
00037
00038 void Uart1Handler(void){
00039 U8 i;
00040
00041 i=InByte(COM1_BASE+IIR);
00042 i=i>>1;
00043 if(i==COM1_IID_RXRDY){
00044 i=InByte(COM1_BASE+LSR);
00045 if(i&COM1_LSR_DR){
00046 i=InByte(COM1_BASE+RXREG);
00047 Uart1RxBufferPutIsr(i);
00048 }
00049 }
00050 else if(i==COM1_IID_TXEMPTY){
00051 i=InByte(COM1_BASE+IER);
00052 if(Uart1TxBufferCheckIsr()==BUFFER_EMPTY){
00053 Uart1Ctrl.UartTxTransmit=false;
00054 return;
00055 }
00056 else{
00057 i=Uart1TxBufferGetIsr();
00058 OutByte(COM1_BASE+TXREG,i);
00059 }
00060 }
00061 else if(i==COM1_IID_RLS){
00062 i=InByte(COM1_BASE+LSR);
00063 if(i&COM1_LSR_OE);
00064 if(i&COM1_LSR_PE);
00065 if(i&COM1_LSR_FE);
00066 if(i&COM1_LSR_BI);
00067 }
00068 else if(i==COM1_IID_TIMEOUT){
00069 i=InByte(COM1_BASE+RXREG);
00070 }
00071 else if(i==COM1_IID_MS){
00072 i=InByte(COM1_BASE+MSR);
00073 }
00074 }
00075
00076 void Uart1Svc(void){
00077 U8 Data;
00078
00079 if(Uart1Ctrl.UartTxTransmit==true) return;
00080 if(Uart1TxBufferCheck()==BUFFER_EMPTY) return;
00081 Data=Uart1TxBufferGet();
00082 Uart1Ctrl.UartTxTransmit=true;
00083 OutByte(COM1_BASE+TXREG,Data);
00084 }
00085
00086 void Uart1BufferReset(void){
00087 Uart1Ctrl.TxBuffer.Get=0;
00088 Uart1Ctrl.TxBuffer.Put=0;
00089 Uart1Ctrl.RxBuffer.Get=0;
00090 Uart1Ctrl.RxBuffer.Put=0;
00091 }
00092
00093 U8 Uart1RxBufferCheck(void){
00094 if(Uart1Ctrl.RxBuffer.Put!=Uart1Ctrl.RxBuffer.Get){
00095 if(Uart1Ctrl.RxBuffer.Put==(UART1_MAX_BUFFER_SIZE-1)){
00096 if(Uart1Ctrl.RxBuffer.Get==0) return BUFFER_FULL;
00097 else return BUFFER_NOT_EMPTY;
00098 }
00099 else{
00100 if((Uart1Ctrl.RxBuffer.Put+1)==Uart1Ctrl.RxBuffer.Get) return BUFFER_FULL;
00101 else return BUFFER_NOT_EMPTY;
00102 }
00103 }
00104 else return BUFFER_EMPTY;
00105 }
00106
00107 U8 Uart1RxBufferCheckIsr(void){
00108 if(Uart1Ctrl.RxBuffer.Put!=Uart1Ctrl.RxBuffer.Get){
00109 if(Uart1Ctrl.RxBuffer.Put==(UART1_MAX_BUFFER_SIZE-1)){
00110 if(Uart1Ctrl.RxBuffer.Get==0) return BUFFER_FULL;
00111 else return BUFFER_NOT_EMPTY;
00112 }
00113 else{
00114 if((Uart1Ctrl.RxBuffer.Put+1)==Uart1Ctrl.RxBuffer.Get) return BUFFER_FULL;
00115 else return BUFFER_NOT_EMPTY;
00116 }
00117 }
00118 else return BUFFER_EMPTY;
00119 }
00120
00121 void Uart1RxBufferPutIsr(U8 Data){
00122 if(Uart1RxBufferCheckIsr()==BUFFER_FULL) return;
00123 if(Uart1Ctrl.RxBuffer.Put==(UART1_MAX_BUFFER_SIZE-1)){
00124 Uart1Ctrl.RxBuffer.Data[Uart1Ctrl.RxBuffer.Put]=Data;
00125 Uart1Ctrl.RxBuffer.Put=0;
00126 }
00127 else{
00128 Uart1Ctrl.RxBuffer.Data[Uart1Ctrl.RxBuffer.Put]=Data;
00129 Uart1Ctrl.RxBuffer.Put++;
00130 }
00131 }
00132
00133 U8 Uart1RxBufferGet(void){
00134 U8 Data;
00135
00136 if(Uart1RxBufferCheck()==BUFFER_EMPTY) return 0;
00137 if(Uart1Ctrl.RxBuffer.Get==(UART1_MAX_BUFFER_SIZE-1)){
00138 Data=Uart1Ctrl.RxBuffer.Data[Uart1Ctrl.RxBuffer.Get];
00139 Uart1Ctrl.RxBuffer.Get=0;
00140 }
00141 else{
00142 Data=Uart1Ctrl.RxBuffer.Data[Uart1Ctrl.RxBuffer.Get];
00143 Uart1Ctrl.RxBuffer.Get++;
00144 }
00145 return Data;
00146 }
00147
00148 U8 Uart1TxBufferCheck(void){
00149 if(Uart1Ctrl.TxBuffer.Put!=Uart1Ctrl.TxBuffer.Get){
00150 if(Uart1Ctrl.TxBuffer.Put==(UART1_MAX_BUFFER_SIZE-1)){
00151 if(Uart1Ctrl.TxBuffer.Get==0) return BUFFER_FULL;
00152 else return BUFFER_NOT_EMPTY;
00153 }
00154 else{
00155 if((Uart1Ctrl.TxBuffer.Put+1)==Uart1Ctrl.TxBuffer.Get) return BUFFER_FULL;
00156 else return BUFFER_NOT_EMPTY;
00157 }
00158 }
00159 else return BUFFER_EMPTY;
00160 }
00161
00162 U8 Uart1TxBufferCheckIsr(void){
00163 if(Uart1Ctrl.TxBuffer.Put!=Uart1Ctrl.TxBuffer.Get){
00164 if(Uart1Ctrl.TxBuffer.Put==(UART1_MAX_BUFFER_SIZE-1)){
00165 if(Uart1Ctrl.TxBuffer.Get==0) return BUFFER_FULL;
00166 else return BUFFER_NOT_EMPTY;
00167 }
00168 else{
00169 if((Uart1Ctrl.TxBuffer.Put+1)==Uart1Ctrl.TxBuffer.Get) return BUFFER_FULL;
00170 else return BUFFER_NOT_EMPTY;
00171 }
00172 }
00173 else return BUFFER_EMPTY;
00174 }
00175
00176 void Uart1TxBufferPut(U8 Data){
00177 if(Uart1TxBufferCheck()==BUFFER_FULL) return;
00178 if(Uart1Ctrl.TxBuffer.Put==(UART1_MAX_BUFFER_SIZE-1)){
00179 Uart1Ctrl.TxBuffer.Data[Uart1Ctrl.TxBuffer.Put]=Data;
00180 Uart1Ctrl.TxBuffer.Put=0;
00181 }
00182 else{
00183 Uart1Ctrl.TxBuffer.Data[Uart1Ctrl.TxBuffer.Put]=Data;
00184 Uart1Ctrl.TxBuffer.Put++;
00185 }
00186 }
00187
00188 U8 Uart1TxBufferGet(void){
00189 U8 Data;
00190
00191 if(Uart1TxBufferCheck()==BUFFER_EMPTY) return 0;
00192 if(Uart1Ctrl.TxBuffer.Get==(UART1_MAX_BUFFER_SIZE-1)){
00193 Data=Uart1Ctrl.TxBuffer.Data[Uart1Ctrl.TxBuffer.Get];
00194 Uart1Ctrl.TxBuffer.Get=0;
00195 }
00196 else{
00197 Data=Uart1Ctrl.TxBuffer.Data[Uart1Ctrl.TxBuffer.Get];
00198 Uart1Ctrl.TxBuffer.Get++;
00199 }
00200 return Data;
00201 }
00202
00203 U8 Uart1TxBufferGetIsr(void){
00204 U8 Data;
00205
00206
00207 if(Uart1Ctrl.TxBuffer.Get==(UART1_MAX_BUFFER_SIZE-1)){
00208 Data=Uart1Ctrl.TxBuffer.Data[Uart1Ctrl.TxBuffer.Get];
00209 Uart1Ctrl.TxBuffer.Get=0;
00210 }
00211 else{
00212 Data=Uart1Ctrl.TxBuffer.Data[Uart1Ctrl.TxBuffer.Get];
00213 Uart1Ctrl.TxBuffer.Get++;
00214 }
00215 return Data;
00216 }