- (unsigned)ftbytes, (unsigned)size);
- return ERROR_JTAG_DEVICE_ERROR;
- }
-
- return ERROR_OK;
-}
-
-#if BUILD_PRESTO_FTD2XX == 1
-static int presto_open_ftd2xx(char *req_serial)
-{
- uint32_t i;
- DWORD numdevs;
- DWORD vidpid;
- char devname[FT_DEVICE_NAME_LEN];
- FT_DEVICE device;
-
- BYTE presto_data;
- DWORD ftbytes;
-
- presto->handle = (FT_HANDLE)INVALID_HANDLE_VALUE;
-
-#if IS_WIN32 == 0
- /* Add non-standard Vid/Pid to the linux driver */
- if ((presto->status = FT_SetVIDPID(PRESTO_VID, PRESTO_PID)) != FT_OK)
- {
- LOG_ERROR("couldn't add PRESTO VID/PID");
- exit(-1);
- }
-#endif
-
- if ((presto->status = FT_ListDevices(&numdevs, NULL, FT_LIST_NUMBER_ONLY)) != FT_OK)
- {
- LOG_ERROR("FT_ListDevices failed: %i", (int)presto->status);
- return ERROR_JTAG_DEVICE_ERROR;
- }
-
- LOG_DEBUG("FTDI devices available: %lu", numdevs);
- for (i = 0; i < numdevs; i++)
- {
- if ((presto->status = FT_Open(i, &(presto->handle))) != FT_OK)
- {
- /* this is not fatal, the device may be legitimately open by other process, hence debug message only */
- LOG_DEBUG("FT_Open failed: %i", (int)presto->status);
- continue;
- }
- LOG_DEBUG("FTDI device %i open", (int)i);
-
- if ((presto->status = FT_GetDeviceInfo(presto->handle, &device, &vidpid,
- presto->serial, devname, NULL)) == FT_OK)
- {
- if (vidpid == PRESTO_VID_PID
- && (req_serial == NULL || !strcmp(presto->serial, req_serial)))
- break;
- }
- else
- LOG_DEBUG("FT_GetDeviceInfo failed: %lu", presto->status);
-
- LOG_DEBUG("FTDI device %i does not match, closing", (int)i);
- FT_Close(presto->handle);
- presto->handle = (FT_HANDLE)INVALID_HANDLE_VALUE;
- }
-
- if (presto->handle == (FT_HANDLE)INVALID_HANDLE_VALUE)
- return ERROR_JTAG_DEVICE_ERROR; /* presto not open, return */
-
- if ((presto->status = FT_SetLatencyTimer(presto->handle, 1)) != FT_OK)
- return ERROR_JTAG_DEVICE_ERROR;
-
-
- if ((presto->status = FT_SetTimeouts(presto->handle, 100, 0)) != FT_OK)
- return ERROR_JTAG_DEVICE_ERROR;
-
- if ((presto->status = FT_Purge(presto->handle, FT_PURGE_TX | FT_PURGE_RX)) != FT_OK)
- return ERROR_JTAG_DEVICE_ERROR;
-
- presto_data = 0xD0;
- if ((presto->status = FT_Write(presto->handle, &presto_data, 1, &ftbytes)) != FT_OK)
- return ERROR_JTAG_DEVICE_ERROR;
-
- /* delay between first write/read turnaround (after purge?) necessary under Linux for unknown reason,
- probably a bug in library threading */
- usleep(100000);
- if ((presto->status = FT_Read(presto->handle, &presto_data, 1, &ftbytes)) != FT_OK)