Second version of previous patch improved with suggestions from Ronald.

Pls try (; Works for me <:

4\/3!!
Index: ft2232.c
===================================================================
--- ft2232.c    (revision 2405)
+++ ft2232.c    (working copy)
@@ -63,6 +63,51 @@
 #include <ftdi.h>
 #endif
 
+/* Dynamic loading of libraries at runtime - only for Win32 and ftd2xx.dll 
currently */
+
+#if defined(_WIN32) && BUILD_FT2232_FTD2XX == 1
+#define FTD2XX_DYNAMIC 1
+#else
+#define FTD2XX_DYNAMIC 0
+#endif
+
+#if FTD2XX_DYNAMIC == 1
+
+// typedefs for all used functions from ftd2xx.dll library
+typedef FT_STATUS (WINAPI *FT_Write_t)(FT_HANDLE ftHandle, LPVOID lpBuffer, 
DWORD dwBytesToWrite, LPDWORD lpBytesWritten);
+typedef FT_STATUS (WINAPI *FT_Read_t)(FT_HANDLE ftHandle, LPVOID lpBuffer, 
DWORD dwBytesToRead, LPDWORD lpBytesReturned);
+typedef FT_STATUS (WINAPI *FT_OpenEx_t)(PVOID pArg1, DWORD Flags, FT_HANDLE 
*pHandle);
+typedef FT_STATUS (WINAPI *FT_ListDevices_t)(PVOID pArg1, PVOID pArg2, DWORD 
Flags);
+typedef FT_STATUS (WINAPI *FT_SetLatencyTimer_t)(FT_HANDLE ftHandle, UCHAR 
ucLatency);
+typedef FT_STATUS (WINAPI *FT_GetLatencyTimer_t)(FT_HANDLE ftHandle, PUCHAR 
pucLatency);
+typedef FT_STATUS (WINAPI *FT_SetTimeouts_t)(FT_HANDLE ftHandle, ULONG 
ReadTimeout, ULONG WriteTimeout);
+typedef FT_STATUS (WINAPI *FT_SetBitMode_t)(FT_HANDLE ftHandle, UCHAR ucMask, 
UCHAR ucEnable);
+typedef FT_STATUS (WINAPI *FT_GetDeviceInfo_t)(FT_HANDLE ftHandle, FT_DEVICE 
*lpftDevice, LPDWORD lpdwID, PCHAR SerialNumber, PCHAR Description, LPVOID 
Dummy);
+typedef FT_STATUS (WINAPI *FT_Purge_t)(FT_HANDLE ftHandle, ULONG Mask);
+typedef FT_STATUS (WINAPI *FT_Close_t)(FT_HANDLE ftHandle);
+
+// library handle
+static HINSTANCE dynamic_library;
+
+// global pointers for read and write functions
+static FT_Write_t FT_Write_ptr;
+static FT_Read_t FT_Read_ptr;
+
+// replacements for original functions
+#define FT_Write                       (*FT_Write_ptr)
+#define FT_Read                                (*FT_Read_ptr)
+#define FT_OpenEx                      (*FT_OpenEx_ptr)
+#define FT_ListDevices         (*FT_ListDevices_ptr)
+#define FT_SetLatencyTimer     (*FT_SetLatencyTimer_ptr)
+#define FT_GetLatencyTimer     (*FT_GetLatencyTimer_ptr)
+#define FT_SetTimeouts         (*FT_SetTimeouts_ptr)
+#define FT_SetBitMode          (*FT_SetBitMode_ptr)
+#define FT_GetDeviceInfo       (*FT_GetDeviceInfo_ptr)
+#define FT_Purge                       (*FT_Purge_ptr)
+#define FT_Close                       (*FT_Close_ptr)
+
+#endif
+
 /* max TCK for the high speed devices 30000 kHz */
 #define        FTDI_2232H_4232H_MAX_TCK        30000
 
@@ -1803,6 +1848,78 @@
 
        LOG_DEBUG("'ft2232' interface using FTD2XX with '%s' layout 
(%4.4x:%4.4x)", ft2232_layout, vid, pid);
 
+#if FTD2XX_DYNAMIC == 1
+
+       FT_OpenEx_t FT_OpenEx_ptr;
+       FT_ListDevices_t FT_ListDevices_ptr;
+       FT_SetLatencyTimer_t FT_SetLatencyTimer_ptr;
+       FT_GetLatencyTimer_t FT_GetLatencyTimer_ptr;
+       FT_SetTimeouts_t FT_SetTimeouts_ptr;
+       FT_SetBitMode_t FT_SetBitMode_ptr;
+       FT_GetDeviceInfo_t FT_GetDeviceInfo_ptr;
+
+       dynamic_library = LoadLibrary("ftd2xx.dll");
+
+       if(dynamic_library == NULL)
+       {
+               LOG_ERROR("Can't open ftd2xx.dll");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+       else
+       {
+               BOOL fail = FALSE;
+
+               if((FT_Write_ptr = (FT_Write_t)GetProcAddress(dynamic_library, 
"FT_Write")) == NULL)
+               {
+                       LOG_ERROR("Can't get FT_Write() function");
+                       fail = TRUE;
+               }
+               if((FT_Read_ptr = (FT_Read_t)GetProcAddress(dynamic_library, 
"FT_Read")) == NULL)
+               {
+                       LOG_ERROR("Can't get FT_Read() function");
+                       fail = TRUE;
+               }
+               if((FT_OpenEx_ptr = 
(FT_OpenEx_t)GetProcAddress(dynamic_library, "FT_OpenEx")) == NULL)
+               {
+                       LOG_ERROR("Can't get FT_OpenEx() function");
+                       fail = TRUE;
+               }
+               if((FT_ListDevices_ptr = 
(FT_ListDevices_t)GetProcAddress(dynamic_library, "FT_ListDevices")) == NULL)
+               {
+                       LOG_ERROR("Can't get FT_ListDevices() function");
+                       fail = TRUE;
+               }
+               if((FT_SetLatencyTimer_ptr = 
(FT_SetLatencyTimer_t)GetProcAddress(dynamic_library, "FT_SetLatencyTimer")) == 
NULL)
+               {
+                       LOG_ERROR("Can't get FT_SetLatencyTimer() function");
+                       fail = TRUE;
+               }
+               if((FT_GetLatencyTimer_ptr = 
(FT_GetLatencyTimer_t)GetProcAddress(dynamic_library, "FT_GetLatencyTimer")) == 
NULL)
+               {
+                       LOG_ERROR("Can't get FT_GetLatencyTimer() function");
+                       fail = TRUE;
+               }
+               if((FT_SetTimeouts_ptr = 
(FT_SetTimeouts_t)GetProcAddress(dynamic_library, "FT_SetTimeouts")) == NULL)
+               {
+                       LOG_ERROR("Can't get FT_SetTimeouts() function");
+                       fail = TRUE;
+               }
+               if((FT_SetBitMode_ptr = 
(FT_SetBitMode_t)GetProcAddress(dynamic_library, "FT_SetBitMode")) == NULL)
+               {
+                       LOG_ERROR("Can't get FT_SetBitMode() function");
+                       fail = TRUE;
+               }
+               if((FT_GetDeviceInfo_ptr = 
(FT_GetDeviceInfo_t)GetProcAddress(dynamic_library, "FT_GetDeviceInfo")) == 
NULL)
+               {
+                       LOG_ERROR("Can't get FT_GetDeviceInfo() function");
+                       fail = TRUE;
+               }
+
+               if(fail != FALSE)
+                       return ERROR_JTAG_INIT_FAILED;
+       }
+#endif
+
 #if IS_WIN32 == 0
        /* Add non-standard Vid/Pid to the linux driver */
        if ((status = FT_SetVIDPID(vid, pid)) != FT_OK)
@@ -1956,6 +2073,15 @@
 {
        FT_STATUS status;
 
+#if FTD2XX_DYNAMIC == 1
+       FT_Purge_t FT_Purge_ptr;
+
+       if((FT_Purge_ptr = (FT_Purge_t)GetProcAddress(dynamic_library, 
"FT_Purge")) == NULL)
+       {
+               LOG_ERROR("Can't get FT_Purge() function");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+#endif
        if ((status = FT_Purge(ftdih, FT_PURGE_RX | FT_PURGE_TX)) != FT_OK)
        {
                LOG_ERROR("error purging ftd2xx device: %lu", status);
@@ -2760,6 +2886,17 @@
 #if BUILD_FT2232_FTD2XX == 1
        FT_STATUS status;
 
+#if FTD2XX_DYNAMIC == 1
+       FT_Close_t FT_Close_ptr;
+       int retval=ERROR_OK;
+
+       if((FT_Close_ptr = (FT_Close_t)GetProcAddress(dynamic_library, 
"FT_Close")) == NULL)
+       {
+               LOG_ERROR("Can't get FT_Close() function");
+               retval = ERROR_FAIL;
+       }
+       else
+#endif
        status = FT_Close(ftdih);
 #elif BUILD_FT2232_LIBFTDI == 1
        ftdi_usb_close(&ftdic);
@@ -2770,7 +2907,17 @@
        free(ft2232_buffer);
        ft2232_buffer = NULL;
 
+#if FTD2XX_DYNAMIC == 1
+       if(FreeLibrary(dynamic_library) == FALSE)
+       {
+               LOG_ERROR("Can't close library");
+               retval = ERROR_FAIL;
+       }
+
+       return retval;
+#else
        return ERROR_OK;
+#endif
 }
 
 
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to