Various improvements for FTDI support
This commit is contained in:
parent
61310bf1a3
commit
8dce9107df
|
@ -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 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)
|
||||
{
|
||||
return SetError(ftdi, -3, "failed to open device");
|
||||
}
|
||||
|
||||
device->ResetDevice();
|
||||
device->SetEventNotification(FT_EVENT_RXCHAR);
|
||||
|
||||
ftdi->type = MapChipType(info.Type);
|
||||
ftdi->usb_dev = reinterpret_cast<struct libusb_device_handle*>(device.release());
|
||||
return 0;
|
||||
|
|
|
@ -135,6 +135,7 @@ namespace LibWinFtdi
|
|||
FAILED(hr = LoadImport(module, "FT_SetLatencyTimer", &FT_SetLatencyTimer)) ||
|
||||
FAILED(hr = LoadImport(module, "FT_GetQueueStatus", &FT_GetQueueStatus)) ||
|
||||
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_Write", &FT_Write)))
|
||||
{
|
||||
|
@ -164,6 +165,7 @@ namespace LibWinFtdi
|
|||
auto proc = GetProcAddress(module, lpProcName);
|
||||
if (proc == nullptr)
|
||||
{
|
||||
*ptr = nullptr;
|
||||
return HRESULT_FROM_WIN32(GetLastError());
|
||||
}
|
||||
|
||||
|
@ -182,13 +184,14 @@ namespace LibWinFtdi
|
|||
FT_STATUS(WINAPI* FT_ResetDevice)(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_Purge)(FT_HANDLE ftHandle, ULONG Mask) = nullptr;
|
||||
FT_STATUS(WINAPI* FT_SetTimeouts)(FT_HANDLE ftHandle, ULONG ReadTimeout, ULONG WriteTimeout) = nullptr;
|
||||
FT_STATUS(WINAPI* FT_SetBaudRate)(FT_HANDLE ftHandle, ULONG BaudRate) = nullptr;
|
||||
FT_STATUS(WINAPI* FT_Purge)(FT_HANDLE ftHandle, DWORD dwMask) = nullptr;
|
||||
FT_STATUS(WINAPI* FT_SetTimeouts)(FT_HANDLE ftHandle, DWORD dwReadTimeout, DWORD dwWriteTimeout) = 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_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_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_Write)(FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten) = nullptr;
|
||||
};
|
||||
|
@ -316,34 +319,34 @@ namespace LibWinFtdi
|
|||
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()))
|
||||
{
|
||||
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()))
|
||||
{
|
||||
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()))
|
||||
{
|
||||
return FT_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
return FT_SetBaudRate(m_handle, BaudRate);
|
||||
return FT_SetBaudRate(m_handle, dwBaudRate);
|
||||
}
|
||||
|
||||
FT_STATUS SetBitMode(UCHAR ucMask, UCHAR ucEnable)
|
||||
|
@ -356,14 +359,14 @@ namespace LibWinFtdi
|
|||
return FT_SetBitMode(m_handle, ucMask, ucEnable);
|
||||
}
|
||||
|
||||
FT_STATUS SetLatencyTimer(UCHAR ucLatency)
|
||||
FT_STATUS SetLatencyTimer(UCHAR ucTimer)
|
||||
{
|
||||
if (FAILED(Load()))
|
||||
{
|
||||
return FT_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
return FT_SetLatencyTimer(m_handle, ucLatency);
|
||||
return FT_SetLatencyTimer(m_handle, ucTimer);
|
||||
}
|
||||
|
||||
FT_STATUS GetQueueStatus(DWORD* dwRxBytes)
|
||||
|
@ -391,6 +394,16 @@ namespace LibWinFtdi
|
|||
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)
|
||||
{
|
||||
if (FAILED(Load()))
|
||||
|
|
Loading…
Reference in New Issue