FTDI FTD2XX, FT232R, FT2232H – rozmiar pakietu USB, ustawienia transferu, latency
Pytanie
Usb ftd2xx.dll jak wielki pakiet jest przesylany
Odpowiedź Sztucznej Inteligencji
Bezpośrednia odpowiedź na pytanie
- „Rozmiar pakietu” w FTD2XX/D2XX zależy od poziomu, o który pytasz:
• na poziomie fizycznego pakietu USB Bulk:
– USB Full-Speed (większość FT232R/FT231X): maks. 64 B
– USB High-Speed (FT2232H/FT4232H/FT232H): maks. 512 B
– USB SuperSpeed (FT600/FT601 – już nie FTD2XX lecz D3XX): maks. 1024 B
• na poziomie „transferu” sterownika FTDI: domyślnie 4096 B, konfigurowalne 64 B – 65536 B funkcją FT_SetUSBParameters()
.
- Aplikacja może za pomocą
FT_Read/FT_Write
przesyłać dowolnie duże bufory (do 4 GB), a sterownik automatycznie dzieli je na powyższe transfery i nadal głębiej na pakiety 64/512/1024 B.
Kluczowe punkty
- Max-packet-size (MPS) magistrali USB = 64 / 512 / 1024 B.
- Domyślny blok (transfer size) sterownika D2XX = 4 KB.
- Zakres ustawialny przez API = od MPS do 64 KB.
- Wewnętrzne FIFO układu (128 B – 4 KB) + „Latency Timer” decydują, kiedy pakiet faktycznie opuszcza chip.
Szczegółowa analiza problemu
1. Warstwa USB
- Pakiet Bulk (Transaction Layer Packet, TLP) zawiera pola SYNC, PID, 0–MPS bajtów danych i CRC16.
- MPS ustala firmware urządzenia i descriptor endpointu. Układy FTDI Full-Speed zawsze deklarują 64 B, High-Speed 512 B.
- Host może wysłać kilka pakietów z rzędu w jednym mikro-ramku (125 µs HS).
2. Warstwa sterownika FTDI (D2XX/FTD2XX.DLL)
- „USB Transfer” = zlecenie URB do kontrolera hosta; składa się z wielu fizycznych pakietów MPS.
- W Windows domyślny rozmiar URB w sterowniku FTDIBUS to 4 KB (0x1000).
- API
FT_SetUSBParameters(handle, inXferSize, outXferSize)
pozwala:
• min. = MPS (64/512)
• max. = 64 KB (0x10000) – OS X/Win7+; Starsze systemy stabilnie do 32 KB.
- Zmiana rozmiaru transferu wpływa głównie na przepustowość (mniej przerwań USB) i opóźnienie (większy bufor = dłuższe czekanie na zapełnienie).
3. Wewnętrzne bufory układów FTDI
Układ |
Prędkość USB |
RX FIFO |
TX FIFO |
Latency Timer domyślnie |
FT232R/X |
Full-Speed |
128 B |
256 B |
16 ms |
FT232H |
High-Speed |
1 KB |
1 KB |
16 ms |
FT2232H / FT4232H |
High-Speed |
4 KB |
4 KB |
16 ms |
- Bufor wypełniany danymi + upływ LatencyTimer (1–255 ms, konfigurowany
FT_SetLatencyTimer()
) wyzwala przerzut danych do/od hosta.
4. Wywołania API
DWORD wr = FT_Write(h, buf, 16384, &written); // 16 KB
// sterownik: dzieli 16 KB -> cztery URB po 4 KB
// kontroler USB: każdy URB -> 512 B × 8 pakietów = 4096 B
Analogicznie dla odczytu. Prędkość efektywna ~40 MB/s na HS przy optymalnych parametrach.
5. Zależności czasowe
Całkowite opóźnienie = czas zapełnienia FIFO + LatencyTimer + czas przesłania URB + obsługa wątku aplikacji.
Zmniejszenie LatencyTimer z 16 ms do 2 ms i ograniczenie inXferSize
do 1024 B pozwala zejść z ~18 ms do <3 ms kosztem CPU.
Aktualne informacje i trendy
- FTDI od 2023 r. promuje kontrolery FT60x (USB3.0, 5 Gb/s) z biblioteką D3XX – MPS 1024 B oraz transfery do 32 MB.
- W sterowniku D2XX pojawiła się nowsza opcja trybu „Stream Pipe” (Windows 11) upraszczająca potokowanie dużych bloków.
- Coraz częściej wykorzystuje się tryb ISOchronous do audio, ale FTDI pozostaje przy Bulk.
- Trend: redukcja latency przez szybkie bufory DMA w mikro-kontrolerach hosta (XHCI 1.2).
Wspierające wyjaśnienia i detale
- Analogią jest poczta: pakiet USB (64 B) = pojedyncza koperta, URB (4 KB) = worek kopert, wywołanie
FT_Write
(np. 1 MB) = kontener.
- W systemie Linux libftdi/libusb zachowuje się identycznie – parametry URB ustawia
libusb_fill_bulk_transfer()
.
Aspekty etyczne i prawne
- Sterowniki FTDI są objęte licencją EULA; modyfikacja pliku .INF (np. „ConfigData”) nie narusza licencji, o ile nie jest dystrybuowana bez zgody FTDI.
- Uważaj na podróbki układów FTDI – firmware 2014 „zapiekł” fake-ID, ale w nowych driverach to już wycofane.
- Zachowaj zgodność z USB IF przy zmianach descriptorów (Vendor ID).
Praktyczne wskazówki
- Wydajność:
FT_SetUSBParameters(h, 16384, 16384);
+ FT_SetLatencyTimer(h, 2);
- Niskie opóźnienia: transfer = 512 B, Latency ≤ 2 ms – <3 ms round-trip.
- Bufory aplikacyjne: wielokrotność 512 B na HS i 64 B na FS.
- Testuj na różnych koncentratorach – starsze USB 1.1 wymuszają 64 B.
- Przy zrywaniu połączenia użyj
FT_Purge()
przed zamknięciem.
Ewentualne zastrzeżenia lub uwagi dodatkowe
- Starsze kontrolery OHCI/EHCI mają limit URB 4 KB; ustawienie 16 KB powoduje fragmentację i utratę części zysku.
- System Android (ADB over USB) może współdzielić magistralę ‑ obserwuj konflikt priorytetów.
- Maksimum 64 KB w API nie gwarantuje, że sterownik w tle nie podzieli na 4 KB.
Sugestie dalszych badań
- Porównanie D2XX vs. WinUSB (+libusb) pod względem latency.
- Wpływ włączonego
FT_SetFlowControl(…, FT_FLOW_RTS_CTS, …)
na szybkość opróżniania FIFO.
- Analiza pakietów za pomocą USBPcap + Wireshark.
- Migracja do FT60x (USB3) – ocena realnych 400 MB/s.
Krótkie podsumowanie
Rozmiar pojedynczego pakietu USB w układach FTDI to 64 B (Full-Speed) lub 512 B (High-Speed), natomiast sterownik FTD2XX wysyła je w większych transferach – standardowo 4 KB, konfigurowalnych 64 B – 64 KB. Aplikacja może żądać dowolnie dużych bloków, które sterownik automatycznie pakuje w transfery i pakiety. Optymalne ustawienia zależą od wymagań: przepustowość ↔ opóźnienie.
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.