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.
                
                
                
                    
                        Zadaj dodatkowe pytanie Sztucznej Inteligencji