but I would be interested in this answer also :)
As I remember, we did some project where we do changes for FTDI latency parameter:
#ifdef Q_OS_WIN
// Возвращает указатель реестра для устройства с заданным именем,
// если оно является последовательным портом FTDI, либо 0.
HKEY openFtdiDeviceParameters(const QString &portName)
{
const wchar_t *keypath = L"SYSTEM\\CurrentControlSet\\Enum\\FTDIBUS";
HKEY key;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, keypath, 0, KEY_READ, &key)) {
// Порты FTDI отсутствуют.
return 0;
}
// Просматриваем все порты FTDI.
int idx = 0;
HKEY readOnlyKey = 0;
HKEY paramKey = 0;
while (true) {
if (paramKey) {
RegCloseKey(paramKey);
paramKey = 0;
}
DWORD subkeySize = 140;
wchar_t subKey[140] = {0};
// Последовательный порт не является устройством FTDI.
if (RegEnumKeyEx(key, idx++, subKey, &subkeySize, 0, 0, 0, 0)) {
break;
}
QString paramPath(QString(QLatin1String("%1\\0000\\Device Parameters")).arg(QString::fromWCharArray(subKey)));
if (RegOpenKeyEx(key, paramPath.toStdWString().c_str(), 0, KEY_READ, &readOnlyKey)) {
continue;
}
DWORD regPortNameSize = 20;
wchar_t regPortName[20] = {0};
DWORD type = 0;
LONG result = RegQueryValueEx(readOnlyKey, L"PortName", 0, &type, (LPBYTE) ®PortName, ®PortNameSize);
if (ERROR_SUCCESS == result) {
QString name = QString::fromWCharArray(regPortName);
if (portName == name) {
RegOpenKeyEx(readOnlyKey, 0, 0, KEY_READ | KEY_SET_VALUE, ¶mKey);
}
}
RegCloseKey(readOnlyKey);
if (paramKey) {
break;
}
}
RegCloseKey(key);
return paramKey;
}
#endif
and then:
#ifdef Q_OS_WIN
// Если выбранный порт является FTDI, устанавливаем его latency в 1.
DWORD latency = 0;
HKEY latencyKey = openFtdiDeviceParameters(name);
DWORD dwType = 0;
DWORD dwSize = sizeof(DWORD);
bool foundFtdiDevice;
if (latencyKey && !RegQueryValueEx(latencyKey, L"LatencyTimer", 0, &dwType, (LPBYTE) &latency, &dwSize)
&& dwType == REG_DWORD) {
foundFtdiDevice = true;
} else {
foundFtdiDevice = false;
}
if (foundFtdiDevice) {
if (latency != 1) {
DWORD dwLatency = 1;
RegSetValueEx(latencyKey, L"LatencyTimer", 0, REG_DWORD, (LPBYTE) &dwLatency, sizeof(DWORD));
RegCloseKey(latencyKey);
}
}
#endif
Here we did set the latency to 1 msec.
PS: Sorry, all comments in russian (because it is copy-paste).