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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.