diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 51fc5168670c26863f4646bf0c6822dad95b9c1e..b12e433527fce6c419903e208b6f9d218dff2195 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -14,18 +14,20 @@ ELSE(FTDI_INCLUDE_DIR AND FTDI_LIBRARY)
   #use the local copies if possible
   FIND_PATH(FTDI_INCLUDE_DIR ftd2xx.h WinTypes.h ${ftdi_local_dir})
   MESSAGE(STATUS "INCLUDE ${FTDI_INCLUDE_DIR}" )
+  SET(FTDI_LIBRARY)
   if (UNIX AND NOT WIN32)
     if (CMAKE_SIZEOF_VOID_P MATCHES "8")
       FIND_LIBRARY(FTDI_LIBRARY  NAMES ftd2xx PATHS ${ftdi_local_dir}/build/x86_64)
       MESSAGE(STATUS "LIB64 ${FTDI_LIBRARY}")
     else (CMAKE_SIZEOF_VOID_P MATCHES "8")
-      FIND_LIBRARY(FTDI_LIBRARY  NAMES ftd2xx PATHS ${ftdi_local_dir}/build/i386)
+      FIND_LIBRARY(FTDI_LIBRARY  NAMES ${ftdi_libs} PATHS ${ftdi_local_dir}/build/i386)
       MESSAGE(STATUS "LIB32 ${FTDI_LIBRARY}")
     endif (CMAKE_SIZEOF_VOID_P MATCHES "8")
   endif (UNIX AND NOT WIN32)  
   IF(FTDI_INCLUDE_DIR AND FTDI_LIBRARY)
     SET(BUILD_FTDI TRUE)
     SET(INSTALL_FTDI TRUE)
+    SET(FTDI_VER 1.1.12)
     MESSAGE(STATUS "Use local ftdi files")
   ELSE(FTDI_INCLUDE_DIR AND FTDI_LIBRARY)
     MESSAGE(STATUS "FTDI library won't be build. Impossible to locate the necessary files")     
@@ -81,8 +83,6 @@ IF(INSTALL_FTDI)
 INSTALL(FILES ${ftdi_local_dir}/ftd2xx.h DESTINATION include)
 INSTALL(FILES ${ftdi_local_dir}/WinTypes.h DESTINATION include)
 INSTALL(FILES ${FTDI_LIBRARY} DESTINATION lib)
-INSTALL(FILES ${FTDI_LIBRARY}.1 DESTINATION lib)
-INSTALL(FILES ${FTDI_LIBRARY}.1.0.4 DESTINATION lib)
-
+INSTALL(FILES ${FTDI_LIBRARY}.${FTDI_VER} DESTINATION lib)
 ENDIF(INSTALL_FTDI)
 ADD_SUBDIRECTORY(examples)
