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

  1. Max-packet-size (MPS) magistrali USB = 64 / 512 / 1024 B.
  2. Domyślny blok (transfer size) sterownika D2XX = 4 KB.
  3. Zakres ustawialny przez API = od MPS do 64 KB.
  4. 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

  1. Wydajność: FT_SetUSBParameters(h, 16384, 16384); + FT_SetLatencyTimer(h, 2);
  2. Niskie opóźnienia: transfer = 512 B, Latency ≤ 2 ms – <3 ms round-trip.
  3. Bufory aplikacyjne: wielokrotność 512 B na HS i 64 B na FS.
  4. Testuj na różnych koncentratorach – starsze USB 1.1 wymuszają 64 B.
  5. 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.

Oceń odpowiedź: 1
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.