00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "lpc2000.h"
00023
00024
00025
00026
00027 #include "global.h"
00028 #include "timer.h"
00029 #include "membus.h"
00030 #include "ft245.h"
00031
00032
00033 static char ft245RxData[FT245_RX_BUFFER_SIZE];
00034 cBuffer ft245RxBuffer;
00035
00036
00037 void ft245Init(void)
00038 {
00039 #ifdef FT245_PORT_INTERFACE
00040
00041
00042 cbi(FT245_CTRL_DDR, FT245_TXE);
00043 cbi(FT245_CTRL_DDR, FT245_RXF);
00044
00045
00046 sbi(FT245_CTRL_PORT, FT245_TXE);
00047 sbi(FT245_CTRL_PORT, FT245_RXF);
00048
00049
00050
00051 sbi(FT245_CTRL_DDR, FT245_RESET);
00052 sbi(FT245_CTRL_DDR, FT245_WR);
00053 sbi(FT245_CTRL_DDR, FT245_RD);
00054
00055 sbi(FT245_CTRL_PORT, FT245_RESET);
00056 cbi(FT245_CTRL_PORT, FT245_WR);
00057 sbi(FT245_CTRL_PORT, FT245_RD);
00058
00059
00060 outb(FT245_DATA_DDR, 0x00);
00061 outb(FT245_DATA_PORT, 0xFF);
00062 #endif
00063 #ifdef FT245_MEMBUS_INTERFACE
00064
00065 membusInit();
00066
00067 IODIR &= FT245_TXE;
00068 IODIR &= FT245_RXF;
00069 #endif
00070
00071 bufferInit(&ft245RxBuffer, ft245RxData, FT245_RX_BUFFER_SIZE);
00072
00073
00074
00075
00076 }
00077
00078 void ft245Reset(void)
00079 {
00080 #ifdef FT245_PORT_INTERFACE
00081
00082 cbi(FT245_CTRL_PORT, FT245_RESET);
00083
00084 timerPause(1);
00085
00086 sbi(FT245_CTRL_PORT, FT245_RESET);
00087 #endif
00088 #ifdef FT245_MEMBUS_INTERFACE
00089
00090 #endif
00091 }
00092
00093 u08 ft245ReadByte(void)
00094 {
00095 #ifdef FT245_PORT_INTERFACE
00096 u08 data;
00097
00098 outb(FT245_DATA_DDR, 0x00);
00099
00100 cbi(FT245_CTRL_PORT, FT245_RD);
00101
00102 asm volatile ("nop");
00103 asm volatile ("nop");
00104 asm volatile ("nop");
00105 asm volatile ("nop");
00106
00107 data = inb(FT245_DATA_PORTIN);
00108
00109 sbi(FT245_CTRL_PORT, FT245_RD);
00110
00111 return data;
00112 #endif
00113 #ifdef FT245_MEMBUS_INTERFACE
00114 return membusRead(FT245_BASE_ADDRESS);
00115 #endif
00116 }
00117
00118 void ft245WriteByte(u08 data)
00119 {
00120 #ifdef FT245_PORT_INTERFACE
00121
00122 while(!ft245CheckTxFifo());
00123
00124 sbi(FT245_CTRL_PORT, FT245_WR);
00125
00126 outb(FT245_DATA_DDR, 0xFF);
00127
00128 outb(FT245_DATA_PORT, data);
00129
00130 asm volatile ("nop");
00131 asm volatile ("nop");
00132 asm volatile ("nop");
00133 asm volatile ("nop");
00134
00135 cbi(FT245_CTRL_PORT, FT245_WR);
00136
00137 outb(FT245_DATA_DDR, 0x00);
00138 outb(FT245_DATA_PORT, 0xFF);
00139 #endif
00140 #ifdef FT245_MEMBUS_INTERFACE
00141 return membusWrite(FT245_BASE_ADDRESS, data);
00142 #endif
00143 }
00144
00145 u08 ft245CheckRxFifo(void)
00146 {
00147
00148
00149
00150 #ifdef FT245_PORT_INTERFACE
00151 if( inb(FT245_CTRL_PORTIN) & (1<<FT245_RXF) )
00152 return FALSE;
00153 else
00154 return TRUE;
00155 #endif
00156 #ifdef FT245_MEMBUS_INTERFACE
00157 if(IOPIN & FT245_RXF)
00158 return FALSE;
00159 else
00160 return TRUE;
00161 #endif
00162 }
00163
00164 u08 ft245CheckTxFifo(void)
00165 {
00166
00167
00168
00169 #ifdef FT245_PORT_INTERFACE
00170 if( inb(FT245_CTRL_PORTIN) & (1<<FT245_TXE) )
00171 return FALSE;
00172 else
00173 return TRUE;
00174 #endif
00175 #ifdef FT245_MEMBUS_INTERFACE
00176 if(IOPIN & FT245_TXE)
00177 return FALSE;
00178 else
00179 return TRUE;
00180 #endif
00181 }
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196 void ft245SendByte(u08 data)
00197 {
00198
00199 while(!ft245CheckTxFifo());
00200
00201 ft245WriteByte(data);
00202 }
00203
00204 cBuffer* ft245GetRxBuffer(void)
00205 {
00206
00207
00208
00209
00210
00211
00212 while(ft245CheckRxFifo())
00213 {
00214 bufferAddToEnd(&ft245RxBuffer, ft245ReadByte());
00215 }
00216
00217 return &ft245RxBuffer;
00218 }