diff --git a/tools/libftd2/README.dat b/tools/libftd2/README.dat
deleted file mode 100755
index 435af05fac2b64ffc45432d665ce49afad1fea12..0000000000000000000000000000000000000000
--- a/tools/libftd2/README.dat
+++ /dev/null
@@ -1,150 +0,0 @@
-Instructions for installing the D2XX shared lib
-As Linux distributions vary these instructions are a guide to installation and use.
-This setup works with Mandrake 9.2 but may require some investigation on other distributions.
-
-This library has been tested using kernel 2.6.32. 
-
-D2XX documentation is available for the Windows DLL - some variations may occur between Linux and 
-Windows implementation. We have endevoured to make the APIs appear the same on both platforms however some
-issues may slip and we would appreciate that you contact support if you observe this.
-
-D2XX for Linux was primarily developed to aid porting windows applications written with D2XX to Linux.
-Unfortunately the source code for D2XX is not freely available - however if you prefer to have the 
-source and are starting a project from scratch you can try libftdi from Thomas Jarosch. 
-
-
-libftd2xx uses an unmodified version of libusb (http://libusb.wiki.sourceforge.net/).  Source code for libusb is included in the driver distribution in the libusb-1.0.8 directory.
-
-
-Installation:
-1. unzip and untar the file given to a suitable directory
-gunzip libftd2xx1.0.4.tar.gz
-tar -xvf libftd2xx1.0.4.tar
-
-2. Change directory to the required architecture subdirectory, build/i386 for 32-bit or build/x86_64 for 64-bit.
-
-3. As root user copy the following files to /usr/local/lib
-cp libftd2xx.so.1.0.4 /usr/local/lib
-
-3. Change directory to /usr/local/lib
-cd /usr/local/lib
-
-4. make symbolic links to these files using the following commands:
-ln -s libftd2xx.so.1.0.4 libftd2xx.so
-
-5. Change directory to /usr/lib
-cd /usr/lib
-
-6. make symbolic links to these files using the following commands:
-ln -s /usr/local/lib/libftd2xx.so.1.0.4 libftd2xx.so
-
-
-If you have problems with this check with usbview (search on the internet for application 
-or it can be sent to you by ftdi) or lsusb (command line tool) to check the usb file system is mounted properly.  
-
-Other problems will be related to the ftdi_sio driver loading - 
-1.you must unload this driver (and usbserial) if it is attached to your device ("rmmod ftdi_sio" and "rmmod usbserial" as root user). 
-2.Your PID/VID has not been included in the distribution.A PID of 0x6006 and VID of
-0x0403 should work as a temporary workaround.
-
-Release 1.0.4
-Added support for FT232H devices.
-
-Release 1.0.3
-Resolved issue in FT_ListDevices that could cause a crash.
-
-Release 1.0.2
-Eliminated dependence on GLIBC 2.7.
-Eliminated dependence on GLIBC 2.8.
-Fixed issues where invalid device serial numbers or descriptions could open channels on multi-interface devices.
-
-Release 1.0.1
-Resolved issue where attempting to unload kernel driver can allow multiple D2XX processes to access a single device concurrently.
-Eliminated dependence on GLIBC 2.4.
-
-Release 1.0.0
-Major upgrade.  
-Now uses libusb 1.0.8 - requires udev (present on all 2.6 kernels).
-Numerous bug fixes.
-Now supports location IDs.
-
-Release 0.4.14
-Enhancement to enable library use in SuSe 10.2 default kernel.
-Correct FT_GetDeviceInfoList behaviour.
-
-Release 0.4.13
-Software flow control fix (strip out flow control characters)
-Added FT_SetDeadmanTimeout API call
-
-Release 0.4.12
-Configuration file (see Config.txt for further details) option added to perform a usb reset
-on device open.
-
-Release 0.4.11
-FT_SetUSBParameters enhanced - checks for invalid parameters
-New driver version functions added.
-Altered behaviour of a usb reset - only performed on unopened device (2.6 kernels only)
-Improved multithreaded access.
-
-Release 0.4.10
-W32 functions and samples added (for the extra event handling)
-FT232R EEPROM support added.
-Some minor bug fixes regarding FT_OpenEx.
-More robust checking of passed in arguments. Will fail on an invalid handle and NULL pointers instead
-of causing Segmentation Faults.
-
-Release 0.4.9
-Additional OpenEx bug fix - please report any future bugs as alternate dirstibutions 
-may behave in a different manner.
-100% CPU count fix when using FT_SetBitMode and not using FT_Read to clear internal buffers.
-
-Release 0.4.8
-Open bug fix - related to the detach of ftdi_sio kernel driver.
-
-Release 0.4.7
-Read timeout bug fix.
-
-Release 0.4.6 (known as 0.4.6 on the web)
-Bug fix to allow user area of FT2232 chip to be programmed.
-
-Release 0.4.5 (known as 0.4.5 on the web)
-Small change to allow detach of ftdi_sio kernel driver on device access.
-
-Release 0.4.4 (known as 0.4.4 on the web)
-Added FT_CreateDeviceInfoList, FT_GetDeviceInfoList, FT_GetDeviceInfoDetail, FT_EE_ReadEx and
-FT_EE_ProgramEx.
-
-Release 0.4.3 (known as 0.4.3 on the web)
-Bug fix for 2.6 kernels with bulk writes - library now requres "/proc/sys/kernel/osrelease" file to be present in system
-
-Release 0.4.2 (known as 0.4.2 on the web)
-Bug fix for the lib_table functionality. Now works with both static and dynamic 
-library versions.
-
-Release 0.4.1 (known as 1.1.0.1 on the web)
-Minor bug fix relating to modem event notification
-
-Release 0.4.0 (known as 1.1.0.0 on the web)
-User space driver compiled with gcc version 3.3.1
-Major restructure of internals - it is now a pure c library so no c++ extensions required. 
-Should help with some c++ linkage problems. Upped version to 0.4.0 for this reason. PLEASE NOTE
-due to the conversion from c++ to c there is an unlikely chance you will experience problems.
-If you do a recompile of your application may solve this. If not please contact support. Users of the
-PenScope and Dualscope so will experience problems related to this. Please contact support for a suitable update.
-FT_GetBitMode Bug Fix
-FT_Read on a timeout Bug Fix
-FT_GetStatus Bug fix
-static library available (see static folder on how to compile)
-static linkage to libusb to avoid installation issues
-
-Release 0.3.0 (known as 1.0.0.0 on the web)
-Timeouts added.
-EEPROM reading/writitng.
-Event handling added (see example on how to use)
-More examples to help with development
-FT_SetVIDPID added - to allow setting of VID and PID - see example
-
-
-Known issues:
-
-
diff --git a/tools/libftd2/ReadMe.txt b/tools/libftd2/ReadMe.txt
new file mode 100644
index 0000000000000000000000000000000000000000..7de395f19d6f601f77647d227fb7e60d1dab8773
--- /dev/null
+++ b/tools/libftd2/ReadMe.txt
@@ -0,0 +1,124 @@
+D2XX for Linux
+--------------
+
+As Linux distributions vary these instructions are a guide to installation 
+and use.  FTDI has tested the driver and samples with Ubuntu 12.04 (kernel 
+version 3.2) for i386 and x86_64, and Debian 6 'squeeze' (kernel version 
+2.6.32) for arm926.
+
+FTDI developed libftd2xx primarily to aid porting Windows applications 
+written with D2XX to Linux.  We intend the APIs to behave the same on
+Windows and Linux so if you notice any differences, please contact us 
+(see http://www.ftdichip.com/FTSupport.htm).
+
+FTDI do not release the source code for libftd2xx.  If you prefer to work
+with source code and are starting a project from scratch, consider using
+the open-source libFTDI.
+
+libftd2xx uses an unmodified version of libusb 
+(http://sourceforge.net/projects/libusb/).  Source code for libusb is 
+included in the driver distribution.
+
+
+
+Installing the D2XX shared library and static library.
+------------------------------------------------------
+
+1.  tar xfvz libftd2xx1.1.12.tar.gz
+
+This unpacks the archive, creating the following directory structure:
+
+    build
+        arm926
+        i386
+        x86_64
+    examples
+    libusb
+    ftd2xx.h
+    WinTypes.h
+
+2.  cd build/arm926
+
+3.  sudo -s 
+  or, if sudo is not available on your system: 
+    su
+
+Promotes you to super-user, with installation privileges.  If you're
+already root, then step 3 (and step 7) is not necessary.
+
+4.  cp lib* /usr/local/lib
+
+Copies the libraries to a central location.
+
+5.  chmod 0755 /usr/local/lib/libftd2xx.so.1.1.12
+
+Allows non-root access to the shared object.
+
+6.  ln -sf /usr/local/lib/libftd2xx.so.1.1.12 /usr/local/lib/libftd2xx.so
+
+Creates a symbolic link to the 1.1.12 version of the shared object.
+
+7.  exit
+
+Ends your super-user session.
+
+
+
+Building the shared-object examples.
+------------------------------------
+
+1.  cd examples
+
+2.  make -B
+
+This builds all the shared-object examples in subdirectories.
+
+With an FTDI device connected to a USB port, try one of the 
+examples, e.g. reading EEPROM.
+
+3.  cd EEPROM/read
+
+4.  sudo ./read
+
+If the message "FT_Open failed" appears:
+    Perhaps the kernel automatically loaded another driver for the 
+    FTDI USB device.
+
+    sudo lsmod
+
+    If "ftdi_sio" is listed:
+        Unload it (and its helper module, usbserial), as follows.
+
+        sudo rmmod ftdi_sio
+        sudo rmmod usbserial
+
+    Otherwise, it's possible that libftd2xx does not recognise your 
+    device's Vendor and Product Identifiers.  Call FT_SetVIDPID before
+    calling FT_Open/FT_OpenEx/FT_ListDevices.
+
+
+
+Building the static-library example.
+------------------------------------
+
+1.  cd examples/static
+
+2.  rm lib*
+
+Cleans out any existing libraries built for another target.
+
+3.  cp /usr/local/lib/libftd2xx.a .
+
+4.  make -B
+
+5.  sudo ./static_link
+
+This example demonstrates writing to, and reading from, a device with
+a loop-back connector attached.
+
+
+
+The examples show how to call a small subset of the D2XX API.  The full
+API is available here:
+http://www.ftdichip.com/Support/Documents/ProgramGuides/D2XX_Programmer%27s_Guide(FT_000071).pdf
+
diff --git a/tools/libftd2/WinTypes.h b/tools/libftd2/WinTypes.h
index e8b5b0908115d313bfce0fafb451b3ce97e82bf0..3eedefcca24ff4ec86662889d130fb32fa08f3e1 100755
--- a/tools/libftd2/WinTypes.h
+++ b/tools/libftd2/WinTypes.h
@@ -1,6 +1,8 @@
 #ifndef __WINDOWS_TYPES__
 #define __WINDOWS_TYPES__
 
+#define WINAPI
+
 #define MAX_NUM_DEVICES 50
 #include <sys/time.h>
 
@@ -26,9 +28,11 @@ typedef int						INT;
 typedef unsigned int			UINT;
 typedef char					*LPSTR;
 typedef char					*LPTSTR;
+typedef const char				*LPCTSTR;
 typedef DWORD					*LPDWORD;
 typedef WORD					*LPWORD;
 typedef ULONG					*PULONG;
+typedef LONG					*LPLONG;
 typedef PVOID					LPVOID;
 typedef void					VOID;
 typedef unsigned long long int	ULONGLONG;
@@ -67,7 +71,6 @@ typedef struct timeval FILETIME;
 //
 // Error Flags
 //
-
 #define CE_RXOVER           0x0001  // Receive Queue overflow
 #define CE_OVERRUN          0x0002  // Receive Overrun Error
 #define CE_RXPARITY         0x0004  // Receive Parity Error
@@ -80,6 +83,44 @@ typedef struct timeval FILETIME;
 #define CE_OOP              0x1000  // LPTx Out-Of-Paper
 #define CE_MODE             0x8000  // Requested mode unsupported
 
+//
+// Events
+//
+#define EV_RXCHAR           0x0001  // Any Character received
+#define EV_RXFLAG           0x0002  // Received certain character
+#define EV_TXEMPTY          0x0004  // Transmit Queue Empty
+#define EV_CTS              0x0008  // CTS changed state
+#define EV_DSR              0x0010  // DSR changed state
+#define EV_RLSD             0x0020  // RLSD changed state
+#define EV_BREAK            0x0040  // BREAK received
+#define EV_ERR              0x0080  // Line status error occurred
+#define EV_RING             0x0100  // Ring signal detected
+#define EV_PERR             0x0200  // Printer error occured
+#define EV_RX80FULL         0x0400  // Receive buffer is 80 percent full
+#define EV_EVENT1           0x0800  // Provider specific event 1
+#define EV_EVENT2           0x1000  // Provider specific event 2
+
+//
+// Escape Functions
+//
+#define SETXOFF             1       // Simulate XOFF received
+#define SETXON              2       // Simulate XON received
+#define SETRTS              3       // Set RTS high
+#define CLRRTS              4       // Set RTS low
+#define SETDTR              5       // Set DTR high
+#define CLRDTR              6       // Set DTR low
+#define RESETDEV            7       // Reset device if possible
+#define SETBREAK            8       // Set the device break line.
+#define CLRBREAK            9       // Clear the device break line.
+
+//
+// PURGE function flags.
+//
+#define PURGE_TXABORT       0x0001  // Kill the pending/current writes to the comm port.
+#define PURGE_RXABORT       0x0002  // Kill the pending/current reads to the comm port.
+#define PURGE_TXCLEAR       0x0004  // Kill the transmit queue if there.
+#define PURGE_RXCLEAR       0x0008  // Kill the typeahead buffer if there.
+
 #ifndef INVALID_HANDLE_VALUE
 #define INVALID_HANDLE_VALUE 0xFFFFFFFF
 #endif
diff --git a/tools/libftd2/build/i386/libftd2xx.so b/tools/libftd2/build/i386/libftd2xx.so
index 22c9be605762da510f42e95d253967a0047515af..dd95de9f415ff066b30ff0db19c17079e1947ba2 120000
--- a/tools/libftd2/build/i386/libftd2xx.so
+++ b/tools/libftd2/build/i386/libftd2xx.so
@@ -1 +1 @@
-libftd2xx.so.1
\ No newline at end of file
+libftd2xx.so.1.1.12
\ No newline at end of file
diff --git a/tools/libftd2/build/i386/libftd2xx.so.1 b/tools/libftd2/build/i386/libftd2xx.so.1
deleted file mode 120000
index 9a639ee448db7cf9ebf92507cbfb8500fc711213..0000000000000000000000000000000000000000
--- a/tools/libftd2/build/i386/libftd2xx.so.1
+++ /dev/null
@@ -1 +0,0 @@
-libftd2xx.so.1.0.4
\ No newline at end of file
diff --git a/tools/libftd2/build/i386/libftd2xx.so.1.0.4 b/tools/libftd2/build/i386/libftd2xx.so.1.0.4
deleted file mode 100755
index c8ef7dd361d94faf2ac2cd281b6167df500bc30e..0000000000000000000000000000000000000000
Binary files a/tools/libftd2/build/i386/libftd2xx.so.1.0.4 and /dev/null differ
diff --git a/tools/libftd2/build/i386/libftd2xx.so.1.1.12 b/tools/libftd2/build/i386/libftd2xx.so.1.1.12
new file mode 100755
index 0000000000000000000000000000000000000000..0c10cfe02fe375d93d7d6a4ff47a1f792d43a9c9
Binary files /dev/null and b/tools/libftd2/build/i386/libftd2xx.so.1.1.12 differ
diff --git a/tools/libftd2/build/x86_64/libftd2xx.so b/tools/libftd2/build/x86_64/libftd2xx.so
index 22c9be605762da510f42e95d253967a0047515af..dd95de9f415ff066b30ff0db19c17079e1947ba2 120000
--- a/tools/libftd2/build/x86_64/libftd2xx.so
+++ b/tools/libftd2/build/x86_64/libftd2xx.so
@@ -1 +1 @@
-libftd2xx.so.1
\ No newline at end of file
+libftd2xx.so.1.1.12
\ No newline at end of file
diff --git a/tools/libftd2/build/x86_64/libftd2xx.so.1 b/tools/libftd2/build/x86_64/libftd2xx.so.1
deleted file mode 120000
index 9a639ee448db7cf9ebf92507cbfb8500fc711213..0000000000000000000000000000000000000000
--- a/tools/libftd2/build/x86_64/libftd2xx.so.1
+++ /dev/null
@@ -1 +0,0 @@
-libftd2xx.so.1.0.4
\ No newline at end of file
diff --git a/tools/libftd2/build/x86_64/libftd2xx.so.1.0.4 b/tools/libftd2/build/x86_64/libftd2xx.so.1.0.4
deleted file mode 100755
index 6d1b03c991d0073a786566348a8c12c764f7f6e4..0000000000000000000000000000000000000000
Binary files a/tools/libftd2/build/x86_64/libftd2xx.so.1.0.4 and /dev/null differ
diff --git a/tools/libftd2/build/x86_64/libftd2xx.so.1.1.12 b/tools/libftd2/build/x86_64/libftd2xx.so.1.1.12
new file mode 100755
index 0000000000000000000000000000000000000000..ac7c5f00bb560bdfbb38206688c3694873b6c6ec
Binary files /dev/null and b/tools/libftd2/build/x86_64/libftd2xx.so.1.1.12 differ
diff --git a/tools/libftd2/ftd2xx.h b/tools/libftd2/ftd2xx.h
index 9b344087a370d480cb6f6b3740f0e4611232aba9..1dd1f2404379bad4dd269dd8efd76475d0488abd 100755
--- a/tools/libftd2/ftd2xx.h
+++ b/tools/libftd2/ftd2xx.h
@@ -1,51 +1,46 @@
 /*++
 
- Copyright (c) 2001-2011 Future Technology Devices International Limited
- 
- THIS SOFTWARE IS PROVIDED BY FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
- FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- 
- FTDI DRIVERS MAY BE USED ONLY IN CONJUNCTION WITH PRODUCTS BASED ON FTDI PARTS.
- 
- FTDI DRIVERS MAY BE DISTRIBUTED IN ANY FORM AS LONG AS LICENSE INFORMATION IS NOT MODIFIED.
- 
- IF A CUSTOM VENDOR ID AND/OR PRODUCT ID OR DESCRIPTION STRING ARE USED, IT IS THE
- RESPONSIBILITY OF THE PRODUCT MANUFACTURER TO MAINTAIN ANY CHANGES AND SUBSEQUENT WHQL
- RE-CERTIFICATION AS A RESULT OF MAKING THESE CHANGES.
- 
- 
- Module Name:
- 
- ftd2xx.h
- 
- Abstract:
- 
- Native USB device driver for FTDI FT232x, FT245x, FT2232x and FT4232x devices
- FTD2XX library definitions
- 
- Environment:
- 
- user mode 
- 
- 
- --*/
+Copyright © 2001-2011 Future Technology Devices International Limited
+
+THIS SOFTWARE IS PROVIDED BY FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+FUTURE TECHNOLOGY DEVICES INTERNATIONAL LIMITED BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+FTDI DRIVERS MAY BE USED ONLY IN CONJUNCTION WITH PRODUCTS BASED ON FTDI PARTS.
+
+FTDI DRIVERS MAY BE DISTRIBUTED IN ANY FORM AS LONG AS LICENSE INFORMATION IS NOT MODIFIED.
+
+IF A CUSTOM VENDOR ID AND/OR PRODUCT ID OR DESCRIPTION STRING ARE USED, IT IS THE
+RESPONSIBILITY OF THE PRODUCT MANUFACTURER TO MAINTAIN ANY CHANGES AND SUBSEQUENT WHQL
+RE-CERTIFICATION AS A RESULT OF MAKING THESE CHANGES.
+
+
+Module Name:
+
+ftd2xx.h
+
+Abstract:
+
+Native USB device driver for FTDI FT232x, FT245x, FT2232x and FT4232x devices
+FTD2XX library definitions
+
+Environment:
+
+kernel & user mode
+
+
+--*/
 
 
 #ifndef FTD2XX_H
 #define FTD2XX_H
 
-#ifndef _WINDOWS
-#include <pthread.h>
-#define WINAPI
-#endif
-
 // The following ifdef block is the standard way of creating macros
 // which make exporting from a DLL simpler.  All files within this DLL
 // are compiled with the FTD2XX_EXPORTS symbol defined on the command line.
@@ -61,21 +56,22 @@
 #endif
 
 #ifndef _WINDOWS
+#include <pthread.h>
 #include "WinTypes.h"
-
-#ifdef FTD2XX_API
-#undef FTD2XX_API
-#define FTD2XX_API
-#endif
-#endif
+/** Substitute for HANDLE returned by Windows CreateEvent API */
 typedef struct _EVENT_HANDLE{
 	pthread_cond_t eCondVar;
 	pthread_mutex_t eMutex;
 	int iVar;
 } EVENT_HANDLE;
+#ifdef FTD2XX_API
+#undef FTD2XX_API
+#define FTD2XX_API
+#endif /* FTD2XX_API */
+#endif /* _WINDOWS */
 
-typedef PVOID			FT_HANDLE;
-typedef ULONG			FT_STATUS;
+typedef PVOID	FT_HANDLE;
+typedef ULONG	FT_STATUS;
 
 //
 // Device status
@@ -88,7 +84,7 @@ enum {
 	FT_IO_ERROR,
 	FT_INSUFFICIENT_RESOURCES,
 	FT_INVALID_PARAMETER,
-	FT_INVALID_BAUD_RATE,	//7
+	FT_INVALID_BAUD_RATE,
 
 	FT_DEVICE_NOT_OPENED_FOR_ERASE,
 	FT_DEVICE_NOT_OPENED_FOR_WRITE,
@@ -100,7 +96,8 @@ enum {
 	FT_EEPROM_NOT_PROGRAMMED,
 	FT_INVALID_ARGS,
 	FT_NOT_SUPPORTED,
-	FT_OTHER_ERROR
+	FT_OTHER_ERROR,
+	FT_DEVICE_LIST_NOT_READY,
 };
 
 
@@ -110,10 +107,14 @@ enum {
 // FT_OpenEx Flags
 //
 
-#define FT_OPEN_BY_SERIAL_NUMBER    1
-#define FT_OPEN_BY_DESCRIPTION      2
+#define FT_OPEN_BY_SERIAL_NUMBER	1
+#define FT_OPEN_BY_DESCRIPTION		2
 #define FT_OPEN_BY_LOCATION			4
 
+#define FT_OPEN_MASK (FT_OPEN_BY_SERIAL_NUMBER | \
+                      FT_OPEN_BY_DESCRIPTION | \
+                      FT_OPEN_BY_LOCATION)
+
 //
 // FT_ListDevices Flags (used in conjunction with FT_OpenEx Flags
 //
@@ -171,16 +172,16 @@ enum {
 // Flow Control
 //
 
-#define FT_FLOW_NONE        0x0000
-#define FT_FLOW_RTS_CTS     0x0100
-#define FT_FLOW_DTR_DSR     0x0200
-#define FT_FLOW_XON_XOFF    0x0400
+#define FT_FLOW_NONE		0x0000
+#define FT_FLOW_RTS_CTS		0x0100
+#define FT_FLOW_DTR_DSR		0x0200
+#define FT_FLOW_XON_XOFF	0x0400
 
 //
 // Purge rx and tx buffers
 //
-#define FT_PURGE_RX         1
-#define FT_PURGE_TX         2
+#define FT_PURGE_RX			1
+#define FT_PURGE_TX			2
 
 //
 // Events
@@ -196,8 +197,8 @@ typedef void (*PFT_EVENT_HANDLER)(DWORD,DWORD);
 // Timeouts
 //
 
-#define FT_DEFAULT_RX_TIMEOUT   300
-#define FT_DEFAULT_TX_TIMEOUT   300
+#define FT_DEFAULT_RX_TIMEOUT	300
+#define FT_DEFAULT_TX_TIMEOUT	300
 
 //
 // Device types
@@ -206,872 +207,1178 @@ typedef void (*PFT_EVENT_HANDLER)(DWORD,DWORD);
 typedef ULONG	FT_DEVICE;
 
 enum {
-    FT_DEVICE_BM,
-    FT_DEVICE_AM,
-    FT_DEVICE_100AX,
-    FT_DEVICE_UNKNOWN,
+	FT_DEVICE_BM,
+	FT_DEVICE_AM,
+	FT_DEVICE_100AX,
+	FT_DEVICE_UNKNOWN,
 	FT_DEVICE_2232C,
 	FT_DEVICE_232R,
 	FT_DEVICE_2232H,
 	FT_DEVICE_4232H,
-	FT_DEVICE_232H
- };
+	FT_DEVICE_232H,
+	FT_DEVICE_X_SERIES
+};
 
 //
 // Bit Modes
 //
 
-#define FT_BITMODE_RESET				0x00
-#define FT_BITMODE_ASYNC_BITBANG		0x01
-#define FT_BITMODE_MPSSE				0x02
-#define FT_BITMODE_SYNC_BITBANG			0x04
-#define FT_BITMODE_MCU_HOST				0x08
-#define FT_BITMODE_FAST_SERIAL			0x10
-#define FT_BITMODE_CBUS_BITBANG			0x20
-#define FT_BITMODE_SYNC_FIFO			0x40
-
+#define FT_BITMODE_RESET					0x00
+#define FT_BITMODE_ASYNC_BITBANG			0x01
+#define FT_BITMODE_MPSSE					0x02
+#define FT_BITMODE_SYNC_BITBANG				0x04
+#define FT_BITMODE_MCU_HOST					0x08
+#define FT_BITMODE_FAST_SERIAL				0x10
+#define FT_BITMODE_CBUS_BITBANG				0x20
+#define FT_BITMODE_SYNC_FIFO				0x40
 
 //
 // FT232R CBUS Options EEPROM values
 //
 
-#define FT_232R_CBUS_TXDEN				0x00	//	Tx Data Enable
-#define FT_232R_CBUS_PWRON				0x01	//	Power On
-#define FT_232R_CBUS_RXLED				0x02	//	Rx LED
-#define FT_232R_CBUS_TXLED				0x03	//	Tx LED
-#define FT_232R_CBUS_TXRXLED			0x04	//	Tx and Rx LED
-#define FT_232R_CBUS_SLEEP				0x05	//	Sleep
-#define FT_232R_CBUS_CLK48				0x06	//	48MHz clock
-#define FT_232R_CBUS_CLK24				0x07	//	24MHz clock
-#define FT_232R_CBUS_CLK12				0x08	//	12MHz clock
-#define FT_232R_CBUS_CLK6				0x09	//	6MHz clock
-#define FT_232R_CBUS_IOMODE				0x0A	//	IO Mode for CBUS bit-bang
-#define FT_232R_CBUS_BITBANG_WR			0x0B	//	Bit-bang write strobe
-#define FT_232R_CBUS_BITBANG_RD			0x0C	//	Bit-bang read strobe
+#define FT_232R_CBUS_TXDEN					0x00	//	Tx Data Enable
+#define FT_232R_CBUS_PWRON					0x01	//	Power On
+#define FT_232R_CBUS_RXLED					0x02	//	Rx LED
+#define FT_232R_CBUS_TXLED					0x03	//	Tx LED
+#define FT_232R_CBUS_TXRXLED				0x04	//	Tx and Rx LED
+#define FT_232R_CBUS_SLEEP					0x05	//	Sleep
+#define FT_232R_CBUS_CLK48					0x06	//	48MHz clock
+#define FT_232R_CBUS_CLK24					0x07	//	24MHz clock
+#define FT_232R_CBUS_CLK12					0x08	//	12MHz clock
+#define FT_232R_CBUS_CLK6					0x09	//	6MHz clock
+#define FT_232R_CBUS_IOMODE					0x0A	//	IO Mode for CBUS bit-bang
+#define FT_232R_CBUS_BITBANG_WR				0x0B	//	Bit-bang write strobe
+#define FT_232R_CBUS_BITBANG_RD				0x0C	//	Bit-bang read strobe
 
 //
 // FT232H CBUS Options EEPROM values
 //
 
-#define FT_232H_CBUS_TRISTATE			0x00	//	Tristate
-#define FT_232H_CBUS_RXLED				0x01	//	Rx LED
-#define FT_232H_CBUS_TXLED				0x02	//	Tx LED
-#define FT_232H_CBUS_TXRXLED			0x03	//	Tx and Rx LED
-#define FT_232H_CBUS_PWREN				0x04	//	Power Enable
-#define FT_232H_CBUS_SLEEP				0x05	//	Sleep
-#define FT_232H_CBUS_DRIVE_0			0x06	//	Drive pin to logic 0
-#define FT_232H_CBUS_DRIVE_1			0x07	//	Drive pin to logic 1
-#define FT_232H_CBUS_IOMODE				0x08	//	IO Mode for CBUS bit-bang
-#define FT_232H_CBUS_TXDEN				0x09	//	Tx Data Enable
-#define FT_232H_CBUS_CLK30				0x0A	//	30MHz clock
-#define FT_232H_CBUS_CLK15				0x0B	//	15MHz clock
-#define FT_232H_CBUS_CLK7_5				0x0C	//	7.5MHz clock
+#define FT_232H_CBUS_TRISTATE				0x00	//	Tristate
+#define FT_232H_CBUS_TXLED					0x01	//	Tx LED
+#define FT_232H_CBUS_RXLED					0x02	//	Rx LED
+#define FT_232H_CBUS_TXRXLED				0x03	//	Tx and Rx LED
+#define FT_232H_CBUS_PWREN					0x04	//	Power Enable
+#define FT_232H_CBUS_SLEEP					0x05	//	Sleep
+#define FT_232H_CBUS_DRIVE_0				0x06	//	Drive pin to logic 0
+#define FT_232H_CBUS_DRIVE_1				0x07	//	Drive pin to logic 1
+#define FT_232H_CBUS_IOMODE					0x08	//	IO Mode for CBUS bit-bang
+#define FT_232H_CBUS_TXDEN					0x09	//	Tx Data Enable
+#define FT_232H_CBUS_CLK30					0x0A	//	30MHz clock
+#define FT_232H_CBUS_CLK15					0x0B	//	15MHz clock
+#define FT_232H_CBUS_CLK7_5					0x0C	//	7.5MHz clock
+
+//
+// FT X Series CBUS Options EEPROM values
+//
+
+#define FT_X_SERIES_CBUS_TRISTATE			0x00	//	Tristate
+#define FT_X_SERIES_CBUS_RXLED				0x01	//	Tx LED
+#define FT_X_SERIES_CBUS_TXLED				0x02	//	Rx LED
+#define FT_X_SERIES_CBUS_TXRXLED			0x03	//	Tx and Rx LED
+#define FT_X_SERIES_CBUS_PWREN				0x04	//	Power Enable
+#define FT_X_SERIES_CBUS_SLEEP				0x05	//	Sleep
+#define FT_X_SERIES_CBUS_DRIVE_0			0x06	//	Drive pin to logic 0
+#define FT_X_SERIES_CBUS_DRIVE_1			0x07	//	Drive pin to logic 1
+#define FT_X_SERIES_CBUS_IOMODE				0x08	//	IO Mode for CBUS bit-bang
+#define FT_X_SERIES_CBUS_TXDEN				0x09	//	Tx Data Enable
+#define FT_X_SERIES_CBUS_CLK24				0x0A	//	24MHz clock
+#define FT_X_SERIES_CBUS_CLK12				0x0B	//	12MHz clock
+#define FT_X_SERIES_CBUS_CLK6				0x0C	//	6MHz clock
+#define FT_X_SERIES_CBUS_BCD_CHARGER		0x0D	//	Battery charger detected
+#define FT_X_SERIES_CBUS_BCD_CHARGER_N		0x0E	//	Battery charger detected inverted
+#define FT_X_SERIES_CBUS_I2C_TXE			0x0F	//	I2C Tx empty
+#define FT_X_SERIES_CBUS_I2C_RXF			0x10	//	I2C Rx full
+#define FT_X_SERIES_CBUS_VBUS_SENSE			0x11	//	Detect VBUS
+#define FT_X_SERIES_CBUS_BITBANG_WR			0x12	//	Bit-bang write strobe
+#define FT_X_SERIES_CBUS_BITBANG_RD			0x13	//	Bit-bang read strobe
+#define FT_X_SERIES_CBUS_TIMESTAMP			0x14	//	Toggle output when a USB SOF token is received
+#define FT_X_SERIES_CBUS_KEEP_AWAKE			0x15	//	
+
+
+// Driver types
+#define FT_DRIVER_TYPE_D2XX		0
+#define FT_DRIVER_TYPE_VCP		1
+
 
 
 #ifdef __cplusplus
 extern "C" {
 #endif
-	
-FTD2XX_API
-FT_STATUS WINAPI FT_Open(
-	int deviceNumber,
-	FT_HANDLE *pHandle
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_OpenEx(
-    PVOID pArg1,
-    DWORD Flags,
-    FT_HANDLE *pHandle
-    );
-
-FTD2XX_API 
-FT_STATUS WINAPI FT_ListDevices(
-	PVOID pArg1,
-	PVOID pArg2,
-	DWORD Flags
-	);
-
-FTD2XX_API
-FT_STATUS FT_SetVIDPID(
-	DWORD dwVID, 
-	DWORD dwPID
-	);
-	
-FTD2XX_API
-FT_STATUS FT_GetVIDPID(
-	DWORD * pdwVID, 
-	DWORD * pdwPID
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_Close(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_Read(
-    FT_HANDLE ftHandle,
-    LPVOID lpBuffer,
-    DWORD nBufferSize,
-    LPDWORD lpBytesReturned
-    );
-
-FTD2XX_API 
-FT_STATUS WINAPI FT_Write(
-    FT_HANDLE ftHandle,
-    LPVOID lpBuffer,
-    DWORD nBufferSize,
-    LPDWORD lpBytesWritten
-    );
-
-FTD2XX_API 
-FT_STATUS WINAPI FT_IoCtl(
-    FT_HANDLE ftHandle,
-    DWORD dwIoControlCode,
-    LPVOID lpInBuf,
-    DWORD nInBufSize,
-    LPVOID lpOutBuf,
-    DWORD nOutBufSize,
-    LPDWORD lpBytesReturned,
-    LPOVERLAPPED lpOverlapped
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetBaudRate(
-    FT_HANDLE ftHandle,
-	ULONG BaudRate
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetDivisor(
-    FT_HANDLE ftHandle,
-	USHORT Divisor
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetDataCharacteristics(
-    FT_HANDLE ftHandle,
-	UCHAR WordLength,
-	UCHAR StopBits,
-	UCHAR Parity
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetFlowControl(
-    FT_HANDLE ftHandle,
-    USHORT FlowControl,
-    UCHAR XonChar,
-    UCHAR XoffChar
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_ResetDevice(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetDtr(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_ClrDtr(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetRts(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_ClrRts(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetModemStatus(
-    FT_HANDLE ftHandle,
-	ULONG *pModemStatus
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetChars(
-    FT_HANDLE ftHandle,
-	UCHAR EventChar,
-	UCHAR EventCharEnabled,
-	UCHAR ErrorChar,
-	UCHAR ErrorCharEnabled
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_Purge(
-    FT_HANDLE ftHandle,
-	ULONG Mask
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetTimeouts(
-    FT_HANDLE ftHandle,
-	ULONG ReadTimeout,
-	ULONG WriteTimeout
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetQueueStatus(
-    FT_HANDLE ftHandle,
-	DWORD *dwRxBytes
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetEventNotification(
-    FT_HANDLE ftHandle,
-	DWORD Mask,
-	PVOID Param
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetStatus(
-    FT_HANDLE ftHandle,
-    DWORD *dwRxBytes,
-    DWORD *dwTxBytes,
-    DWORD *dwEventDWord
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetBreakOn(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetBreakOff(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetWaitMask(
-    FT_HANDLE ftHandle,
-    DWORD Mask
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_WaitOnMask(
-    FT_HANDLE ftHandle,
-    DWORD *Mask
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetEventStatus(
-    FT_HANDLE ftHandle,
-    DWORD *dwEventDWord
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_ReadEE(
-    FT_HANDLE ftHandle,
-	DWORD dwWordOffset,
-    LPWORD lpwValue
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_WriteEE(
-    FT_HANDLE ftHandle,
-	DWORD dwWordOffset,
-    WORD wValue
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EraseEE(
-    FT_HANDLE ftHandle
-	);
-	
-//
-// structure to hold program data for FT_Program function
-//
-typedef struct ft_program_data {
-
-	DWORD Signature1;			// Header - must be 0x00000000 
-	DWORD Signature2;			// Header - must be 0xffffffff
-	DWORD Version;				// Header - FT_PROGRAM_DATA version
-								//          0 = original
-	                            //          1 = FT2232C extensions
-								//			2 = FT232R extensions
-								//			3 = FT2232H extensions
-								//			4 = FT4232H extensions
-								//			5 = FT232H extensions
-	WORD VendorId;				// 0x0403
-	WORD ProductId;				// 0x6001
-	char *Manufacturer;			// "FTDI"
-	char *ManufacturerId;		// "FT"
-	char *Description;			// "USB HS Serial Converter"
-	char *SerialNumber;			// "FT000001" if fixed, or NULL
-	WORD MaxPower;				// 0 < MaxPower <= 500
-	WORD PnP;					// 0 = disabled, 1 = enabled
-	WORD SelfPowered;			// 0 = bus powered, 1 = self powered
-	WORD RemoteWakeup;			// 0 = not capable, 1 = capable
-	//
-	// Rev4 (FT232B) extensions
-	//
-	UCHAR Rev4;					// non-zero if Rev4 chip, zero otherwise
-	UCHAR IsoIn;				// non-zero if in endpoint is isochronous
-	UCHAR IsoOut;				// non-zero if out endpoint is isochronous
-	UCHAR PullDownEnable;		// non-zero if pull down enabled
-	UCHAR SerNumEnable;			// non-zero if serial number to be used
-	UCHAR USBVersionEnable;		// non-zero if chip uses USBVersion
-	WORD USBVersion;			// BCD (0x0200 => USB2)
-	//
-	// Rev 5 (FT2232) extensions
-	//
-	UCHAR Rev5;					// non-zero if Rev5 chip, zero otherwise
-	UCHAR IsoInA;				// non-zero if in endpoint is isochronous
-	UCHAR IsoInB;				// non-zero if in endpoint is isochronous
-	UCHAR IsoOutA;				// non-zero if out endpoint is isochronous
-	UCHAR IsoOutB;				// non-zero if out endpoint is isochronous
-	UCHAR PullDownEnable5;		// non-zero if pull down enabled
-	UCHAR SerNumEnable5;		// non-zero if serial number to be used
-	UCHAR USBVersionEnable5;	// non-zero if chip uses USBVersion
-	WORD USBVersion5;			// BCD (0x0200 => USB2)
-	UCHAR AIsHighCurrent;		// non-zero if interface is high current
-	UCHAR BIsHighCurrent;		// non-zero if interface is high current
-	UCHAR IFAIsFifo;			// non-zero if interface is 245 FIFO
-	UCHAR IFAIsFifoTar;			// non-zero if interface is 245 FIFO CPU target
-	UCHAR IFAIsFastSer;			// non-zero if interface is Fast serial
-	UCHAR AIsVCP;				// non-zero if interface is to use VCP drivers
-	UCHAR IFBIsFifo;			// non-zero if interface is 245 FIFO
-	UCHAR IFBIsFifoTar;			// non-zero if interface is 245 FIFO CPU target
-	UCHAR IFBIsFastSer;			// non-zero if interface is Fast serial
-	UCHAR BIsVCP;				// non-zero if interface is to use VCP drivers
-	//
-	// Rev 6 (FT232R) extensions
-	//
-	UCHAR UseExtOsc;			// Use External Oscillator
-	UCHAR HighDriveIOs;			// High Drive I/Os
-	UCHAR EndpointSize;			// Endpoint size
-	UCHAR PullDownEnableR;		// non-zero if pull down enabled
-	UCHAR SerNumEnableR;		// non-zero if serial number to be used
-	UCHAR InvertTXD;			// non-zero if invert TXD
-	UCHAR InvertRXD;			// non-zero if invert RXD
-	UCHAR InvertRTS;			// non-zero if invert RTS
-	UCHAR InvertCTS;			// non-zero if invert CTS
-	UCHAR InvertDTR;			// non-zero if invert DTR
-	UCHAR InvertDSR;			// non-zero if invert DSR
-	UCHAR InvertDCD;			// non-zero if invert DCD
-	UCHAR InvertRI;				// non-zero if invert RI
-	UCHAR Cbus0;				// Cbus Mux control
-	UCHAR Cbus1;				// Cbus Mux control
-	UCHAR Cbus2;				// Cbus Mux control
-	UCHAR Cbus3;				// Cbus Mux control
-	UCHAR Cbus4;				// Cbus Mux control
-	UCHAR RIsD2XX;				// non-zero if using D2XX drivers
-	//
-	// Rev 7 (FT2232H) Extensions
-	//
-	UCHAR PullDownEnable7;		// non-zero if pull down enabled
-	UCHAR SerNumEnable7;		// non-zero if serial number to be used
-	UCHAR ALSlowSlew;			// non-zero if AL pins have slow slew
-	UCHAR ALSchmittInput;		// non-zero if AL pins are Schmitt input
-	UCHAR ALDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR AHSlowSlew;			// non-zero if AH pins have slow slew
-	UCHAR AHSchmittInput;		// non-zero if AH pins are Schmitt input
-	UCHAR AHDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR BLSlowSlew;			// non-zero if BL pins have slow slew
-	UCHAR BLSchmittInput;		// non-zero if BL pins are Schmitt input
-	UCHAR BLDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR BHSlowSlew;			// non-zero if BH pins have slow slew
-	UCHAR BHSchmittInput;		// non-zero if BH pins are Schmitt input
-	UCHAR BHDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR IFAIsFifo7;			// non-zero if interface is 245 FIFO
-	UCHAR IFAIsFifoTar7;		// non-zero if interface is 245 FIFO CPU target
-	UCHAR IFAIsFastSer7;		// non-zero if interface is Fast serial
-	UCHAR AIsVCP7;				// non-zero if interface is to use VCP drivers
-	UCHAR IFBIsFifo7;			// non-zero if interface is 245 FIFO
-	UCHAR IFBIsFifoTar7;		// non-zero if interface is 245 FIFO CPU target
-	UCHAR IFBIsFastSer7;		// non-zero if interface is Fast serial
-	UCHAR BIsVCP7;				// non-zero if interface is to use VCP drivers
-	UCHAR PowerSaveEnable;			// non-zero if using BCBUS7 to save power for self-powered designs
+
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_Open(
+		int deviceNumber,
+		FT_HANDLE *pHandle
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_OpenEx(
+		PVOID pArg1,
+		DWORD Flags,
+		FT_HANDLE *pHandle
+		);
+
+	FTD2XX_API 
+		FT_STATUS WINAPI FT_ListDevices(
+		PVOID pArg1,
+		PVOID pArg2,
+		DWORD Flags
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_Close(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_Read(
+		FT_HANDLE ftHandle,
+		LPVOID lpBuffer,
+		DWORD dwBytesToRead,
+		LPDWORD lpBytesReturned
+		);
+
+	FTD2XX_API 
+		FT_STATUS WINAPI FT_Write(
+		FT_HANDLE ftHandle,
+		LPVOID lpBuffer,
+		DWORD dwBytesToWrite,
+		LPDWORD lpBytesWritten
+		);
+
+	FTD2XX_API 
+		FT_STATUS WINAPI FT_IoCtl(
+		FT_HANDLE ftHandle,
+		DWORD dwIoControlCode,
+		LPVOID lpInBuf,
+		DWORD nInBufSize,
+		LPVOID lpOutBuf,
+		DWORD nOutBufSize,
+		LPDWORD lpBytesReturned,
+		LPOVERLAPPED lpOverlapped
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetBaudRate(
+		FT_HANDLE ftHandle,
+		ULONG BaudRate
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetDivisor(
+		FT_HANDLE ftHandle,
+		USHORT Divisor
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetDataCharacteristics(
+		FT_HANDLE ftHandle,
+		UCHAR WordLength,
+		UCHAR StopBits,
+		UCHAR Parity
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetFlowControl(
+		FT_HANDLE ftHandle,
+		USHORT FlowControl,
+		UCHAR XonChar,
+		UCHAR XoffChar
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_ResetDevice(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetDtr(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_ClrDtr(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetRts(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_ClrRts(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetModemStatus(
+		FT_HANDLE ftHandle,
+		ULONG *pModemStatus
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetChars(
+		FT_HANDLE ftHandle,
+		UCHAR EventChar,
+		UCHAR EventCharEnabled,
+		UCHAR ErrorChar,
+		UCHAR ErrorCharEnabled
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_Purge(
+		FT_HANDLE ftHandle,
+		ULONG Mask
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetTimeouts(
+		FT_HANDLE ftHandle,
+		ULONG ReadTimeout,
+		ULONG WriteTimeout
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetQueueStatus(
+		FT_HANDLE ftHandle,
+		DWORD *dwRxBytes
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetEventNotification(
+		FT_HANDLE ftHandle,
+		DWORD Mask,
+		PVOID Param
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetStatus(
+		FT_HANDLE ftHandle,
+		DWORD *dwRxBytes,
+		DWORD *dwTxBytes,
+		DWORD *dwEventDWord
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetBreakOn(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetBreakOff(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetWaitMask(
+		FT_HANDLE ftHandle,
+		DWORD Mask
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_WaitOnMask(
+		FT_HANDLE ftHandle,
+		DWORD *Mask
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetEventStatus(
+		FT_HANDLE ftHandle,
+		DWORD *dwEventDWord
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_ReadEE(
+		FT_HANDLE ftHandle,
+		DWORD dwWordOffset,
+		LPWORD lpwValue
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_WriteEE(
+		FT_HANDLE ftHandle,
+		DWORD dwWordOffset,
+		WORD wValue
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EraseEE(
+		FT_HANDLE ftHandle
+		);
+
 	//
-	// Rev 8 (FT4232H) Extensions
+	// structure to hold program data for FT_EE_Program, FT_EE_ProgramEx, FT_EE_Read 
+	// and FT_EE_ReadEx functions
 	//
-	UCHAR PullDownEnable8;		// non-zero if pull down enabled
-	UCHAR SerNumEnable8;		// non-zero if serial number to be used
-	UCHAR ASlowSlew;			// non-zero if AL pins have slow slew
-	UCHAR ASchmittInput;		// non-zero if AL pins are Schmitt input
-	UCHAR ADriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR BSlowSlew;			// non-zero if AH pins have slow slew
-	UCHAR BSchmittInput;		// non-zero if AH pins are Schmitt input
-	UCHAR BDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR CSlowSlew;			// non-zero if BL pins have slow slew
-	UCHAR CSchmittInput;		// non-zero if BL pins are Schmitt input
-	UCHAR CDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR DSlowSlew;			// non-zero if BH pins have slow slew
-	UCHAR DSchmittInput;		// non-zero if BH pins are Schmitt input
-	UCHAR DDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR ARIIsTXDEN;			// non-zero if port A uses RI as RS485 TXDEN
-	UCHAR BRIIsTXDEN;			// non-zero if port B uses RI as RS485 TXDEN
-	UCHAR CRIIsTXDEN;			// non-zero if port C uses RI as RS485 TXDEN
-	UCHAR DRIIsTXDEN;			// non-zero if port D uses RI as RS485 TXDEN
-	UCHAR AIsVCP8;				// non-zero if interface is to use VCP drivers
-	UCHAR BIsVCP8;				// non-zero if interface is to use VCP drivers
-	UCHAR CIsVCP8;				// non-zero if interface is to use VCP drivers
-	UCHAR DIsVCP8;				// non-zero if interface is to use VCP drivers
+	typedef struct ft_program_data {
+
+		DWORD Signature1;			// Header - must be 0x00000000 
+		DWORD Signature2;			// Header - must be 0xffffffff
+		DWORD Version;				// Header - FT_PROGRAM_DATA version
+		//			0 = original
+		//			1 = FT2232 extensions
+		//			2 = FT232R extensions
+		//			3 = FT2232H extensions
+		//			4 = FT4232H extensions
+		//			5 = FT232H extensions
+
+		WORD VendorId;				// 0x0403
+		WORD ProductId;				// 0x6001
+		char *Manufacturer;			// "FTDI"
+		char *ManufacturerId;		// "FT"
+		char *Description;			// "USB HS Serial Converter"
+		char *SerialNumber;			// "FT000001" if fixed, or NULL
+		WORD MaxPower;				// 0 < MaxPower <= 500
+		WORD PnP;					// 0 = disabled, 1 = enabled
+		WORD SelfPowered;			// 0 = bus powered, 1 = self powered
+		WORD RemoteWakeup;			// 0 = not capable, 1 = capable
+		//
+		// Rev4 (FT232B) extensions
+		//
+		UCHAR Rev4;					// non-zero if Rev4 chip, zero otherwise
+		UCHAR IsoIn;				// non-zero if in endpoint is isochronous
+		UCHAR IsoOut;				// non-zero if out endpoint is isochronous
+		UCHAR PullDownEnable;		// non-zero if pull down enabled
+		UCHAR SerNumEnable;			// non-zero if serial number to be used
+		UCHAR USBVersionEnable;		// non-zero if chip uses USBVersion
+		WORD USBVersion;			// BCD (0x0200 => USB2)
+		//
+		// Rev 5 (FT2232) extensions
+		//
+		UCHAR Rev5;					// non-zero if Rev5 chip, zero otherwise
+		UCHAR IsoInA;				// non-zero if in endpoint is isochronous
+		UCHAR IsoInB;				// non-zero if in endpoint is isochronous
+		UCHAR IsoOutA;				// non-zero if out endpoint is isochronous
+		UCHAR IsoOutB;				// non-zero if out endpoint is isochronous
+		UCHAR PullDownEnable5;		// non-zero if pull down enabled
+		UCHAR SerNumEnable5;		// non-zero if serial number to be used
+		UCHAR USBVersionEnable5;	// non-zero if chip uses USBVersion
+		WORD USBVersion5;			// BCD (0x0200 => USB2)
+		UCHAR AIsHighCurrent;		// non-zero if interface is high current
+		UCHAR BIsHighCurrent;		// non-zero if interface is high current
+		UCHAR IFAIsFifo;			// non-zero if interface is 245 FIFO
+		UCHAR IFAIsFifoTar;			// non-zero if interface is 245 FIFO CPU target
+		UCHAR IFAIsFastSer;			// non-zero if interface is Fast serial
+		UCHAR AIsVCP;				// non-zero if interface is to use VCP drivers
+		UCHAR IFBIsFifo;			// non-zero if interface is 245 FIFO
+		UCHAR IFBIsFifoTar;			// non-zero if interface is 245 FIFO CPU target
+		UCHAR IFBIsFastSer;			// non-zero if interface is Fast serial
+		UCHAR BIsVCP;				// non-zero if interface is to use VCP drivers
+		//
+		// Rev 6 (FT232R) extensions
+		//
+		UCHAR UseExtOsc;			// Use External Oscillator
+		UCHAR HighDriveIOs;			// High Drive I/Os
+		UCHAR EndpointSize;			// Endpoint size
+		UCHAR PullDownEnableR;		// non-zero if pull down enabled
+		UCHAR SerNumEnableR;		// non-zero if serial number to be used
+		UCHAR InvertTXD;			// non-zero if invert TXD
+		UCHAR InvertRXD;			// non-zero if invert RXD
+		UCHAR InvertRTS;			// non-zero if invert RTS
+		UCHAR InvertCTS;			// non-zero if invert CTS
+		UCHAR InvertDTR;			// non-zero if invert DTR
+		UCHAR InvertDSR;			// non-zero if invert DSR
+		UCHAR InvertDCD;			// non-zero if invert DCD
+		UCHAR InvertRI;				// non-zero if invert RI
+		UCHAR Cbus0;				// Cbus Mux control
+		UCHAR Cbus1;				// Cbus Mux control
+		UCHAR Cbus2;				// Cbus Mux control
+		UCHAR Cbus3;				// Cbus Mux control
+		UCHAR Cbus4;				// Cbus Mux control
+		UCHAR RIsD2XX;				// non-zero if using D2XX driver
+		//
+		// Rev 7 (FT2232H) Extensions
+		//
+		UCHAR PullDownEnable7;		// non-zero if pull down enabled
+		UCHAR SerNumEnable7;		// non-zero if serial number to be used
+		UCHAR ALSlowSlew;			// non-zero if AL pins have slow slew
+		UCHAR ALSchmittInput;		// non-zero if AL pins are Schmitt input
+		UCHAR ALDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR AHSlowSlew;			// non-zero if AH pins have slow slew
+		UCHAR AHSchmittInput;		// non-zero if AH pins are Schmitt input
+		UCHAR AHDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR BLSlowSlew;			// non-zero if BL pins have slow slew
+		UCHAR BLSchmittInput;		// non-zero if BL pins are Schmitt input
+		UCHAR BLDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR BHSlowSlew;			// non-zero if BH pins have slow slew
+		UCHAR BHSchmittInput;		// non-zero if BH pins are Schmitt input
+		UCHAR BHDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR IFAIsFifo7;			// non-zero if interface is 245 FIFO
+		UCHAR IFAIsFifoTar7;		// non-zero if interface is 245 FIFO CPU target
+		UCHAR IFAIsFastSer7;		// non-zero if interface is Fast serial
+		UCHAR AIsVCP7;				// non-zero if interface is to use VCP drivers
+		UCHAR IFBIsFifo7;			// non-zero if interface is 245 FIFO
+		UCHAR IFBIsFifoTar7;		// non-zero if interface is 245 FIFO CPU target
+		UCHAR IFBIsFastSer7;		// non-zero if interface is Fast serial
+		UCHAR BIsVCP7;				// non-zero if interface is to use VCP drivers
+		UCHAR PowerSaveEnable;		// non-zero if using BCBUS7 to save power for self-powered designs
+		//
+		// Rev 8 (FT4232H) Extensions
+		//
+		UCHAR PullDownEnable8;		// non-zero if pull down enabled
+		UCHAR SerNumEnable8;		// non-zero if serial number to be used
+		UCHAR ASlowSlew;			// non-zero if A pins have slow slew
+		UCHAR ASchmittInput;		// non-zero if A pins are Schmitt input
+		UCHAR ADriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR BSlowSlew;			// non-zero if B pins have slow slew
+		UCHAR BSchmittInput;		// non-zero if B pins are Schmitt input
+		UCHAR BDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR CSlowSlew;			// non-zero if C pins have slow slew
+		UCHAR CSchmittInput;		// non-zero if C pins are Schmitt input
+		UCHAR CDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR DSlowSlew;			// non-zero if D pins have slow slew
+		UCHAR DSchmittInput;		// non-zero if D pins are Schmitt input
+		UCHAR DDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR ARIIsTXDEN;			// non-zero if port A uses RI as RS485 TXDEN
+		UCHAR BRIIsTXDEN;			// non-zero if port B uses RI as RS485 TXDEN
+		UCHAR CRIIsTXDEN;			// non-zero if port C uses RI as RS485 TXDEN
+		UCHAR DRIIsTXDEN;			// non-zero if port D uses RI as RS485 TXDEN
+		UCHAR AIsVCP8;				// non-zero if interface is to use VCP drivers
+		UCHAR BIsVCP8;				// non-zero if interface is to use VCP drivers
+		UCHAR CIsVCP8;				// non-zero if interface is to use VCP drivers
+		UCHAR DIsVCP8;				// non-zero if interface is to use VCP drivers
+		//
+		// Rev 9 (FT232H) Extensions
+		//
+		UCHAR PullDownEnableH;		// non-zero if pull down enabled
+		UCHAR SerNumEnableH;		// non-zero if serial number to be used
+		UCHAR ACSlowSlewH;			// non-zero if AC pins have slow slew
+		UCHAR ACSchmittInputH;		// non-zero if AC pins are Schmitt input
+		UCHAR ACDriveCurrentH;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR ADSlowSlewH;			// non-zero if AD pins have slow slew
+		UCHAR ADSchmittInputH;		// non-zero if AD pins are Schmitt input
+		UCHAR ADDriveCurrentH;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR Cbus0H;				// Cbus Mux control
+		UCHAR Cbus1H;				// Cbus Mux control
+		UCHAR Cbus2H;				// Cbus Mux control
+		UCHAR Cbus3H;				// Cbus Mux control
+		UCHAR Cbus4H;				// Cbus Mux control
+		UCHAR Cbus5H;				// Cbus Mux control
+		UCHAR Cbus6H;				// Cbus Mux control
+		UCHAR Cbus7H;				// Cbus Mux control
+		UCHAR Cbus8H;				// Cbus Mux control
+		UCHAR Cbus9H;				// Cbus Mux control
+		UCHAR IsFifoH;				// non-zero if interface is 245 FIFO
+		UCHAR IsFifoTarH;			// non-zero if interface is 245 FIFO CPU target
+		UCHAR IsFastSerH;			// non-zero if interface is Fast serial
+		UCHAR IsFT1248H;			// non-zero if interface is FT1248
+		UCHAR FT1248CpolH;			// FT1248 clock polarity - clock idle high (1) or clock idle low (0)
+		UCHAR FT1248LsbH;			// FT1248 data is LSB (1) or MSB (0)
+		UCHAR FT1248FlowControlH;	// FT1248 flow control enable
+		UCHAR IsVCPH;				// non-zero if interface is to use VCP drivers
+		UCHAR PowerSaveEnableH;		// non-zero if using ACBUS7 to save power for self-powered designs
+		
+	} FT_PROGRAM_DATA, *PFT_PROGRAM_DATA;
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EE_Program(
+		FT_HANDLE ftHandle,
+		PFT_PROGRAM_DATA pData
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EE_ProgramEx(
+		FT_HANDLE ftHandle,
+		PFT_PROGRAM_DATA pData,
+		char *Manufacturer,
+		char *ManufacturerId,
+		char *Description,
+		char *SerialNumber
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EE_Read(
+		FT_HANDLE ftHandle,
+		PFT_PROGRAM_DATA pData
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EE_ReadEx(
+		FT_HANDLE ftHandle,
+		PFT_PROGRAM_DATA pData,
+		char *Manufacturer,
+		char *ManufacturerId,
+		char *Description,
+		char *SerialNumber
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EE_UASize(
+		FT_HANDLE ftHandle,
+		LPDWORD lpdwSize
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EE_UAWrite(
+		FT_HANDLE ftHandle,
+		PUCHAR pucData,
+		DWORD dwDataLen
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EE_UARead(
+		FT_HANDLE ftHandle,
+		PUCHAR pucData,
+		DWORD dwDataLen,
+		LPDWORD lpdwBytesRead
+		);
+
+
+	typedef struct ft_eeprom_header {
+		FT_DEVICE deviceType;		// FTxxxx device type to be programmed
+		// Device descriptor options
+		WORD VendorId;				// 0x0403
+		WORD ProductId;				// 0x6001
+		UCHAR SerNumEnable;			// non-zero if serial number to be used
+		// Config descriptor options
+		WORD MaxPower;				// 0 < MaxPower <= 500
+		UCHAR SelfPowered;			// 0 = bus powered, 1 = self powered
+		UCHAR RemoteWakeup;			// 0 = not capable, 1 = capable
+		// Hardware options
+		UCHAR PullDownEnable;		// non-zero if pull down in suspend enabled
+	} FT_EEPROM_HEADER, *PFT_EEPROM_HEADER;
+
+
+	// FT232B EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program
+	typedef struct ft_eeprom_232b {
+		// Common header
+		FT_EEPROM_HEADER common;	// common elements for all device EEPROMs
+	} FT_EEPROM_232B, *PFT_EEPROM_232B;
+
+
+	// FT2232 EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program
+	typedef struct ft_eeprom_2232 {
+		// Common header
+		FT_EEPROM_HEADER common;	// common elements for all device EEPROMs
+		// Drive options
+		UCHAR AIsHighCurrent;		// non-zero if interface is high current
+		UCHAR BIsHighCurrent;		// non-zero if interface is high current
+		// Hardware options
+		UCHAR AIsFifo;				// non-zero if interface is 245 FIFO
+		UCHAR AIsFifoTar;			// non-zero if interface is 245 FIFO CPU target
+		UCHAR AIsFastSer;			// non-zero if interface is Fast serial
+		UCHAR BIsFifo;				// non-zero if interface is 245 FIFO
+		UCHAR BIsFifoTar;			// non-zero if interface is 245 FIFO CPU target
+		UCHAR BIsFastSer;			// non-zero if interface is Fast serial
+		// Driver option
+		UCHAR ADriverType;			// 
+		UCHAR BDriverType;			// 
+	} FT_EEPROM_2232, *PFT_EEPROM_2232;
+
+
+	// FT232R EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program
+	typedef struct ft_eeprom_232r {
+		// Common header
+		FT_EEPROM_HEADER common;	// common elements for all device EEPROMs
+		// Drive options
+		UCHAR IsHighCurrent;		// non-zero if interface is high current
+		// Hardware options
+		UCHAR UseExtOsc;			// Use External Oscillator
+		UCHAR InvertTXD;			// non-zero if invert TXD
+		UCHAR InvertRXD;			// non-zero if invert RXD
+		UCHAR InvertRTS;			// non-zero if invert RTS
+		UCHAR InvertCTS;			// non-zero if invert CTS
+		UCHAR InvertDTR;			// non-zero if invert DTR
+		UCHAR InvertDSR;			// non-zero if invert DSR
+		UCHAR InvertDCD;			// non-zero if invert DCD
+		UCHAR InvertRI;				// non-zero if invert RI
+		UCHAR Cbus0;				// Cbus Mux control
+		UCHAR Cbus1;				// Cbus Mux control
+		UCHAR Cbus2;				// Cbus Mux control
+		UCHAR Cbus3;				// Cbus Mux control
+		UCHAR Cbus4;				// Cbus Mux control
+		// Driver option
+		UCHAR DriverType;			// 
+	} FT_EEPROM_232R, *PFT_EEPROM_232R;
+
+
+	// FT2232H EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program
+	typedef struct ft_eeprom_2232h {
+		// Common header
+		FT_EEPROM_HEADER common;	// common elements for all device EEPROMs
+		// Drive options
+		UCHAR ALSlowSlew;			// non-zero if AL pins have slow slew
+		UCHAR ALSchmittInput;		// non-zero if AL pins are Schmitt input
+		UCHAR ALDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR AHSlowSlew;			// non-zero if AH pins have slow slew
+		UCHAR AHSchmittInput;		// non-zero if AH pins are Schmitt input
+		UCHAR AHDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR BLSlowSlew;			// non-zero if BL pins have slow slew
+		UCHAR BLSchmittInput;		// non-zero if BL pins are Schmitt input
+		UCHAR BLDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR BHSlowSlew;			// non-zero if BH pins have slow slew
+		UCHAR BHSchmittInput;		// non-zero if BH pins are Schmitt input
+		UCHAR BHDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		// Hardware options
+		UCHAR AIsFifo;				// non-zero if interface is 245 FIFO
+		UCHAR AIsFifoTar;			// non-zero if interface is 245 FIFO CPU target
+		UCHAR AIsFastSer;			// non-zero if interface is Fast serial
+		UCHAR BIsFifo;				// non-zero if interface is 245 FIFO
+		UCHAR BIsFifoTar;			// non-zero if interface is 245 FIFO CPU target
+		UCHAR BIsFastSer;			// non-zero if interface is Fast serial
+		UCHAR PowerSaveEnable;		// non-zero if using BCBUS7 to save power for self-powered designs
+		// Driver option
+		UCHAR ADriverType;			// 
+		UCHAR BDriverType;			// 
+	} FT_EEPROM_2232H, *PFT_EEPROM_2232H;
+
+
+	// FT4232H EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program
+	typedef struct ft_eeprom_4232h {
+		// Common header
+		FT_EEPROM_HEADER common;	// common elements for all device EEPROMs
+		// Drive options
+		UCHAR ASlowSlew;			// non-zero if A pins have slow slew
+		UCHAR ASchmittInput;		// non-zero if A pins are Schmitt input
+		UCHAR ADriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR BSlowSlew;			// non-zero if B pins have slow slew
+		UCHAR BSchmittInput;		// non-zero if B pins are Schmitt input
+		UCHAR BDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR CSlowSlew;			// non-zero if C pins have slow slew
+		UCHAR CSchmittInput;		// non-zero if C pins are Schmitt input
+		UCHAR CDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR DSlowSlew;			// non-zero if D pins have slow slew
+		UCHAR DSchmittInput;		// non-zero if D pins are Schmitt input
+		UCHAR DDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		// Hardware options
+		UCHAR ARIIsTXDEN;			// non-zero if port A uses RI as RS485 TXDEN
+		UCHAR BRIIsTXDEN;			// non-zero if port B uses RI as RS485 TXDEN
+		UCHAR CRIIsTXDEN;			// non-zero if port C uses RI as RS485 TXDEN
+		UCHAR DRIIsTXDEN;			// non-zero if port D uses RI as RS485 TXDEN
+		// Driver option
+		UCHAR ADriverType;			// 
+		UCHAR BDriverType;			// 
+		UCHAR CDriverType;			// 
+		UCHAR DDriverType;			// 
+	} FT_EEPROM_4232H, *PFT_EEPROM_4232H;
+
+
+	// FT232H EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program
+	typedef struct ft_eeprom_232h {
+		// Common header
+		FT_EEPROM_HEADER common;	// common elements for all device EEPROMs
+		// Drive options
+		UCHAR ACSlowSlew;			// non-zero if AC bus pins have slow slew
+		UCHAR ACSchmittInput;		// non-zero if AC bus pins are Schmitt input
+		UCHAR ACDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR ADSlowSlew;			// non-zero if AD bus pins have slow slew
+		UCHAR ADSchmittInput;		// non-zero if AD bus pins are Schmitt input
+		UCHAR ADDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		// CBUS options
+		UCHAR Cbus0;				// Cbus Mux control
+		UCHAR Cbus1;				// Cbus Mux control
+		UCHAR Cbus2;				// Cbus Mux control
+		UCHAR Cbus3;				// Cbus Mux control
+		UCHAR Cbus4;				// Cbus Mux control
+		UCHAR Cbus5;				// Cbus Mux control
+		UCHAR Cbus6;				// Cbus Mux control
+		UCHAR Cbus7;				// Cbus Mux control
+		UCHAR Cbus8;				// Cbus Mux control
+		UCHAR Cbus9;				// Cbus Mux control
+		// FT1248 options
+		UCHAR FT1248Cpol;			// FT1248 clock polarity - clock idle high (1) or clock idle low (0)
+		UCHAR FT1248Lsb;			// FT1248 data is LSB (1) or MSB (0)
+		UCHAR FT1248FlowControl;	// FT1248 flow control enable
+		// Hardware options
+		UCHAR IsFifo;				// non-zero if interface is 245 FIFO
+		UCHAR IsFifoTar;			// non-zero if interface is 245 FIFO CPU target
+		UCHAR IsFastSer;			// non-zero if interface is Fast serial
+		UCHAR IsFT1248	;			// non-zero if interface is FT1248
+		UCHAR PowerSaveEnable;		// 
+		// Driver option
+		UCHAR DriverType;			// 
+	} FT_EEPROM_232H, *PFT_EEPROM_232H;
+
+
+	// FT X Series EEPROM structure for use with FT_EEPROM_Read and FT_EEPROM_Program
+	typedef struct ft_eeprom_x_series {
+		// Common header
+		FT_EEPROM_HEADER common;	// common elements for all device EEPROMs
+		// Drive options
+		UCHAR ACSlowSlew;			// non-zero if AC bus pins have slow slew
+		UCHAR ACSchmittInput;		// non-zero if AC bus pins are Schmitt input
+		UCHAR ACDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		UCHAR ADSlowSlew;			// non-zero if AD bus pins have slow slew
+		UCHAR ADSchmittInput;		// non-zero if AD bus pins are Schmitt input
+		UCHAR ADDriveCurrent;		// valid values are 4mA, 8mA, 12mA, 16mA
+		// CBUS options
+		UCHAR Cbus0;				// Cbus Mux control
+		UCHAR Cbus1;				// Cbus Mux control
+		UCHAR Cbus2;				// Cbus Mux control
+		UCHAR Cbus3;				// Cbus Mux control
+		UCHAR Cbus4;				// Cbus Mux control
+		UCHAR Cbus5;				// Cbus Mux control
+		UCHAR Cbus6;				// Cbus Mux control
+		// UART signal options
+		UCHAR InvertTXD;			// non-zero if invert TXD
+		UCHAR InvertRXD;			// non-zero if invert RXD
+		UCHAR InvertRTS;			// non-zero if invert RTS
+		UCHAR InvertCTS;			// non-zero if invert CTS
+		UCHAR InvertDTR;			// non-zero if invert DTR
+		UCHAR InvertDSR;			// non-zero if invert DSR
+		UCHAR InvertDCD;			// non-zero if invert DCD
+		UCHAR InvertRI;				// non-zero if invert RI
+		// Battery Charge Detect options
+		UCHAR BCDEnable;			// Enable Battery Charger Detection
+		UCHAR BCDForceCbusPWREN;	// asserts the power enable signal on CBUS when charging port detected
+		UCHAR BCDDisableSleep;		// forces the device never to go into sleep mode
+		// I2C options
+		WORD I2CSlaveAddress;		// I2C slave device address
+		DWORD I2CDeviceId;			// I2C device ID
+		UCHAR I2CDisableSchmitt;	// Disable I2C Schmitt trigger
+		// FT1248 options
+		UCHAR FT1248Cpol;			// FT1248 clock polarity - clock idle high (1) or clock idle low (0)
+		UCHAR FT1248Lsb;			// FT1248 data is LSB (1) or MSB (0)
+		UCHAR FT1248FlowControl;	// FT1248 flow control enable
+		// Hardware options
+		UCHAR RS485EchoSuppress;	// 
+		UCHAR PowerSaveEnable;		// 
+		// Driver option
+		UCHAR DriverType;			// 
+	} FT_EEPROM_X_SERIES, *PFT_EEPROM_X_SERIES;
+
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EEPROM_Read(
+		FT_HANDLE ftHandle,
+		void *eepromData,
+		DWORD eepromDataSize,
+		char *Manufacturer,
+		char *ManufacturerId,
+		char *Description,
+		char *SerialNumber
+		);
+
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EEPROM_Program(
+		FT_HANDLE ftHandle,
+		void *eepromData,
+		DWORD eepromDataSize,
+		char *Manufacturer,
+		char *ManufacturerId,
+		char *Description,
+		char *SerialNumber
+		);
+
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetLatencyTimer(
+		FT_HANDLE ftHandle,
+		UCHAR ucLatency
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetLatencyTimer(
+		FT_HANDLE ftHandle,
+		PUCHAR pucLatency
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetBitMode(
+		FT_HANDLE ftHandle,
+		UCHAR ucMask,
+		UCHAR ucEnable
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetBitMode(
+		FT_HANDLE ftHandle,
+		PUCHAR pucMode
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetUSBParameters(
+		FT_HANDLE ftHandle,
+		ULONG ulInTransferSize,
+		ULONG ulOutTransferSize
+		);
+
+#ifdef _WINDOWS
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetDeadmanTimeout(
+		FT_HANDLE ftHandle,
+		ULONG ulDeadmanTimeout
+		);
+#else
+	/* Linux, Mac etc. define FT_SetDeadmanTimeout differently elsewhere. */
+	
+	/* Linux etc. offer extra functions to compensate for lack of .INF file
+	 * to specify VID+PID combinations.
+	 */
+	FTD2XX_API
+		FT_STATUS FT_SetVIDPID(
+		DWORD dwVID, 
+		DWORD dwPID
+		);
+			
+	FTD2XX_API
+		FT_STATUS FT_GetVIDPID(
+		DWORD * pdwVID, 
+		DWORD * pdwPID
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetDeviceLocId(
+		FT_HANDLE ftHandle,
+		LPDWORD lpdwLocId
+		);
+#endif /* _WINDOWS */		
+		
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetDeviceInfo(
+		FT_HANDLE ftHandle,
+		FT_DEVICE *lpftDevice,
+		LPDWORD lpdwID,
+		PCHAR SerialNumber,
+		PCHAR Description,
+		LPVOID Dummy
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_StopInTask(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_RestartInTask(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_SetResetPipeRetryCount(
+		FT_HANDLE ftHandle,
+		DWORD dwCount
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_ResetPort(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_CyclePort(
+		FT_HANDLE ftHandle
+		);
+
+
 	//
-	// Rev 9 (FT232H) Extensions
+	// Win32-type functions
 	//
-	UCHAR PullDownEnableH;		// non-zero if pull down enabled
-	UCHAR SerNumEnableH;		// non-zero if serial number to be used
-	UCHAR ACSlowSlewH;			// non-zero if AC pins have slow slew
-	UCHAR ACSchmittInputH;		// non-zero if AC pins are Schmitt input
-	UCHAR ACDriveCurrentH;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR ADSlowSlewH;			// non-zero if AD pins have slow slew
-	UCHAR ADSchmittInputH;		// non-zero if AD pins are Schmitt input
-	UCHAR ADDriveCurrentH;		// valid values are 4mA, 8mA, 12mA, 16mA
-	UCHAR Cbus0H;				// Cbus Mux control
-	UCHAR Cbus1H;				// Cbus Mux control
-	UCHAR Cbus2H;				// Cbus Mux control
-	UCHAR Cbus3H;				// Cbus Mux control
-	UCHAR Cbus4H;				// Cbus Mux control
-	UCHAR Cbus5H;				// Cbus Mux control
-	UCHAR Cbus6H;				// Cbus Mux control
-	UCHAR Cbus7H;				// Cbus Mux control
-	UCHAR Cbus8H;				// Cbus Mux control
-	UCHAR Cbus9H;				// Cbus Mux control
-	UCHAR IsFifoH;				// non-zero if interface is 245 FIFO
-	UCHAR IsFifoTarH;			// non-zero if interface is 245 FIFO CPU target
-	UCHAR IsFastSerH;			// non-zero if interface is Fast serial
-	UCHAR IsFT1248H;			// non-zero if interface is FT1248
-	UCHAR FT1248CpolH;			// FT1248 clock polarity - clock idle high (1) or clock idle low (0)
-	UCHAR FT1248LsbH;			// FT1248 data is LSB (1) or MSB (0)
-	UCHAR FT1248FlowControlH;	// FT1248 flow control enable
-	UCHAR IsVCPH;				// non-zero if interface is to use VCP drivers
-	UCHAR PowerSaveEnableH;		// non-zero if using ACBUS7 to save power for self-powered designs
-	
-} FT_PROGRAM_DATA, *PFT_PROGRAM_DATA;
 
-	
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_Program(
-    FT_HANDLE ftHandle,
-	PFT_PROGRAM_DATA pData
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_ProgramEx(
-    FT_HANDLE ftHandle,
-	PFT_PROGRAM_DATA lpData,
-	char *Manufacturer,
-	char *ManufacturerId,
-	char *Description,
-	char *SerialNumber
-	);
-	
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_Read(
-    FT_HANDLE ftHandle,
-	PFT_PROGRAM_DATA pData
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_ReadEx(
-    FT_HANDLE ftHandle,
-	PFT_PROGRAM_DATA lpData,
-	char *Manufacturer,
-	char *ManufacturerId,
-	char *Description,
-	char *SerialNumber
-	);
-	
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_UASize(
-    FT_HANDLE ftHandle,
-	LPDWORD lpdwSize
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_UAWrite(
-    FT_HANDLE ftHandle,
-	PUCHAR pucData,
-	DWORD dwDataLen
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_EE_UARead(
-    FT_HANDLE ftHandle,
-	PUCHAR pucData,
-	DWORD dwDataLen,
-	LPDWORD lpdwBytesRead
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetLatencyTimer(
-    FT_HANDLE ftHandle,
-    UCHAR ucLatency
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetLatencyTimer(
-    FT_HANDLE ftHandle,
-    PUCHAR pucLatency
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetBitMode(
-    FT_HANDLE ftHandle,
-    UCHAR ucMask,
-	UCHAR ucEnable
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetBitMode(
-    FT_HANDLE ftHandle,
-    PUCHAR pucMode
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetUSBParameters(
-    FT_HANDLE ftHandle,
-    ULONG ulInTransferSize,
-    ULONG ulOutTransferSize
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetDeviceInfo(
-    FT_HANDLE ftHandle,
-    FT_DEVICE *lpftDevice,
-	LPDWORD lpdwID,
-	PCHAR SerialNumber,
-	PCHAR Description,
-	LPVOID Dummy
-    );
-	
-FTD2XX_API
-FT_STATUS WINAPI FT_GetDeviceLocId(
-   FT_HANDLE ftHandle,
-   LPDWORD lpdwLocId
-   );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_StopInTask(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_RestartInTask(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_SetResetPipeRetryCount(
-    FT_HANDLE ftHandle,
-	DWORD dwCount
-    );
-
-FTD2XX_API
-FT_STATUS WINAPI FT_ResetPort(
-    FT_HANDLE ftHandle
-    );
+	FTD2XX_API
+		FT_HANDLE WINAPI FT_W32_CreateFile(
+		LPCTSTR					lpszName,
+		DWORD					dwAccess,
+		DWORD					dwShareMode,
+		LPSECURITY_ATTRIBUTES	lpSecurityAttributes,
+		DWORD					dwCreate,
+		DWORD					dwAttrsAndFlags,
+		HANDLE					hTemplate
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_CloseHandle(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_ReadFile(
+		FT_HANDLE ftHandle,
+		LPVOID lpBuffer,
+		DWORD nBufferSize,
+		LPDWORD lpBytesReturned,
+		LPOVERLAPPED lpOverlapped
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_WriteFile(
+		FT_HANDLE ftHandle,
+		LPVOID lpBuffer,
+		DWORD nBufferSize,
+		LPDWORD lpBytesWritten,
+		LPOVERLAPPED lpOverlapped
+		);
+
+	FTD2XX_API
+		DWORD WINAPI FT_W32_GetLastError(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_GetOverlappedResult(
+		FT_HANDLE ftHandle,
+		LPOVERLAPPED lpOverlapped,
+		LPDWORD lpdwBytesTransferred,
+		BOOL bWait
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_CancelIo(
+		FT_HANDLE ftHandle
+		);
 
 
-//
-// Win32-type functions
-//
+	//
+	// Win32 COMM API type functions
+	//
+	typedef struct _FTCOMSTAT {
+		DWORD fCtsHold : 1;
+		DWORD fDsrHold : 1;
+		DWORD fRlsdHold : 1;
+		DWORD fXoffHold : 1;
+		DWORD fXoffSent : 1;
+		DWORD fEof : 1;
+		DWORD fTxim : 1;
+		DWORD fReserved : 25;
+		DWORD cbInQue;
+		DWORD cbOutQue;
+	} FTCOMSTAT, *LPFTCOMSTAT;
+
+	typedef struct _FTDCB {
+		DWORD DCBlength;			/* sizeof(FTDCB)						*/
+		DWORD BaudRate;				/* Baudrate at which running			*/
+		DWORD fBinary: 1;			/* Binary Mode (skip EOF check)			*/
+		DWORD fParity: 1;			/* Enable parity checking				*/
+		DWORD fOutxCtsFlow:1;		/* CTS handshaking on output			*/
+		DWORD fOutxDsrFlow:1;		/* DSR handshaking on output			*/
+		DWORD fDtrControl:2;		/* DTR Flow control						*/
+		DWORD fDsrSensitivity:1;	/* DSR Sensitivity						*/
+		DWORD fTXContinueOnXoff: 1;	/* Continue TX when Xoff sent			*/
+		DWORD fOutX: 1;				/* Enable output X-ON/X-OFF				*/
+		DWORD fInX: 1;				/* Enable input X-ON/X-OFF				*/
+		DWORD fErrorChar: 1;		/* Enable Err Replacement				*/
+		DWORD fNull: 1;				/* Enable Null stripping				*/
+		DWORD fRtsControl:2;		/* Rts Flow control						*/
+		DWORD fAbortOnError:1;		/* Abort all reads and writes on Error	*/
+		DWORD fDummy2:17;			/* Reserved								*/
+		WORD wReserved;				/* Not currently used					*/
+		WORD XonLim;				/* Transmit X-ON threshold				*/
+		WORD XoffLim;				/* Transmit X-OFF threshold				*/
+		BYTE ByteSize;				/* Number of bits/byte, 4-8				*/
+		BYTE Parity;				/* 0-4=None,Odd,Even,Mark,Space			*/
+		BYTE StopBits;				/* 0,1,2 = 1, 1.5, 2					*/
+		char XonChar;				/* Tx and Rx X-ON character				*/
+		char XoffChar;				/* Tx and Rx X-OFF character			*/
+		char ErrorChar;				/* Error replacement char				*/
+		char EofChar;				/* End of Input character				*/
+		char EvtChar;				/* Received Event character				*/
+		WORD wReserved1;			/* Fill for now.						*/
+	} FTDCB, *LPFTDCB;
+
+	typedef struct _FTTIMEOUTS {
+		DWORD ReadIntervalTimeout;			/* Maximum time between read chars.	*/
+		DWORD ReadTotalTimeoutMultiplier;	/* Multiplier of characters.		*/
+		DWORD ReadTotalTimeoutConstant;		/* Constant in milliseconds.		*/
+		DWORD WriteTotalTimeoutMultiplier;	/* Multiplier of characters.		*/
+		DWORD WriteTotalTimeoutConstant;	/* Constant in milliseconds.		*/
+	} FTTIMEOUTS,*LPFTTIMEOUTS;
+
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_ClearCommBreak(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_ClearCommError(
+		FT_HANDLE ftHandle,
+		LPDWORD lpdwErrors,
+		LPFTCOMSTAT lpftComstat
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_EscapeCommFunction(
+		FT_HANDLE ftHandle,
+		DWORD dwFunc
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_GetCommModemStatus(
+		FT_HANDLE ftHandle,
+		LPDWORD lpdwModemStatus
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_GetCommState(
+		FT_HANDLE ftHandle,
+		LPFTDCB lpftDcb
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_GetCommTimeouts(
+		FT_HANDLE ftHandle,
+		FTTIMEOUTS *pTimeouts
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_PurgeComm(
+		FT_HANDLE ftHandle,
+		DWORD dwMask
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_SetCommBreak(
+		FT_HANDLE ftHandle
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_SetCommMask(
+		FT_HANDLE ftHandle,
+		ULONG ulEventMask
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_GetCommMask(
+		FT_HANDLE ftHandle,
+		LPDWORD lpdwEventMask
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_SetCommState(
+		FT_HANDLE ftHandle,
+		LPFTDCB lpftDcb
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_SetCommTimeouts(
+		FT_HANDLE ftHandle,
+		FTTIMEOUTS *pTimeouts
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_SetupComm(
+		FT_HANDLE ftHandle,
+		DWORD dwReadBufferSize,
+		DWORD dwWriteBufferSize
+		);
+
+	FTD2XX_API
+		BOOL WINAPI FT_W32_WaitCommEvent(
+		FT_HANDLE ftHandle,
+		PULONG pulEvent,
+		LPOVERLAPPED lpOverlapped
+		);
 
-FTD2XX_API
-FT_HANDLE WINAPI FT_W32_CreateFile(
-	LPCSTR					lpszName,
-	DWORD					dwAccess,
-	DWORD					dwShareMode,
-	LPSECURITY_ATTRIBUTES	lpSecurityAttributes,
-	DWORD					dwCreate,
-	DWORD					dwAttrsAndFlags,
-	HANDLE					hTemplate
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_CloseHandle(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_ReadFile(
-    FT_HANDLE ftHandle,
-    LPVOID lpBuffer,
-    DWORD nBufferSize,
-    LPDWORD lpBytesReturned,
-	LPOVERLAPPED lpOverlapped
-    );
-
-FTD2XX_API
-BOOL WINAPI FT_W32_WriteFile(
-    FT_HANDLE ftHandle,
-    LPVOID lpBuffer,
-    DWORD nBufferSize,
-    LPDWORD lpBytesWritten,
-	LPOVERLAPPED lpOverlapped
-    );
-
-FTD2XX_API
-DWORD WINAPI FT_W32_GetLastError(
-    FT_HANDLE ftHandle
-    );
-
-FTD2XX_API
-BOOL WINAPI FT_W32_GetOverlappedResult(
-    FT_HANDLE ftHandle,
-	LPOVERLAPPED lpOverlapped,
-    LPDWORD lpdwBytesTransferred,
-	BOOL bWait
-    );
-
-FTD2XX_API
-BOOL WINAPI FT_W32_CancelIo(
-    FT_HANDLE ftHandle
-    );
 
+	//
+	// Device information
+	//
 
-//
-// Win32 COMM API type functions
-//
-typedef struct _FTCOMSTAT {
-    DWORD fCtsHold : 1;
-    DWORD fDsrHold : 1;
-    DWORD fRlsdHold : 1;
-    DWORD fXoffHold : 1;
-    DWORD fXoffSent : 1;
-    DWORD fEof : 1;
-    DWORD fTxim : 1;
-    DWORD fReserved : 25;
-    DWORD cbInQue;
-    DWORD cbOutQue;
-} FTCOMSTAT, *LPFTCOMSTAT;
-
-typedef struct _FTDCB {
-    DWORD DCBlength;      /* sizeof(FTDCB)                   */
-    DWORD BaudRate;       /* Baudrate at which running       */
-    DWORD fBinary: 1;     /* Binary Mode (skip EOF check)    */
-    DWORD fParity: 1;     /* Enable parity checking          */
-    DWORD fOutxCtsFlow:1; /* CTS handshaking on output       */
-    DWORD fOutxDsrFlow:1; /* DSR handshaking on output       */
-    DWORD fDtrControl:2;  /* DTR Flow control                */
-    DWORD fDsrSensitivity:1; /* DSR Sensitivity              */
-    DWORD fTXContinueOnXoff: 1; /* Continue TX when Xoff sent */
-    DWORD fOutX: 1;       /* Enable output X-ON/X-OFF        */
-    DWORD fInX: 1;        /* Enable input X-ON/X-OFF         */
-    DWORD fErrorChar: 1;  /* Enable Err Replacement          */
-    DWORD fNull: 1;       /* Enable Null stripping           */
-    DWORD fRtsControl:2;  /* Rts Flow control                */
-    DWORD fAbortOnError:1; /* Abort all reads and writes on Error */
-    DWORD fDummy2:17;     /* Reserved                        */
-    WORD wReserved;       /* Not currently used              */
-    WORD XonLim;          /* Transmit X-ON threshold         */
-    WORD XoffLim;         /* Transmit X-OFF threshold        */
-    BYTE ByteSize;        /* Number of bits/byte, 4-8        */
-    BYTE Parity;          /* 0-4=None,Odd,Even,Mark,Space    */
-    BYTE StopBits;        /* 0,1,2 = 1, 1.5, 2               */
-    char XonChar;         /* Tx and Rx X-ON character        */
-    char XoffChar;        /* Tx and Rx X-OFF character       */
-    char ErrorChar;       /* Error replacement char          */
-    char EofChar;         /* End of Input character          */
-    char EvtChar;         /* Received Event character        */
-    WORD wReserved1;      /* Fill for now.                   */
-} FTDCB, *LPFTDCB;
-
-typedef struct _FTTIMEOUTS {
-    DWORD ReadIntervalTimeout;          /* Maximum time between read chars. */
-    DWORD ReadTotalTimeoutMultiplier;   /* Multiplier of characters.        */
-    DWORD ReadTotalTimeoutConstant;     /* Constant in milliseconds.        */
-    DWORD WriteTotalTimeoutMultiplier;  /* Multiplier of characters.        */
-    DWORD WriteTotalTimeoutConstant;    /* Constant in milliseconds.        */
-} FTTIMEOUTS,*LPFTTIMEOUTS;
-
-
-FTD2XX_API
-BOOL WINAPI FT_W32_ClearCommBreak(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_ClearCommError(
-    FT_HANDLE ftHandle,
-	LPDWORD lpdwErrors,
-    LPFTCOMSTAT lpftComstat
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_EscapeCommFunction(
-    FT_HANDLE ftHandle,
-	DWORD dwFunc
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_GetCommModemStatus(
-    FT_HANDLE ftHandle,
-	LPDWORD lpdwModemStatus
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_GetCommState(
-    FT_HANDLE ftHandle,
-    LPFTDCB lpftDcb
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_GetCommTimeouts(
-    FT_HANDLE ftHandle,
-    FTTIMEOUTS *pTimeouts
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_PurgeComm(
-    FT_HANDLE ftHandle,
-	DWORD dwMask
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_SetCommBreak(
-    FT_HANDLE ftHandle
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_SetCommMask(
-    FT_HANDLE ftHandle,
-    ULONG ulEventMask
-    );
-
-FTD2XX_API
-BOOL WINAPI FT_W32_SetCommState(
-    FT_HANDLE ftHandle,
-    LPFTDCB lpftDcb
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_SetCommTimeouts(
-    FT_HANDLE ftHandle,
-    FTTIMEOUTS *pTimeouts
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_SetupComm(
-    FT_HANDLE ftHandle,
-	DWORD dwReadBufferSize,
-	DWORD dwWriteBufferSize
-	);
-
-FTD2XX_API
-BOOL WINAPI FT_W32_WaitCommEvent(
-    FT_HANDLE ftHandle,
-    PULONG pulEvent,
-	LPOVERLAPPED lpOverlapped
-    );
+	typedef struct _ft_device_list_info_node {
+		ULONG Flags;
+		ULONG Type;
+		ULONG ID;
+		DWORD LocId;
+		char SerialNumber[16];
+		char Description[64];
+		FT_HANDLE ftHandle;
+	} FT_DEVICE_LIST_INFO_NODE;
+
+	// Device information flags
+	enum {
+		FT_FLAGS_OPENED = 1,
+		FT_FLAGS_HISPEED = 2
+	};
+
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_CreateDeviceInfoList(
+		LPDWORD lpdwNumDevs
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetDeviceInfoList(
+		FT_DEVICE_LIST_INFO_NODE *pDest,
+		LPDWORD lpdwNumDevs
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetDeviceInfoDetail(
+		DWORD dwIndex,
+		LPDWORD lpdwFlags,
+		LPDWORD lpdwType,
+		LPDWORD lpdwID,
+		LPDWORD lpdwLocId,
+		LPVOID lpSerialNumber,
+		LPVOID lpDescription,
+		FT_HANDLE *pftHandle
+		);
 
-//
-// Device information
-//
 
-typedef struct _ft_device_list_info_node {
-	ULONG Flags;
-    ULONG Type;
-	ULONG ID;
-	DWORD LocId;
-	char SerialNumber[16];
-	char Description[64];
-	FT_HANDLE ftHandle;
-} FT_DEVICE_LIST_INFO_NODE;
-
-// Device information flags
-enum {
-	FT_FLAGS_OPENED = 1,
-	FT_FLAGS_HISPEED = 2
-};
+	//
+	// Version information
+	//
 
-FTD2XX_API
-FT_STATUS WINAPI FT_CreateDeviceInfoList(
-	LPDWORD lpdwNumDevs
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetDeviceInfoList(
-	FT_DEVICE_LIST_INFO_NODE *pDest,
-	LPDWORD lpdwNumDevs
-	);
-
-FTD2XX_API
-FT_STATUS WINAPI FT_GetDeviceInfoDetail(
-	DWORD dwIndex,
-	LPDWORD lpdwFlags,
-	LPDWORD lpdwType,
-	LPDWORD lpdwID,
-	LPDWORD lpdwLocId,
-	LPVOID lpSerialNumber,
-	LPVOID lpDescription,
-	FT_HANDLE *pftHandle
-	);
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetDriverVersion(
+		FT_HANDLE ftHandle,
+		LPDWORD lpdwVersion
+		);
 
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetLibraryVersion(
+		LPDWORD lpdwVersion
+		);
 
-//
-// Version information
-//
 
-FTD2XX_API
-FT_STATUS WINAPI FT_GetDriverVersion(
-    FT_HANDLE ftHandle,
-	LPDWORD	lpdwVersion
-	);
+	FTD2XX_API
+		FT_STATUS WINAPI FT_Rescan(
+		void
+		);
 
-FTD2XX_API
-FT_STATUS WINAPI FT_GetLibraryVersion(
-	LPDWORD	lpdwVersion
-	);		
+	FTD2XX_API
+		FT_STATUS WINAPI FT_Reload(
+		WORD wVid,
+		WORD wPid
+		);
 
-//
-// Events
-//
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetComPortNumber(
+		FT_HANDLE ftHandle,
+		LPLONG	lpdwComPortNumber
+		);
 
-#define EV_RXCHAR           0x0001  // Any Character received
-#define EV_RXFLAG           0x0002  // Received certain character
-#define EV_TXEMPTY          0x0004  // Transmitt Queue Empty
-#define EV_CTS              0x0008  // CTS changed state
-#define EV_DSR              0x0010  // DSR changed state
-#define EV_RLSD             0x0020  // RLSD changed state
-#define EV_BREAK            0x0040  // BREAK received
-#define EV_ERR              0x0080  // Line status error occurred
-#define EV_RING             0x0100  // Ring signal detected
-#define EV_PERR             0x0200  // Printer error occured
-#define EV_RX80FULL         0x0400  // Receive buffer is 80 percent full
-#define EV_EVENT1           0x0800  // Provider specific event 1
-#define EV_EVENT2           0x1000  // Provider specific event 2
 
-//
-// Escape Functions
-//
+	//
+	// FT232H additional EEPROM functions
+	//
 
-#define SETXOFF             1       // Simulate XOFF received
-#define SETXON              2       // Simulate XON received
-#define SETRTS              3       // Set RTS high
-#define CLRRTS              4       // Set RTS low
-#define SETDTR              5       // Set DTR high
-#define CLRDTR              6       // Set DTR low
-#define RESETDEV            7       // Reset device if possible
-#define SETBREAK            8       // Set the device break line.
-#define CLRBREAK            9       // Clear the device break line.
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EE_ReadConfig(
+		FT_HANDLE ftHandle,
+		UCHAR ucAddress,
+		PUCHAR pucValue
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EE_WriteConfig(
+		FT_HANDLE ftHandle,
+		UCHAR ucAddress,
+		UCHAR ucValue
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_EE_ReadECC(
+		FT_HANDLE ftHandle,
+		UCHAR ucOption,
+		LPWORD lpwValue
+		);
+
+	FTD2XX_API
+		FT_STATUS WINAPI FT_GetQueueStatusEx(
+		FT_HANDLE ftHandle,
+		DWORD *dwRxBytes
+		);
 
-//
-// PURGE function flags.
-//
-#define PURGE_TXABORT       0x0001  // Kill the pending/current writes to the comm port.
-#define PURGE_RXABORT       0x0002  // Kill the pending/current reads to the comm port.
-#define PURGE_TXCLEAR       0x0004  // Kill the transmit queue if there.
-#define PURGE_RXCLEAR       0x0008  // Kill the typeahead buffer if there.
 
 #ifdef __cplusplus
 }
 #endif
 
 
-#endif  /* FTD2XX_H */
-
-
-
-
-
+#endif	/* FTD2XX_H */