USB CDC Device - maximale FIFO-Größe?

Gast #5025272
Hi,

meine Frage steht im Zusammenhang mit diesem Posting hier: 
Beitrag "COM-Port Probleme mit Windows 10"

Ich bin auf der Suche nach möglichen Implementierungsfehlern im 
USB-Stack meines Controllers. In dem Zusammenhang habe ich einen etwas 
dubiosen Kommentar bei den vordefinierten FIFO-Größen gefunden.

Deswegen meine Frage: wie groß dürfen Sende- und Empfangs-FIFO bei 
CDC-Devices laut Spezifikation maximal sein?

Danke!
Harstad schrieb:
> Deswegen meine Frage: wie groß dürfen Sende- und Empfangs-FIFO bei
> CDC-Devices laut Spezifikation maximal sein?

Da ist nix spezifiziert. Die kannste so groß machen wie Du möchtest.

Man kann sich aber schön in den Fuß schiessen, wenn man Transaktionen 
mit ganzzahligen Vielfachen von maxPacketSize (Full Speed = 64 Byte) 
anstößt. Die müssen nämlich mit einem Zero Packet abgeschlossen werden, 
sonst "hängt" die Transaktion im Host.

Mit anderen Worten: Die CDC Daten werden genau dann an die Anwendung 
durchgereicht, wenn ein USB Paket < 64 Byte übertragen wurde.

Die Ausname (Anwendung fragt genau 64*x Bytes an) spielt bei CDC keine 
Rolle, da IMHO usbser.sys einen eigenen kleinen FIFO aufmacht - deren 
Größe man nicht beeinflussen kann.

Diese Signalisierung "Ende der Transaktion" via Zero Packet fehlt bei 
den meisten CDC Implementierungen völlig, da bei "echtem" UART Input 
schon die 64 Bytes nicht am Stück anfallen würden.
Gast
OK...in meinem Fall sind 512 Bytes FIFO-Größe angegeben (die ja auch per 
USB-Deskriptor an den Host übertragen werden).

Bringt es überhaupt was, mehr als 64 Bytes FIFO zu verwenden? Von der 
Geschwindigkeit her ja sicher nicht, wenn Pakete sich immer an dieser 
Größe orientieren - und der Host eh' sein eigenes Süppchen kocht...
Harstad schrieb:
> OK...in meinem Fall sind 512 Bytes FIFO-Größe angegeben (die ja auch per
> USB-Deskriptor an den Host übertragen werden).

Ist das ein USB2.0 High Speed Gerät? Bei Full Speed sind nur 64 Byte 
MaxPacketSize erlaubt.

Das ist aber nur die Größe eines USB Daten-Pakets. Bei Bulk Transfers 
werden mehrere Pakete maximaler Größe zu einer Transaktion zusammen 
gefasst.

Harstad schrieb:
> Bringt es überhaupt was, mehr als 64 Bytes FIFO zu verwenden?

Mehrere 64-Byte (oder 512? Byte bei High Speed) Pakete hintereinander 
als eine Transaktion zusammengefasst ist um Größenordnungen schneller 
als auf <64 Byte aufgeteilte Daten. Das hängt auch mit dem Scheduling 
von USB Transaktionen auf dem Host zusammen - er kann neue Daten erst im 
nächsten (Micro-)Frame schedulen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.