1 /*++
2 
3 Copyright � 2001-2011 Future Technology Devices International Limited
4 
5 THIS SOFTWARE IS PROVIDED BY FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED "AS IS"
6 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
7 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
8 FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
9 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
10 OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION)
11 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
12 TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
13 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14 
15 FTDI DRIVERS MAY BE USED ONLY IN CONJUNCTION WITH PRODUCTS BASED ON FTDI PARTS.
16 
17 FTDI DRIVERS MAY BE DISTRIBUTED IN ANY FORM AS LONG AS LICENSE INFORMATION IS NOT MODIFIED.
18 
19 IF A CUSTOM VENDOR ID AND/OR PRODUCT ID OR DESCRIPTION STRING ARE USED, IT IS THE
20 RESPONSIBILITY OF THE PRODUCT MANUFACTURER TO MAINTAIN ANY CHANGES AND SUBSEQUENT WHQL
21 RE-CERTIFICATION AS A RESULT OF MAKING THESE CHANGES.
22 
23 
24 Module Name:
25 
26 ftd2xx.h
27 
28 Abstract:
29 
30 Native USB device driver for FTDI FT232x, FT245x, FT2232x and FT4232x devices
31 FTD2XX library definitions
32 
33 Environment:
34 
35 kernel & user mode
36 
37 
38 --*/
39 
40 
41 #ifndef FTD2XX_H
42 #define FTD2XX_H
43 
44 // The following ifdef block is the standard way of creating macros
45 // which make exporting from a DLL simpler.  All files within this DLL
46 // are compiled with the FTD2XX_EXPORTS symbol defined on the command line.
47 // This symbol should not be defined on any project that uses this DLL.
48 // This way any other project whose source files include this file see
49 // FTD2XX_API functions as being imported from a DLL, whereas this DLL
50 // sees symbols defined with this macro as being exported.
51 
52 #ifdef FTD2XX_EXPORTS
53 #define FTD2XX_API __declspec(dllexport)
54 #else
55 #define FTD2XX_API __declspec(dllimport)
56 #endif
57 
58 
59 typedef PVOID	FT_HANDLE;
60 typedef ULONG	FT_STATUS;
61 
62 //
63 // Device status
64 //
65 enum {
66 	FT_OK,
67 	FT_INVALID_HANDLE,
68 	FT_DEVICE_NOT_FOUND,
69 	FT_DEVICE_NOT_OPENED,
70 	FT_IO_ERROR,
71 	FT_INSUFFICIENT_RESOURCES,
72 	FT_INVALID_PARAMETER,
73 	FT_INVALID_BAUD_RATE,
74 
75 	FT_DEVICE_NOT_OPENED_FOR_ERASE,
76 	FT_DEVICE_NOT_OPENED_FOR_WRITE,
77 	FT_FAILED_TO_WRITE_DEVICE,
78 	FT_EEPROM_READ_FAILED,
79 	FT_EEPROM_WRITE_FAILED,
80 	FT_EEPROM_ERASE_FAILED,
81 	FT_EEPROM_NOT_PRESENT,
82 	FT_EEPROM_NOT_PROGRAMMED,
83 	FT_INVALID_ARGS,
84 	FT_NOT_SUPPORTED,
85 	FT_OTHER_ERROR,
86 	FT_DEVICE_LIST_NOT_READY,
87 };
88 
89 
90 #define FT_SUCCESS(status) ((status) == FT_OK)
91 
92 //
93 // FT_OpenEx Flags
94 //
95 
96 #define FT_OPEN_BY_SERIAL_NUMBER	1
97 #define FT_OPEN_BY_DESCRIPTION		2
98 #define FT_OPEN_BY_LOCATION			4
99 
100 //
101 // FT_ListDevices Flags (used in conjunction with FT_OpenEx Flags
102 //
103 
104 #define FT_LIST_NUMBER_ONLY			0x80000000
105 #define FT_LIST_BY_INDEX			0x40000000
106 #define FT_LIST_ALL					0x20000000
107 
108 #define FT_LIST_MASK (FT_LIST_NUMBER_ONLY|FT_LIST_BY_INDEX|FT_LIST_ALL)
109 
110 //
111 // Baud Rates
112 //
113 
114 #define FT_BAUD_300			300
115 #define FT_BAUD_600			600
116 #define FT_BAUD_1200		1200
117 #define FT_BAUD_2400		2400
118 #define FT_BAUD_4800		4800
119 #define FT_BAUD_9600		9600
120 #define FT_BAUD_14400		14400
121 #define FT_BAUD_19200		19200
122 #define FT_BAUD_38400		38400
123 #define FT_BAUD_57600		57600
124 #define FT_BAUD_115200		115200
125 #define FT_BAUD_230400		230400
126 #define FT_BAUD_460800		460800
127 #define FT_BAUD_921600		921600
128 
129 //
130 // Word Lengths
131 //
132 
133 #define FT_BITS_8			(UCHAR) 8
134 #define FT_BITS_7			(UCHAR) 7
135 
136 //
137 // Stop Bits
138 //
139 
140 #define FT_STOP_BITS_1		(UCHAR) 0
141 #define FT_STOP_BITS_2		(UCHAR) 2
142 
143 //
144 // Parity
145 //
146 
147 #define FT_PARITY_NONE		(UCHAR) 0
148 #define FT_PARITY_ODD		(UCHAR) 1
149 #define FT_PARITY_EVEN		(UCHAR) 2
150 #define FT_PARITY_MARK		(UCHAR) 3
151 #define FT_PARITY_SPACE		(UCHAR) 4
152 
153 //
154 // Flow Control
155 //
156 
157 #define FT_FLOW_NONE		0x0000
158 #define FT_FLOW_RTS_CTS		0x0100
159 #define FT_FLOW_DTR_DSR		0x0200
160 #define FT_FLOW_XON_XOFF	0x0400
161 
162 //
163 // Purge rx and tx buffers
164 //
165 #define FT_PURGE_RX			1
166 #define FT_PURGE_TX			2
167 
168 //
169 // Events
170 //
171 
172 typedef void (*PFT_EVENT_HANDLER)(DWORD,DWORD);
173 
174 #define FT_EVENT_RXCHAR			1
175 #define FT_EVENT_MODEM_STATUS	2
176 #define FT_EVENT_LINE_STATUS	4
177 
178 //
179 // Timeouts
180 //
181 
182 #define FT_DEFAULT_RX_TIMEOUT	300
183 #define FT_DEFAULT_TX_TIMEOUT	300
184 
185 //
186 // Device types
187 //
188 
189 typedef ULONG	FT_DEVICE;
190 
191 enum {
192 	FT_DEVICE_BM,
193 	FT_DEVICE_AM,
194 	FT_DEVICE_100AX,
195 	FT_DEVICE_UNKNOWN,
196 	FT_DEVICE_2232C,
197 	FT_DEVICE_232R,
198 	FT_DEVICE_2232H,
199 	FT_DEVICE_4232H,
200 	FT_DEVICE_232H
201 };
202 
203 //
204 // Bit Modes
205 //
206 
207 #define FT_BITMODE_RESET				0x00
208 #define FT_BITMODE_ASYNC_BITBANG		0x01
209 #define FT_BITMODE_MPSSE				0x02
210 #define FT_BITMODE_SYNC_BITBANG			0x04
211 #define FT_BITMODE_MCU_HOST				0x08
212 #define FT_BITMODE_FAST_SERIAL			0x10
213 #define FT_BITMODE_CBUS_BITBANG			0x20
214 #define FT_BITMODE_SYNC_FIFO			0x40
215 
216 //
217 // FT232R CBUS Options EEPROM values
218 //
219 
220 #define FT_232R_CBUS_TXDEN				0x00	//	Tx Data Enable
221 #define FT_232R_CBUS_PWRON				0x01	//	Power On
222 #define FT_232R_CBUS_RXLED				0x02	//	Rx LED
223 #define FT_232R_CBUS_TXLED				0x03	//	Tx LED
224 #define FT_232R_CBUS_TXRXLED			0x04	//	Tx and Rx LED
225 #define FT_232R_CBUS_SLEEP				0x05	//	Sleep
226 #define FT_232R_CBUS_CLK48				0x06	//	48MHz clock
227 #define FT_232R_CBUS_CLK24				0x07	//	24MHz clock
228 #define FT_232R_CBUS_CLK12				0x08	//	12MHz clock
229 #define FT_232R_CBUS_CLK6				0x09	//	6MHz clock
230 #define FT_232R_CBUS_IOMODE				0x0A	//	IO Mode for CBUS bit-bang
231 #define FT_232R_CBUS_BITBANG_WR			0x0B	//	Bit-bang write strobe
232 #define FT_232R_CBUS_BITBANG_RD			0x0C	//	Bit-bang read strobe
233 
234 //
235 // FT232H CBUS Options EEPROM values
236 //
237 
238 #define FT_232H_CBUS_TRISTATE			0x00	//	Tristate
239 #define FT_232H_CBUS_RXLED				0x01	//	Rx LED
240 #define FT_232H_CBUS_TXLED				0x02	//	Tx LED
241 #define FT_232H_CBUS_TXRXLED			0x03	//	Tx and Rx LED
242 #define FT_232H_CBUS_PWREN				0x04	//	Power Enable
243 #define FT_232H_CBUS_SLEEP				0x05	//	Sleep
244 #define FT_232H_CBUS_DRIVE_0			0x06	//	Drive pin to logic 0
245 #define FT_232H_CBUS_DRIVE_1			0x07	//	Drive pin to logic 1
246 #define FT_232H_CBUS_IOMODE				0x08	//	IO Mode for CBUS bit-bang
247 #define FT_232H_CBUS_TXDEN				0x09	//	Tx Data Enable
248 #define FT_232H_CBUS_CLK30				0x0A	//	30MHz clock
249 #define FT_232H_CBUS_CLK15				0x0B	//	15MHz clock
250 #define FT_232H_CBUS_CLK7_5				0x0C	//	7.5MHz clock
251 
252 
253 #ifdef __cplusplus
254 extern "C" {
255 #endif
256 
257 
258 	FTD2XX_API
259 		FT_STATUS WINAPI FT_Open(
260 		int deviceNumber,
261 		FT_HANDLE *pHandle
262 		);
263 
264 	FTD2XX_API
265 		FT_STATUS WINAPI FT_OpenEx(
266 		PVOID pArg1,
267 		DWORD Flags,
268 		FT_HANDLE *pHandle
269 		);
270 
271 	FTD2XX_API
272 		FT_STATUS WINAPI FT_ListDevices(
273 		PVOID pArg1,
274 		PVOID pArg2,
275 		DWORD Flags
276 		);
277 
278 	FTD2XX_API
279 		FT_STATUS WINAPI FT_Close(
280 		FT_HANDLE ftHandle
281 		);
282 
283 	FTD2XX_API
284 		FT_STATUS WINAPI FT_Read(
285 		FT_HANDLE ftHandle,
286 		LPVOID lpBuffer,
287 		DWORD dwBytesToRead,
288 		LPDWORD lpBytesReturned
289 		);
290 
291 	FTD2XX_API
292 		FT_STATUS WINAPI FT_Write(
293 		FT_HANDLE ftHandle,
294 		LPVOID lpBuffer,
295 		DWORD dwBytesToWrite,
296 		LPDWORD lpBytesWritten
297 		);
298 
299 	FTD2XX_API
300 		FT_STATUS WINAPI FT_IoCtl(
301 		FT_HANDLE ftHandle,
302 		DWORD dwIoControlCode,
303 		LPVOID lpInBuf,
304 		DWORD nInBufSize,
305 		LPVOID lpOutBuf,
306 		DWORD nOutBufSize,
307 		LPDWORD lpBytesReturned,
308 		LPOVERLAPPED lpOverlapped
309 		);
310 
311 	FTD2XX_API
312 		FT_STATUS WINAPI FT_SetBaudRate(
313 		FT_HANDLE ftHandle,
314 		ULONG BaudRate
315 		);
316 
317 	FTD2XX_API
318 		FT_STATUS WINAPI FT_SetDivisor(
319 		FT_HANDLE ftHandle,
320 		USHORT Divisor
321 		);
322 
323 	FTD2XX_API
324 		FT_STATUS WINAPI FT_SetDataCharacteristics(
325 		FT_HANDLE ftHandle,
326 		UCHAR WordLength,
327 		UCHAR StopBits,
328 		UCHAR Parity
329 		);
330 
331 	FTD2XX_API
332 		FT_STATUS WINAPI FT_SetFlowControl(
333 		FT_HANDLE ftHandle,
334 		USHORT FlowControl,
335 		UCHAR XonChar,
336 		UCHAR XoffChar
337 		);
338 
339 	FTD2XX_API
340 		FT_STATUS WINAPI FT_ResetDevice(
341 		FT_HANDLE ftHandle
342 		);
343 
344 	FTD2XX_API
345 		FT_STATUS WINAPI FT_SetDtr(
346 		FT_HANDLE ftHandle
347 		);
348 
349 	FTD2XX_API
350 		FT_STATUS WINAPI FT_ClrDtr(
351 		FT_HANDLE ftHandle
352 		);
353 
354 	FTD2XX_API
355 		FT_STATUS WINAPI FT_SetRts(
356 		FT_HANDLE ftHandle
357 		);
358 
359 	FTD2XX_API
360 		FT_STATUS WINAPI FT_ClrRts(
361 		FT_HANDLE ftHandle
362 		);
363 
364 	FTD2XX_API
365 		FT_STATUS WINAPI FT_GetModemStatus(
366 		FT_HANDLE ftHandle,
367 		ULONG *pModemStatus
368 		);
369 
370 	FTD2XX_API
371 		FT_STATUS WINAPI FT_SetChars(
372 		FT_HANDLE ftHandle,
373 		UCHAR EventChar,
374 		UCHAR EventCharEnabled,
375 		UCHAR ErrorChar,
376 		UCHAR ErrorCharEnabled
377 		);
378 
379 	FTD2XX_API
380 		FT_STATUS WINAPI FT_Purge(
381 		FT_HANDLE ftHandle,
382 		ULONG Mask
383 		);
384 
385 	FTD2XX_API
386 		FT_STATUS WINAPI FT_SetTimeouts(
387 		FT_HANDLE ftHandle,
388 		ULONG ReadTimeout,
389 		ULONG WriteTimeout
390 		);
391 
392 	FTD2XX_API
393 		FT_STATUS WINAPI FT_GetQueueStatus(
394 		FT_HANDLE ftHandle,
395 		DWORD *dwRxBytes
396 		);
397 
398 	FTD2XX_API
399 		FT_STATUS WINAPI FT_SetEventNotification(
400 		FT_HANDLE ftHandle,
401 		DWORD Mask,
402 		PVOID Param
403 		);
404 
405 	FTD2XX_API
406 		FT_STATUS WINAPI FT_GetStatus(
407 		FT_HANDLE ftHandle,
408 		DWORD *dwRxBytes,
409 		DWORD *dwTxBytes,
410 		DWORD *dwEventDWord
411 		);
412 
413 	FTD2XX_API
414 		FT_STATUS WINAPI FT_SetBreakOn(
415 		FT_HANDLE ftHandle
416 		);
417 
418 	FTD2XX_API
419 		FT_STATUS WINAPI FT_SetBreakOff(
420 		FT_HANDLE ftHandle
421 		);
422 
423 	FTD2XX_API
424 		FT_STATUS WINAPI FT_SetWaitMask(
425 		FT_HANDLE ftHandle,
426 		DWORD Mask
427 		);
428 
429 	FTD2XX_API
430 		FT_STATUS WINAPI FT_WaitOnMask(
431 		FT_HANDLE ftHandle,
432 		DWORD *Mask
433 		);
434 
435 	FTD2XX_API
436 		FT_STATUS WINAPI FT_GetEventStatus(
437 		FT_HANDLE ftHandle,
438 		DWORD *dwEventDWord
439 		);
440 
441 	FTD2XX_API
442 		FT_STATUS WINAPI FT_ReadEE(
443 		FT_HANDLE ftHandle,
444 		DWORD dwWordOffset,
445 		LPWORD lpwValue
446 		);
447 
448 	FTD2XX_API
449 		FT_STATUS WINAPI FT_WriteEE(
450 		FT_HANDLE ftHandle,
451 		DWORD dwWordOffset,
452 		WORD wValue
453 		);
454 
455 	FTD2XX_API
456 		FT_STATUS WINAPI FT_EraseEE(
457 		FT_HANDLE ftHandle
458 		);
459 
460 	//
461 	// structure to hold program data for FT_Program function
462 	//
463 	typedef struct ft_program_data {
464 
465 		DWORD Signature1;			// Header - must be 0x00000000
466 		DWORD Signature2;			// Header - must be 0xffffffff
467 		DWORD Version;				// Header - FT_PROGRAM_DATA version
468 		//			0 = original
469 		//			1 = FT2232C extensions
470 		//			2 = FT232R extensions
471 		//			3 = FT2232H extensions
472 		//			4 = FT4232H extensions
473 		//			5 = FT232H extensions
474 
475 		WORD VendorId;				// 0x0403
476 		WORD ProductId;				// 0x6001
477 		char *Manufacturer;			// "FTDI"
478 		char *ManufacturerId;		// "FT"
479 		char *Description;			// "USB HS Serial Converter"
480 		char *SerialNumber;			// "FT000001" if fixed, or NULL
481 		WORD MaxPower;				// 0 < MaxPower <= 500
482 		WORD PnP;					// 0 = disabled, 1 = enabled
483 		WORD SelfPowered;			// 0 = bus powered, 1 = self powered
484 		WORD RemoteWakeup;			// 0 = not capable, 1 = capable
485 		//
486 		// Rev4 (FT232B) extensions
487 		//
488 		UCHAR Rev4;					// non-zero if Rev4 chip, zero otherwise
489 		UCHAR IsoIn;				// non-zero if in endpoint is isochronous
490 		UCHAR IsoOut;				// non-zero if out endpoint is isochronous
491 		UCHAR PullDownEnable;		// non-zero if pull down enabled
492 		UCHAR SerNumEnable;			// non-zero if serial number to be used
493 		UCHAR USBVersionEnable;		// non-zero if chip uses USBVersion
494 		WORD USBVersion;			// BCD (0x0200 => USB2)
495 		//
496 		// Rev 5 (FT2232) extensions
497 		//
498 		UCHAR Rev5;					// non-zero if Rev5 chip, zero otherwise
499 		UCHAR IsoInA;				// non-zero if in endpoint is isochronous
500 		UCHAR IsoInB;				// non-zero if in endpoint is isochronous
501 		UCHAR IsoOutA;				// non-zero if out endpoint is isochronous
502 		UCHAR IsoOutB;				// non-zero if out endpoint is isochronous
503 		UCHAR PullDownEnable5;		// non-zero if pull down enabled
504 		UCHAR SerNumEnable5;		// non-zero if serial number to be used
505 		UCHAR USBVersionEnable5;	// non-zero if chip uses USBVersion
506 		WORD USBVersion5;			// BCD (0x0200 => USB2)
507 		UCHAR AIsHighCurrent;		// non-zero if interface is high current
508 		UCHAR BIsHighCurrent;		// non-zero if interface is high current
509 		UCHAR IFAIsFifo;			// non-zero if interface is 245 FIFO
510 		UCHAR IFAIsFifoTar;			// non-zero if interface is 245 FIFO CPU target
511 		UCHAR IFAIsFastSer;			// non-zero if interface is Fast serial
512 		UCHAR AIsVCP;				// non-zero if interface is to use VCP drivers
513 		UCHAR IFBIsFifo;			// non-zero if interface is 245 FIFO
514 		UCHAR IFBIsFifoTar;			// non-zero if interface is 245 FIFO CPU target
515 		UCHAR IFBIsFastSer;			// non-zero if interface is Fast serial
516 		UCHAR BIsVCP;				// non-zero if interface is to use VCP drivers
517 		//
518 		// Rev 6 (FT232R) extensions
519 		//
520 		UCHAR UseExtOsc;			// Use External Oscillator
521 		UCHAR HighDriveIOs;			// High Drive I/Os
522 		UCHAR EndpointSize;			// Endpoint size
523 		UCHAR PullDownEnableR;		// non-zero if pull down enabled
524 		UCHAR SerNumEnableR;		// non-zero if serial number to be used
525 		UCHAR InvertTXD;			// non-zero if invert TXD
526 		UCHAR InvertRXD;			// non-zero if invert RXD
527 		UCHAR InvertRTS;			// non-zero if invert RTS
528 		UCHAR InvertCTS;			// non-zero if invert CTS
529 		UCHAR InvertDTR;			// non-zero if invert DTR
530 		UCHAR InvertDSR;			// non-zero if invert DSR
531 		UCHAR InvertDCD;			// non-zero if invert DCD
532 		UCHAR InvertRI;				// non-zero if invert RI
533 		UCHAR Cbus0;				// Cbus Mux control
534 		UCHAR Cbus1;				// Cbus Mux control
535 		UCHAR Cbus2;				// Cbus Mux control
536 		UCHAR Cbus3;				// Cbus Mux control
537 		UCHAR Cbus4;				// Cbus Mux control
538 		UCHAR RIsD2XX;				// non-zero if using D2XX driver
539 		//
540 		// Rev 7 (FT2232H) Extensions
541 		//
542 		UCHAR PullDownEnable7;		// non-zero if pull down enabled
543 		UCHAR SerNumEnable7;		// non-zero if serial number to be used
544 		UCHAR ALSlowSlew;			// non-zero if AL pins have slow slew
545 		UCHAR ALSchmittInput;		// non-zero if AL pins are Schmitt input
546 		UCHAR ALDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
547 		UCHAR AHSlowSlew;			// non-zero if AH pins have slow slew
548 		UCHAR AHSchmittInput;		// non-zero if AH pins are Schmitt input
549 		UCHAR AHDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
550 		UCHAR BLSlowSlew;			// non-zero if BL pins have slow slew
551 		UCHAR BLSchmittInput;		// non-zero if BL pins are Schmitt input
552 		UCHAR BLDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
553 		UCHAR BHSlowSlew;			// non-zero if BH pins have slow slew
554 		UCHAR BHSchmittInput;		// non-zero if BH pins are Schmitt input
555 		UCHAR BHDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
556 		UCHAR IFAIsFifo7;			// non-zero if interface is 245 FIFO
557 		UCHAR IFAIsFifoTar7;		// non-zero if interface is 245 FIFO CPU target
558 		UCHAR IFAIsFastSer7;		// non-zero if interface is Fast serial
559 		UCHAR AIsVCP7;				// non-zero if interface is to use VCP drivers
560 		UCHAR IFBIsFifo7;			// non-zero if interface is 245 FIFO
561 		UCHAR IFBIsFifoTar7;		// non-zero if interface is 245 FIFO CPU target
562 		UCHAR IFBIsFastSer7;		// non-zero if interface is Fast serial
563 		UCHAR BIsVCP7;				// non-zero if interface is to use VCP drivers
564 		UCHAR PowerSaveEnable;		// non-zero if using BCBUS7 to save power for self-powered designs
565 		//
566 		// Rev 8 (FT4232H) Extensions
567 		//
568 		UCHAR PullDownEnable8;		// non-zero if pull down enabled
569 		UCHAR SerNumEnable8;		// non-zero if serial number to be used
570 		UCHAR ASlowSlew;			// non-zero if AL pins have slow slew
571 		UCHAR ASchmittInput;		// non-zero if AL pins are Schmitt input
572 		UCHAR ADriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
573 		UCHAR BSlowSlew;			// non-zero if AH pins have slow slew
574 		UCHAR BSchmittInput;		// non-zero if AH pins are Schmitt input
575 		UCHAR BDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
576 		UCHAR CSlowSlew;			// non-zero if BL pins have slow slew
577 		UCHAR CSchmittInput;		// non-zero if BL pins are Schmitt input
578 		UCHAR CDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
579 		UCHAR DSlowSlew;			// non-zero if BH pins have slow slew
580 		UCHAR DSchmittInput;		// non-zero if BH pins are Schmitt input
581 		UCHAR DDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
582 		UCHAR ARIIsTXDEN;			// non-zero if port A uses RI as RS485 TXDEN
583 		UCHAR BRIIsTXDEN;			// non-zero if port B uses RI as RS485 TXDEN
584 		UCHAR CRIIsTXDEN;			// non-zero if port C uses RI as RS485 TXDEN
585 		UCHAR DRIIsTXDEN;			// non-zero if port D uses RI as RS485 TXDEN
586 		UCHAR AIsVCP8;				// non-zero if interface is to use VCP drivers
587 		UCHAR BIsVCP8;				// non-zero if interface is to use VCP drivers
588 		UCHAR CIsVCP8;				// non-zero if interface is to use VCP drivers
589 		UCHAR DIsVCP8;				// non-zero if interface is to use VCP drivers
590 		//
591 		// Rev 9 (FT232H) Extensions
592 		//
593 		UCHAR PullDownEnableH;		// non-zero if pull down enabled
594 		UCHAR SerNumEnableH;		// non-zero if serial number to be used
595 		UCHAR ACSlowSlewH;			// non-zero if AC pins have slow slew
596 		UCHAR ACSchmittInputH;		// non-zero if AC pins are Schmitt input
597 		UCHAR ACDriveCurrentH;		// valid values are 4mA, 8mA, 12mA, 16mA
598 		UCHAR ADSlowSlewH;			// non-zero if AD pins have slow slew
599 		UCHAR ADSchmittInputH;		// non-zero if AD pins are Schmitt input
600 		UCHAR ADDriveCurrentH;		// valid values are 4mA, 8mA, 12mA, 16mA
601 		UCHAR Cbus0H;				// Cbus Mux control
602 		UCHAR Cbus1H;				// Cbus Mux control
603 		UCHAR Cbus2H;				// Cbus Mux control
604 		UCHAR Cbus3H;				// Cbus Mux control
605 		UCHAR Cbus4H;				// Cbus Mux control
606 		UCHAR Cbus5H;				// Cbus Mux control
607 		UCHAR Cbus6H;				// Cbus Mux control
608 		UCHAR Cbus7H;				// Cbus Mux control
609 		UCHAR Cbus8H;				// Cbus Mux control
610 		UCHAR Cbus9H;				// Cbus Mux control
611 		UCHAR IsFifoH;				// non-zero if interface is 245 FIFO
612 		UCHAR IsFifoTarH;			// non-zero if interface is 245 FIFO CPU target
613 		UCHAR IsFastSerH;			// non-zero if interface is Fast serial
614 		UCHAR IsFT1248H;			// non-zero if interface is FT1248
615 		UCHAR FT1248CpolH;			// FT1248 clock polarity - clock idle high (1) or clock idle low (0)
616 		UCHAR FT1248LsbH;			// FT1248 data is LSB (1) or MSB (0)
617 		UCHAR FT1248FlowControlH;	// FT1248 flow control enable
618 		UCHAR IsVCPH;				// non-zero if interface is to use VCP drivers
619 		UCHAR PowerSaveEnableH;		// non-zero if using ACBUS7 to save power for self-powered designs
620 
621 	} FT_PROGRAM_DATA, *PFT_PROGRAM_DATA;
622 
623 	FTD2XX_API
624 		FT_STATUS WINAPI FT_EE_Program(
625 		FT_HANDLE ftHandle,
626 		PFT_PROGRAM_DATA pData
627 		);
628 
629 	FTD2XX_API
630 		FT_STATUS WINAPI FT_EE_ProgramEx(
631 		FT_HANDLE ftHandle,
632 		PFT_PROGRAM_DATA pData,
633 		char *Manufacturer,
634 		char *ManufacturerId,
635 		char *Description,
636 		char *SerialNumber
637 		);
638 
639 	FTD2XX_API
640 		FT_STATUS WINAPI FT_EE_Read(
641 		FT_HANDLE ftHandle,
642 		PFT_PROGRAM_DATA pData
643 		);
644 
645 	FTD2XX_API
646 		FT_STATUS WINAPI FT_EE_ReadEx(
647 		FT_HANDLE ftHandle,
648 		PFT_PROGRAM_DATA pData,
649 		char *Manufacturer,
650 		char *ManufacturerId,
651 		char *Description,
652 		char *SerialNumber
653 		);
654 
655 	FTD2XX_API
656 		FT_STATUS WINAPI FT_EE_UASize(
657 		FT_HANDLE ftHandle,
658 		LPDWORD lpdwSize
659 		);
660 
661 	FTD2XX_API
662 		FT_STATUS WINAPI FT_EE_UAWrite(
663 		FT_HANDLE ftHandle,
664 		PUCHAR pucData,
665 		DWORD dwDataLen
666 		);
667 
668 	FTD2XX_API
669 		FT_STATUS WINAPI FT_EE_UARead(
670 		FT_HANDLE ftHandle,
671 		PUCHAR pucData,
672 		DWORD dwDataLen,
673 		LPDWORD lpdwBytesRead
674 		);
675 
676 	FTD2XX_API
677 		FT_STATUS WINAPI FT_SetLatencyTimer(
678 		FT_HANDLE ftHandle,
679 		UCHAR ucLatency
680 		);
681 
682 	FTD2XX_API
683 		FT_STATUS WINAPI FT_GetLatencyTimer(
684 		FT_HANDLE ftHandle,
685 		PUCHAR pucLatency
686 		);
687 
688 	FTD2XX_API
689 		FT_STATUS WINAPI FT_SetBitMode(
690 		FT_HANDLE ftHandle,
691 		UCHAR ucMask,
692 		UCHAR ucEnable
693 		);
694 
695 	FTD2XX_API
696 		FT_STATUS WINAPI FT_GetBitMode(
697 		FT_HANDLE ftHandle,
698 		PUCHAR pucMode
699 		);
700 
701 	FTD2XX_API
702 		FT_STATUS WINAPI FT_SetUSBParameters(
703 		FT_HANDLE ftHandle,
704 		ULONG ulInTransferSize,
705 		ULONG ulOutTransferSize
706 		);
707 
708 	FTD2XX_API
709 		FT_STATUS WINAPI FT_SetDeadmanTimeout(
710 		FT_HANDLE ftHandle,
711 		ULONG ulDeadmanTimeout
712 		);
713 
714 	FTD2XX_API
715 		FT_STATUS WINAPI FT_GetDeviceInfo(
716 		FT_HANDLE ftHandle,
717 		FT_DEVICE *lpftDevice,
718 		LPDWORD lpdwID,
719 		PCHAR SerialNumber,
720 		PCHAR Description,
721 		LPVOID Dummy
722 		);
723 
724 	FTD2XX_API
725 		FT_STATUS WINAPI FT_StopInTask(
726 		FT_HANDLE ftHandle
727 		);
728 
729 	FTD2XX_API
730 		FT_STATUS WINAPI FT_RestartInTask(
731 		FT_HANDLE ftHandle
732 		);
733 
734 	FTD2XX_API
735 		FT_STATUS WINAPI FT_SetResetPipeRetryCount(
736 		FT_HANDLE ftHandle,
737 		DWORD dwCount
738 		);
739 
740 	FTD2XX_API
741 		FT_STATUS WINAPI FT_ResetPort(
742 		FT_HANDLE ftHandle
743 		);
744 
745 	FTD2XX_API
746 		FT_STATUS WINAPI FT_CyclePort(
747 		FT_HANDLE ftHandle
748 		);
749 
750 
751 	//
752 	// Win32-type functions
753 	//
754 
755 	FTD2XX_API
756 		FT_HANDLE WINAPI FT_W32_CreateFile(
757 		LPCTSTR					lpszName,
758 		DWORD					dwAccess,
759 		DWORD					dwShareMode,
760 		LPSECURITY_ATTRIBUTES	lpSecurityAttributes,
761 		DWORD					dwCreate,
762 		DWORD					dwAttrsAndFlags,
763 		HANDLE					hTemplate
764 		);
765 
766 	FTD2XX_API
767 		BOOL WINAPI FT_W32_CloseHandle(
768 		FT_HANDLE ftHandle
769 		);
770 
771 	FTD2XX_API
772 		BOOL WINAPI FT_W32_ReadFile(
773 		FT_HANDLE ftHandle,
774 		LPVOID lpBuffer,
775 		DWORD nBufferSize,
776 		LPDWORD lpBytesReturned,
777 		LPOVERLAPPED lpOverlapped
778 		);
779 
780 	FTD2XX_API
781 		BOOL WINAPI FT_W32_WriteFile(
782 		FT_HANDLE ftHandle,
783 		LPVOID lpBuffer,
784 		DWORD nBufferSize,
785 		LPDWORD lpBytesWritten,
786 		LPOVERLAPPED lpOverlapped
787 		);
788 
789 	FTD2XX_API
790 		DWORD WINAPI FT_W32_GetLastError(
791 		FT_HANDLE ftHandle
792 		);
793 
794 	FTD2XX_API
795 		BOOL WINAPI FT_W32_GetOverlappedResult(
796 		FT_HANDLE ftHandle,
797 		LPOVERLAPPED lpOverlapped,
798 		LPDWORD lpdwBytesTransferred,
799 		BOOL bWait
800 		);
801 
802 	FTD2XX_API
803 		BOOL WINAPI FT_W32_CancelIo(
804 		FT_HANDLE ftHandle
805 		);
806 
807 
808 	//
809 	// Win32 COMM API type functions
810 	//
811 	typedef struct _FTCOMSTAT {
812 		DWORD fCtsHold : 1;
813 		DWORD fDsrHold : 1;
814 		DWORD fRlsdHold : 1;
815 		DWORD fXoffHold : 1;
816 		DWORD fXoffSent : 1;
817 		DWORD fEof : 1;
818 		DWORD fTxim : 1;
819 		DWORD fReserved : 25;
820 		DWORD cbInQue;
821 		DWORD cbOutQue;
822 	} FTCOMSTAT, *LPFTCOMSTAT;
823 
824 	typedef struct _FTDCB {
825 		DWORD DCBlength;			/* sizeof(FTDCB)						*/
826 		DWORD BaudRate;				/* Baudrate at which running			*/
827 		DWORD fBinary: 1;			/* Binary Mode (skip EOF check)			*/
828 		DWORD fParity: 1;			/* Enable parity checking				*/
829 		DWORD fOutxCtsFlow:1;		/* CTS handshaking on output			*/
830 		DWORD fOutxDsrFlow:1;		/* DSR handshaking on output			*/
831 		DWORD fDtrControl:2;		/* DTR Flow control						*/
832 		DWORD fDsrSensitivity:1;	/* DSR Sensitivity						*/
833 		DWORD fTXContinueOnXoff: 1;	/* Continue TX when Xoff sent			*/
834 		DWORD fOutX: 1;				/* Enable output X-ON/X-OFF				*/
835 		DWORD fInX: 1;				/* Enable input X-ON/X-OFF				*/
836 		DWORD fErrorChar: 1;		/* Enable Err Replacement				*/
837 		DWORD fNull: 1;				/* Enable Null stripping				*/
838 		DWORD fRtsControl:2;		/* Rts Flow control						*/
839 		DWORD fAbortOnError:1;		/* Abort all reads and writes on Error	*/
840 		DWORD fDummy2:17;			/* Reserved								*/
841 		WORD wReserved;				/* Not currently used					*/
842 		WORD XonLim;				/* Transmit X-ON threshold				*/
843 		WORD XoffLim;				/* Transmit X-OFF threshold				*/
844 		BYTE ByteSize;				/* Number of bits/byte, 4-8				*/
845 		BYTE Parity;				/* 0-4=None,Odd,Even,Mark,Space			*/
846 		BYTE StopBits;				/* 0,1,2 = 1, 1.5, 2					*/
847 		char XonChar;				/* Tx and Rx X-ON character				*/
848 		char XoffChar;				/* Tx and Rx X-OFF character			*/
849 		char ErrorChar;				/* Error replacement char				*/
850 		char EofChar;				/* End of Input character				*/
851 		char EvtChar;				/* Received Event character				*/
852 		WORD wReserved1;			/* Fill for now.						*/
853 	} FTDCB, *LPFTDCB;
854 
855 	typedef struct _FTTIMEOUTS {
856 		DWORD ReadIntervalTimeout;			/* Maximum time between read chars.	*/
857 		DWORD ReadTotalTimeoutMultiplier;	/* Multiplier of characters.		*/
858 		DWORD ReadTotalTimeoutConstant;		/* Constant in milliseconds.		*/
859 		DWORD WriteTotalTimeoutMultiplier;	/* Multiplier of characters.		*/
860 		DWORD WriteTotalTimeoutConstant;	/* Constant in milliseconds.		*/
861 	} FTTIMEOUTS,*LPFTTIMEOUTS;
862 
863 
864 	FTD2XX_API
865 		BOOL WINAPI FT_W32_ClearCommBreak(
866 		FT_HANDLE ftHandle
867 		);
868 
869 	FTD2XX_API
870 		BOOL WINAPI FT_W32_ClearCommError(
871 		FT_HANDLE ftHandle,
872 		LPDWORD lpdwErrors,
873 		LPFTCOMSTAT lpftComstat
874 		);
875 
876 	FTD2XX_API
877 		BOOL WINAPI FT_W32_EscapeCommFunction(
878 		FT_HANDLE ftHandle,
879 		DWORD dwFunc
880 		);
881 
882 	FTD2XX_API
883 		BOOL WINAPI FT_W32_GetCommModemStatus(
884 		FT_HANDLE ftHandle,
885 		LPDWORD lpdwModemStatus
886 		);
887 
888 	FTD2XX_API
889 		BOOL WINAPI FT_W32_GetCommState(
890 		FT_HANDLE ftHandle,
891 		LPFTDCB lpftDcb
892 		);
893 
894 	FTD2XX_API
895 		BOOL WINAPI FT_W32_GetCommTimeouts(
896 		FT_HANDLE ftHandle,
897 		FTTIMEOUTS *pTimeouts
898 		);
899 
900 	FTD2XX_API
901 		BOOL WINAPI FT_W32_PurgeComm(
902 		FT_HANDLE ftHandle,
903 		DWORD dwMask
904 		);
905 
906 	FTD2XX_API
907 		BOOL WINAPI FT_W32_SetCommBreak(
908 		FT_HANDLE ftHandle
909 		);
910 
911 	FTD2XX_API
912 		BOOL WINAPI FT_W32_SetCommMask(
913 		FT_HANDLE ftHandle,
914 		ULONG ulEventMask
915 		);
916 
917 	FTD2XX_API
918 		BOOL WINAPI FT_W32_GetCommMask(
919 		FT_HANDLE ftHandle,
920 		LPDWORD lpdwEventMask
921 		);
922 
923 	FTD2XX_API
924 		BOOL WINAPI FT_W32_SetCommState(
925 		FT_HANDLE ftHandle,
926 		LPFTDCB lpftDcb
927 		);
928 
929 	FTD2XX_API
930 		BOOL WINAPI FT_W32_SetCommTimeouts(
931 		FT_HANDLE ftHandle,
932 		FTTIMEOUTS *pTimeouts
933 		);
934 
935 	FTD2XX_API
936 		BOOL WINAPI FT_W32_SetupComm(
937 		FT_HANDLE ftHandle,
938 		DWORD dwReadBufferSize,
939 		DWORD dwWriteBufferSize
940 		);
941 
942 	FTD2XX_API
943 		BOOL WINAPI FT_W32_WaitCommEvent(
944 		FT_HANDLE ftHandle,
945 		PULONG pulEvent,
946 		LPOVERLAPPED lpOverlapped
947 		);
948 
949 
950 	//
951 	// Device information
952 	//
953 
954 	typedef struct _ft_device_list_info_node {
955 		ULONG Flags;
956 		ULONG Type;
957 		ULONG ID;
958 		DWORD LocId;
959 		char SerialNumber[16];
960 		char Description[64];
961 		FT_HANDLE ftHandle;
962 	} FT_DEVICE_LIST_INFO_NODE;
963 
964 	// Device information flags
965 	enum {
966 		FT_FLAGS_OPENED = 1,
967 		FT_FLAGS_HISPEED = 2
968 	};
969 
970 
971 	FTD2XX_API
972 		FT_STATUS WINAPI FT_CreateDeviceInfoList(
973 		LPDWORD lpdwNumDevs
974 		);
975 
976 	FTD2XX_API
977 		FT_STATUS WINAPI FT_GetDeviceInfoList(
978 		FT_DEVICE_LIST_INFO_NODE *pDest,
979 		LPDWORD lpdwNumDevs
980 		);
981 
982 	FTD2XX_API
983 		FT_STATUS WINAPI FT_GetDeviceInfoDetail(
984 		DWORD dwIndex,
985 		LPDWORD lpdwFlags,
986 		LPDWORD lpdwType,
987 		LPDWORD lpdwID,
988 		LPDWORD lpdwLocId,
989 		LPVOID lpSerialNumber,
990 		LPVOID lpDescription,
991 		FT_HANDLE *pftHandle
992 		);
993 
994 
995 	//
996 	// Version information
997 	//
998 
999 	FTD2XX_API
1000 		FT_STATUS WINAPI FT_GetDriverVersion(
1001 		FT_HANDLE ftHandle,
1002 		LPDWORD lpdwVersion
1003 		);
1004 
1005 	FTD2XX_API
1006 		FT_STATUS WINAPI FT_GetLibraryVersion(
1007 		LPDWORD lpdwVersion
1008 		);
1009 
1010 
1011 	FTD2XX_API
1012 		FT_STATUS WINAPI FT_Rescan(
1013 		void
1014 		);
1015 
1016 	FTD2XX_API
1017 		FT_STATUS WINAPI FT_Reload(
1018 		WORD wVid,
1019 		WORD wPid
1020 		);
1021 
1022 	FTD2XX_API
1023 		FT_STATUS WINAPI FT_GetComPortNumber(
1024 		FT_HANDLE ftHandle,
1025 		LPLONG	lpdwComPortNumber
1026 		);
1027 
1028 
1029 	//
1030 	// FT232H additional EEPROM functions
1031 	//
1032 
1033 	FTD2XX_API
1034 		FT_STATUS WINAPI FT_EE_ReadConfig(
1035 		FT_HANDLE ftHandle,
1036 		UCHAR ucAddress,
1037 		PUCHAR pucValue
1038 		);
1039 
1040 	FTD2XX_API
1041 		FT_STATUS WINAPI FT_EE_WriteConfig(
1042 		FT_HANDLE ftHandle,
1043 		UCHAR ucAddress,
1044 		UCHAR ucValue
1045 		);
1046 
1047 	FTD2XX_API
1048 		FT_STATUS WINAPI FT_EE_ReadECC(
1049 		FT_HANDLE ftHandle,
1050 		UCHAR ucOption,
1051 		LPWORD lpwValue
1052 		);
1053 
1054 	FTD2XX_API
1055 		FT_STATUS WINAPI FT_GetQueueStatusEx(
1056 		FT_HANDLE ftHandle,
1057 		DWORD *dwRxBytes
1058 		);
1059 
1060 
1061 #ifdef __cplusplus
1062 }
1063 #endif
1064 
1065 
1066 #endif	/* FTD2XX_H */
1067 
1068