Various improvements for FTDI support
This commit is contained in:
parent
283da3fafa
commit
cff7d24e5b
|
@ -176,15 +176,21 @@ int ftdi_usb_open_desc_index(struct ftdi_context* ftdi, int vendor, int product,
|
||||||
}
|
}
|
||||||
|
|
||||||
auto device = std::make_unique<FtdiDevice>();
|
auto device = std::make_unique<FtdiDevice>();
|
||||||
auto status = device->OpenBySerialNumber(info.SerialNumber);
|
FT_STATUS status = device->OpenBySerialNumber(info.SerialNumber);
|
||||||
|
if (status == FT_OK)
|
||||||
|
{
|
||||||
|
device->ResetDevice();
|
||||||
|
device->Purge();
|
||||||
|
device->SetBitMode(0, 0);
|
||||||
|
device->SetTimeouts(5000, 5000);
|
||||||
|
status = device->SetEventNotification(FT_EVENT_RXCHAR);
|
||||||
|
}
|
||||||
|
|
||||||
if (status != FT_OK)
|
if (status != FT_OK)
|
||||||
{
|
{
|
||||||
return SetError(ftdi, -3, "failed to open device");
|
return SetError(ftdi, -3, "failed to open device");
|
||||||
}
|
}
|
||||||
|
|
||||||
device->ResetDevice();
|
|
||||||
device->SetEventNotification(FT_EVENT_RXCHAR);
|
|
||||||
|
|
||||||
ftdi->type = MapChipType(info.Type);
|
ftdi->type = MapChipType(info.Type);
|
||||||
ftdi->usb_dev = reinterpret_cast<struct libusb_device_handle*>(device.release());
|
ftdi->usb_dev = reinterpret_cast<struct libusb_device_handle*>(device.release());
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -135,6 +135,7 @@ namespace LibWinFtdi
|
||||||
FAILED(hr = LoadImport(module, "FT_SetLatencyTimer", &FT_SetLatencyTimer)) ||
|
FAILED(hr = LoadImport(module, "FT_SetLatencyTimer", &FT_SetLatencyTimer)) ||
|
||||||
FAILED(hr = LoadImport(module, "FT_GetQueueStatus", &FT_GetQueueStatus)) ||
|
FAILED(hr = LoadImport(module, "FT_GetQueueStatus", &FT_GetQueueStatus)) ||
|
||||||
FAILED(hr = LoadImport(module, "FT_SetEventNotification", &FT_SetEventNotification)) ||
|
FAILED(hr = LoadImport(module, "FT_SetEventNotification", &FT_SetEventNotification)) ||
|
||||||
|
FAILED(hr = LoadImport(module, "FT_SetUSBParameters", &FT_SetUSBParameters)) ||
|
||||||
FAILED(hr = LoadImport(module, "FT_Read", &FT_Read)) ||
|
FAILED(hr = LoadImport(module, "FT_Read", &FT_Read)) ||
|
||||||
FAILED(hr = LoadImport(module, "FT_Write", &FT_Write)))
|
FAILED(hr = LoadImport(module, "FT_Write", &FT_Write)))
|
||||||
{
|
{
|
||||||
|
@ -164,6 +165,7 @@ namespace LibWinFtdi
|
||||||
auto proc = GetProcAddress(module, lpProcName);
|
auto proc = GetProcAddress(module, lpProcName);
|
||||||
if (proc == nullptr)
|
if (proc == nullptr)
|
||||||
{
|
{
|
||||||
|
*ptr = nullptr;
|
||||||
return HRESULT_FROM_WIN32(GetLastError());
|
return HRESULT_FROM_WIN32(GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,13 +184,14 @@ namespace LibWinFtdi
|
||||||
FT_STATUS(WINAPI* FT_ResetDevice)(FT_HANDLE ftHandle) = nullptr;
|
FT_STATUS(WINAPI* FT_ResetDevice)(FT_HANDLE ftHandle) = nullptr;
|
||||||
FT_STATUS(WINAPI* FT_ResetPort)(FT_HANDLE ftHandle) = nullptr;
|
FT_STATUS(WINAPI* FT_ResetPort)(FT_HANDLE ftHandle) = nullptr;
|
||||||
FT_STATUS(WINAPI* FT_CyclePort)(FT_HANDLE ftHandle) = nullptr;
|
FT_STATUS(WINAPI* FT_CyclePort)(FT_HANDLE ftHandle) = nullptr;
|
||||||
FT_STATUS(WINAPI* FT_Purge)(FT_HANDLE ftHandle, ULONG Mask) = nullptr;
|
FT_STATUS(WINAPI* FT_Purge)(FT_HANDLE ftHandle, DWORD dwMask) = nullptr;
|
||||||
FT_STATUS(WINAPI* FT_SetTimeouts)(FT_HANDLE ftHandle, ULONG ReadTimeout, ULONG WriteTimeout) = nullptr;
|
FT_STATUS(WINAPI* FT_SetTimeouts)(FT_HANDLE ftHandle, DWORD dwReadTimeout, DWORD dwWriteTimeout) = nullptr;
|
||||||
FT_STATUS(WINAPI* FT_SetBaudRate)(FT_HANDLE ftHandle, ULONG BaudRate) = nullptr;
|
FT_STATUS(WINAPI* FT_SetBaudRate)(FT_HANDLE ftHandle, DWORD dwBaudRate) = nullptr;
|
||||||
FT_STATUS(WINAPI* FT_SetBitMode)(FT_HANDLE ftHandle, UCHAR ucMask, UCHAR ucEnable) = nullptr;
|
FT_STATUS(WINAPI* FT_SetBitMode)(FT_HANDLE ftHandle, UCHAR ucMask, UCHAR ucEnable) = nullptr;
|
||||||
FT_STATUS(WINAPI* FT_SetLatencyTimer)(FT_HANDLE ftHandle, UCHAR ucLatency) = nullptr;
|
FT_STATUS(WINAPI* FT_SetLatencyTimer)(FT_HANDLE ftHandle, UCHAR ucTimer) = nullptr;
|
||||||
FT_STATUS(WINAPI* FT_GetQueueStatus)(FT_HANDLE ftHandle, DWORD* dwRxBytes) = nullptr;
|
FT_STATUS(WINAPI* FT_GetQueueStatus)(FT_HANDLE ftHandle, DWORD* dwRxBytes) = nullptr;
|
||||||
FT_STATUS(WINAPI* FT_SetEventNotification)(FT_HANDLE ftHandle, DWORD Mask, PVOID Param) = nullptr;
|
FT_STATUS(WINAPI* FT_SetEventNotification)(FT_HANDLE ftHandle, DWORD Mask, PVOID Param) = nullptr;
|
||||||
|
FT_STATUS(WINAPI* FT_SetUSBParameters)(FT_HANDLE ftHandle, DWORD dwInTransferSize, DWORD dwOutTransferSize) = nullptr;
|
||||||
FT_STATUS(WINAPI* FT_Read)(FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesReturned) = nullptr;
|
FT_STATUS(WINAPI* FT_Read)(FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesReturned) = nullptr;
|
||||||
FT_STATUS(WINAPI* FT_Write)(FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten) = nullptr;
|
FT_STATUS(WINAPI* FT_Write)(FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten) = nullptr;
|
||||||
};
|
};
|
||||||
|
@ -316,34 +319,34 @@ namespace LibWinFtdi
|
||||||
return FT_CyclePort(m_handle);
|
return FT_CyclePort(m_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_STATUS Purge(ULONG Mask = FT_PURGE_RX | FT_PURGE_TX)
|
FT_STATUS Purge(DWORD dwMask = FT_PURGE_RX | FT_PURGE_TX)
|
||||||
{
|
{
|
||||||
if (FAILED(Load()))
|
if (FAILED(Load()))
|
||||||
{
|
{
|
||||||
return FT_INVALID_HANDLE;
|
return FT_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FT_Purge(m_handle, Mask);
|
return FT_Purge(m_handle, dwMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_STATUS SetTimeouts(ULONG ReadTimeout, ULONG WriteTimeout)
|
FT_STATUS SetTimeouts(DWORD dwReadTimeout, DWORD dwWriteTimeout)
|
||||||
{
|
{
|
||||||
if (FAILED(Load()))
|
if (FAILED(Load()))
|
||||||
{
|
{
|
||||||
return FT_INVALID_HANDLE;
|
return FT_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FT_SetTimeouts(m_handle, ReadTimeout, WriteTimeout);
|
return FT_SetTimeouts(m_handle, dwReadTimeout, dwWriteTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_STATUS SetBaudRate(ULONG BaudRate)
|
FT_STATUS SetBaudRate(DWORD dwBaudRate)
|
||||||
{
|
{
|
||||||
if (FAILED(Load()))
|
if (FAILED(Load()))
|
||||||
{
|
{
|
||||||
return FT_INVALID_HANDLE;
|
return FT_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FT_SetBaudRate(m_handle, BaudRate);
|
return FT_SetBaudRate(m_handle, dwBaudRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_STATUS SetBitMode(UCHAR ucMask, UCHAR ucEnable)
|
FT_STATUS SetBitMode(UCHAR ucMask, UCHAR ucEnable)
|
||||||
|
@ -356,14 +359,14 @@ namespace LibWinFtdi
|
||||||
return FT_SetBitMode(m_handle, ucMask, ucEnable);
|
return FT_SetBitMode(m_handle, ucMask, ucEnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_STATUS SetLatencyTimer(UCHAR ucLatency)
|
FT_STATUS SetLatencyTimer(UCHAR ucTimer)
|
||||||
{
|
{
|
||||||
if (FAILED(Load()))
|
if (FAILED(Load()))
|
||||||
{
|
{
|
||||||
return FT_INVALID_HANDLE;
|
return FT_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FT_SetLatencyTimer(m_handle, ucLatency);
|
return FT_SetLatencyTimer(m_handle, ucTimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
FT_STATUS GetQueueStatus(DWORD* dwRxBytes)
|
FT_STATUS GetQueueStatus(DWORD* dwRxBytes)
|
||||||
|
@ -391,6 +394,16 @@ namespace LibWinFtdi
|
||||||
return FT_SetEventNotification(m_handle, Mask, m_event);
|
return FT_SetEventNotification(m_handle, Mask, m_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FT_STATUS SetUSBParameters(DWORD dwInTransferSize, DWORD dwOutTransferSize)
|
||||||
|
{
|
||||||
|
if (FAILED(Load()))
|
||||||
|
{
|
||||||
|
return FT_INVALID_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FT_SetUSBParameters(m_handle, dwInTransferSize, dwOutTransferSize);
|
||||||
|
}
|
||||||
|
|
||||||
FT_STATUS Read(LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesReturned)
|
FT_STATUS Read(LPVOID lpBuffer, DWORD dwBytesToRead, LPDWORD lpBytesReturned)
|
||||||
{
|
{
|
||||||
if (FAILED(Load()))
|
if (FAILED(Load()))
|
||||||
|
|
Loading…
Reference in New Issue