Forum: Mikrocontroller und Digitale Elektronik USB bulk transfer completion


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von A. C. (michael1988)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe das mal in einen getrennten thread gepackt, die andere Frage 
bezieht sich auf Probleme mit der synchronen API.

Meine jetzige Frage:
Ich verwende die asynchrone API der libusb. Dazu starte ich einen 
Transfer und reagiere in der mitgelieferten Callback auf das Ende der 
Übertragung.

Ich frage den Status "LIBUSB_TRANSFER_COMPLETED" ab, um zu prüfen, ob 
der Transfer fetig ist.

Mich wundert etwas die Folgende Notiz: "Note that this does not indicate 
that the entire amount of requested data was transferred."

Ich frage mich deswegen, wann weiss ich eigentlich, wann der bulk 
transfer zu Ende ist?

Folgendes habe ich gefunden:
-The endpoint transfers exactly the amount of data expected.
-The endpoint transfers a short packet, that is a packet with a payload 
size less than the maximum.
-The endpoint transfers a zero-length packet.

Was heißt jetzt aber "exactly the amount of data expected". Wo wird das 
im USB-transfer mit gegeben, wie viele Daten man erwartet? Ich kannte 
bisher nur Fall 2. und 3., also entweder ein short Paket oder ein 
zero-length Paket, mit dem das Device dem Host mitteilen kann, dass nun 
keine Daten mehr kommen.

Viele Grüße

von Clemens L. (c_l)


Bewertung
1 lesenswert
nicht lesenswert
A. C. schrieb:
> Wo wird das im USB-transfer mit gegeben, wie viele Daten man erwartet?
1
struct libusb_transfer {
2
  ...
3
  /** Length of the data buffer */
4
  int length;

Das funktioniert nur, wenn deine Software weiß, wie groß der Transfer 
sein wird.

Am besten hast du eine Pipeline mit mehreren Transfers, deren Länge 
jeweils ein Vielfaches der USB-Paketgröße (64 oder 512 Bytes) ist.

von Georg A. (georga)


Bewertung
1 lesenswert
nicht lesenswert
A. C. schrieb:
> Mich wundert etwas die Folgende Notiz: "Note that this does not indicate
> that the entire amount of requested data was transferred."

Das bezieht sich auf das short-packet vom Device, das den Transfer 
abbricht. Das kann bei einer Pipe-Size von 64 entweder <64 sein oder 
falls es genau aufgeht, eben noch eins mit 0. Auf USB-Ebene gibt es eben 
keine Ankündigung der Länge vom Host aus, damit wird das 
short/zero-packet zum Endemarker. Die Länge in der Struct dient nur der 
Allozierung der DMA-Transfer-Deskriptoren. Die short/zero-packets 
beendet den gesamten gequeuten Transfer, auch wenn da eigentlich mehr 
erwartet wurde. Die Beendigung (normal oder abnormal) wird vom 
Host-Controller im DMA-Deskriptor vermerkt und triggert dann den 
Callback.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.