Forum: Mikrocontroller und Digitale Elektronik USB bulk transfer completion


von A. C. (michael1988)


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)


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)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.